如何在Verilog中的“always”定义中使用输入值

时间:2016-11-08 16:48:45

标签: verilog quartus

我在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不是   恒定

我该如何解决? 谢谢)

2 个答案:

答案 0 :(得分:0)

即使您的向量总是1个字节宽,该工具也会将其理解为可变大小,并且不知道如何处理它。 (您还在向量选择中反转了索引temp*8temp*8+8

另一种方法是使用移位运算符

OUT = INPUT >> (temp*8);

这应该有效,因为OUT8*temp INPUT {{1}}移位的低8位

答案 1 :(得分:0)

INPUT[temp*8 : temp*8+8]不起作用,因为:范围语法要求双方都是常量 你想要的是使用+:数组切片:INPUT[temp*8 +: 8] +:的左侧允许变量并表示起始索引。右边是宽度,必须是常数。有关+:的更多信息,请参阅Indexing vectors and arrays with +:

其他问题:

  1. 从敏感度列表中删除temp
  2. temp需要分配给某些内容
  3. OUT应分配非阻塞(<=)非阻塞(=),因为它是顺序逻辑。
  4. always @(posedge ICLK) // no temp in sensitivity list
    begin
      if (IENBL)
      begin
        OUT <= INPUT[temp*8 +: 8]; // non-blocking and +:
      end
    end