HDLC编译器:246 - “numop.v”第28行引用向量reg'numopout'不是合法的净值左值

时间:2015-05-26 15:40:58

标签: verilog

在这个模块中,我正在验证按钮并为另一个变量赋值并将其发送到另一个模块,该模块返回numopout输出的值。 但它说它不是合法的净值,我不知道这意味着什么。

module numop(
input btn1,
input btn2,
input [3:0] numopin,
output reg [3:0] numopout
);
 reg [1:0] aux;
 loco locovox(aux,numopin,numopout);
always @ (posedge btn1,posedge btn2)
begin
    if((btn1 == 1)&&(btn2 == 0))
        aux = 2'b11;
    else if((btn1 == 0)&&(btn2 == 1))
        aux = 2'b10;
    else if((btn2 == 0)&&(btn1 == 0))
        aux = 2'b01;
    else if((btn2 == 1)&&(btn1 == 1))
        aux = 2'b00;
    else
        aux = 2'b00;
end

endmodule

1 个答案:

答案 0 :(得分:0)

|是一个按位或操作。敏感度列表使用or(因为也支持Verilog-2001 ,)。因此:

always @ (btn1 | btn2 | numopin[0] | numopin[1] | numopin[2] | numopin[3])

应该是:

always @ (btn1 or btn2 or numopin[0] or numopin[1] or numopin[2] or numopin[3])

或(如果是IEEE Std 1364-2001或更新版本)

always @ (btn1, btn2, numopin[0], numopin[1], numopin[2], numopin[3])

可以简化为:

  • always @(btn1 or btn2 or numopin)(IEEE Std 1364-1995及更新版)
  • always @(btn1, btn2, numopin)(IEEE Std 1364-2001及更新版)
  • always @*(IEEE Std 1364-2001及更新版)推荐

@*(或@ (*))是一个自动敏感列表;在IEEE Std 1364-2001中添加。组合块中引用但未分配的任何信号都被视为输入。 @*是用始终阻塞来描述组合逻辑的重新开始等待(除非您严格遵循IEEE Std 1364-1995)。

灵敏度列表中的

posedgenegedge用于可合成触发器或非可合成行为建模。如果您有两个(或更多)边沿,智能(高级)合成器将假定过程代码中使用的灵敏度列表中的任何信号都是异步的。简单会将第一个信号视为同步信号,将其他信号视为异步信号。

DESIGN GUIDELINE:仅使用posedgenegedge作为同步触发器逻辑。

一个解决方案(变化很小)是:

always @ (btn1 or btn2)
begin
    if((btn1 == 1'b1)&&(btn2 == 1'b0))
        aux = 2'b11;
    else if((btn1 == 1'b0)&&(btn2 == 1'b1))
        aux = 2'b10;
    else if((btn2 == 1'b0)&&(btn1 == 1'b0))
        aux = 2'b01;
    else // this 'else' handles '(btn2 == 1'b1)&&(btn1 == 1'b1)' for you
        aux = 2'b00;
end

但您可以将代码(相同的合成输出)简化为:

always @* begin
  case({btn2,btn1})
    2'b00 : aux = 2'b01;
    2'b01 : aux = 2'b11;
    2'b10 : aux = 2'b10;
    default : aux = 2'b00;
  endcase
end

仅供参考:比较btn1 == 1btn2 == 0也是一种不好的做法。这是因为10被认为是32位值,您应该得到综合警告。最好是明确:btn1 == 1'b1btn2 == 1'b0