如何在 Verilog 中使用 "always" 定义中的输入值
How to use the input's values in "always" definiton in Verilog
我在 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
但是出现错误:
Error (10734): Verilog HDL error at reg_vector.v(25): temp is not a
constant
我该如何解决?
谢谢)
即使您的向量始终为 1 字节宽,该工具也会将其理解为可变大小并且不知道如何处理它。 (您还在矢量选择中反转了索引 temp*8
和 temp*8+8
)
另一种方法是使用移位运算符
OUT = INPUT >> (temp*8);
这应该可以工作,因为 OUT
会将 INPUT
的低 8 位移位 8*temp
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
我在 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
但是出现错误:
Error (10734): Verilog HDL error at reg_vector.v(25): temp is not a constant
我该如何解决? 谢谢)
即使您的向量始终为 1 字节宽,该工具也会将其理解为可变大小并且不知道如何处理它。 (您还在矢量选择中反转了索引 temp*8
和 temp*8+8
)
另一种方法是使用移位运算符
OUT = INPUT >> (temp*8);
这应该可以工作,因为 OUT
会将 INPUT
8*temp
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