在Verilog中转换wire值以进行进一步处理

在Verilog中转换wire值以进行进一步处理,verilog,hdl,Verilog,Hdl,我是Verilog的新手 我编写了将导线值转换为整数的代码: wire [31:0] w1; integer k; always @ (w1) k = w1; 资料来源: 现在,对于下一部分,我得到一个错误 wire [63:0] w2; // Suppose it contains some value wire [63:0] w3; assign w3[k-1:0] = w2[k-1:0]; // ERROR in this line ERROR : k is not a constan

我是Verilog的新手

我编写了将导线值转换为整数的代码:

wire [31:0] w1;
integer k;
always @ (w1) k = w1;
资料来源:

现在,对于下一部分,我得到一个错误

wire [63:0] w2; // Suppose it contains some value
wire [63:0] w3;
assign w3[k-1:0] = w2[k-1:0]; // ERROR in this line

ERROR : k is not a constant.

如何解决此问题?

Verilog要求部分选择(代码类似于选择向量的一部分)为常量。访问一组大小可变的位需要更复杂的东西。以下是一种方法:

wire [63:0] src;
wire [6:0] k;

wire [127:0] mask = { { 64 { 1'b0 } }, { 64 { 1'b1 } } } << k;

wire [63:0] dest;

assign dest = mask[127:64] & src;
wire[63:0]src;
金属丝[6:0]k;

wire[127:0]mask={{64{1'b0}},{64{1'b1}}}Verilog要求部分选择(类似于
[msb:lsb]
的代码选择向量的一部分)是常量。访问一组大小可变的位需要更复杂的东西。以下是一种方法:

wire [63:0] src;
wire [6:0] k;

wire [127:0] mask = { { 64 { 1'b0 } }, { 64 { 1'b1 } } } << k;

wire [63:0] dest;

assign dest = mask[127:64] & src;
wire[63:0]src;
金属丝[6:0]k;

wire[127:0]mask={{64{1'b0}},{64{1'b1}}}Verilog 2001中的part select操作符对于您想要实现的目标可能很有用

基本上,verilog允许起始索引是可变的,但需要分配的宽度是恒定的。“+:”运算符表示从索引值向上计数,反之亦然,表示“-:”

你可以这样做, 分配w3[k-1-:8]=w2[k-1-:8];//其中8位向下复制

在下面的文档中搜索“+:”。


注意,通常情况下,可变部分选择被认为是错误的verilog。

verilog 2001中的部分选择运算符对于您想要实现的目标可能很有用

基本上,verilog允许起始索引是可变的,但需要分配的宽度是恒定的。“+:”运算符表示从索引值向上计数,反之亦然,表示“-:”

你可以这样做, 分配w3[k-1-:8]=w2[k-1-:8];//其中8位向下复制

在下面的文档中搜索“+:”。


注意,通常情况下,可变部分选择被认为是错误的verilog。

我不确定您在这里要做什么。您是否试图将可变数量的LSB从
w2
复制到
w3
?是的。导线w1是提供某些值的输入。该值表示要考虑导线w2的LSB数量。有可能这样做吗?我不知道你想在这里做什么。您是否试图将可变数量的LSB从
w2
复制到
w3
?是的。导线w1是提供某些值的输入。该值表示要考虑导线w2的LSB数量。有可能这样做吗?