如何在 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*8temp*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 +:

其他问题:

  1. 从敏感列表中删除 temp
  2. temp 需要分配给某物
  3. OUT 应该分配给非阻塞 (<=) 而不是阻塞 (=) 因为它是顺序逻辑。

always @(posedge ICLK) // no temp in sensitivity list
begin
  if (IENBL)
  begin
    OUT <= INPUT[temp*8 +: 8]; // non-blocking and +:
  end
end