我在Verilog中使用输入值时遇到了问题。 我写道:
module reg_vector (INPUT, ICLK, IENBL, NR, OUT);
parameter k = 6;
parameter n = 3;
input [(8*k)-1:0] INPUT;
input ICLK;
input IENBL;
input [n-1:0] NR;
reg [n-1:0] temp;
output reg [7:0] OUT;
always@ (temp, posedge ICLK)
begin
if (IENBL)
begin
OUT = INPUT[temp*8 : temp*8+8];
end
end
endmodule
但得到了错误:
错误(10734):reg_vector.v(25)处的Verilog HDL错误:temp不是 恒定
我该如何解决? 谢谢)
答案 0 :(得分:0)
即使您的向量总是1个字节宽,该工具也会将其理解为可变大小,并且不知道如何处理它。 (您还在向量选择中反转了索引temp*8
和temp*8+8
)
另一种方法是使用移位运算符
OUT = INPUT >> (temp*8);
这应该有效,因为OUT
将8*temp
INPUT
{{1}}移位的低8位
答案 1 :(得分:0)
INPUT[temp*8 : temp*8+8]
不起作用,因为:
范围语法要求双方都是常量
你想要的是使用+:
数组切片:INPUT[temp*8 +: 8]
+:
的左侧允许变量并表示起始索引。右边是宽度,必须是常数。有关+:
的更多信息,请参阅Indexing vectors and arrays with +:
其他问题:
temp
。temp
需要分配给某些内容OUT
应分配非阻塞(<=
)非阻塞(=
),因为它是顺序逻辑。
always @(posedge ICLK) // no temp in sensitivity list
begin
if (IENBL)
begin
OUT <= INPUT[temp*8 +: 8]; // non-blocking and +:
end
end