Verilog HDL编译器:246-“;numop.v“;第28行参考向量reg';numopout';不是合法的净左值

Verilog HDL编译器:246-“;numop.v“;第28行参考向量reg';numopout';不是合法的净左值,verilog,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

在这个模块中,我将验证按钮,并将一个值分配给另一个变量,然后将其发送给另一个模块,该模块将返回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是一种按位或运算。灵敏度列表使用<代码>或<代码>(由于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标准1364-2001或更新)

可简化为:

  • 始终@(btn1或btn2或numopin)
    (IEEE标准1364-1995及更新版本)
  • 始终@(btn1、btn2、numopin)
    (IEEE标准1364-2001及更新版本)
  • 建议使用
    始终@*
    (IEEE标准1364-2001及更新版本)
@*
(或
@(*)
)是一个自动灵敏度列表;在IEEE标准1364-2001中增加。组合块中引用且未分配的任何信号都被视为输入
@*
是使用always块描述组合逻辑的重新开始等待(除非您严格遵守IEEE Std 1364-1995)


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

设计指南:同步触发器逻辑仅使用
posedge
negedge

一种解决方案(变化最小)是:

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


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

它进行编译,但它说我必须配置时钟,我不希望它是时钟,我只想按下一个按钮,信号进入我的模块。听起来你在设计中推断出一个锁存器,并试图在没有锁存器的FPGA上运行。闩锁是由于缺少指定而导致的。例如,
if(btn1)。。。else if(btn2).
缺少一个
else
。如果
btn1
btn2
都较低,则没有定义
numpout
应该是什么值;假定保持先前的(闩锁)。不完整的case语句也可能发生同样的情况。我为if和case添加了缺失的赋值,但它一直告诉我btn1是一个时钟信号。我添加了一个if(btn1==1)else if(btn1==0)else if(btn2==1)else if(btn2==0)and else。您不需要额外的
else if
,只需要一个
else
。请用您的实际代码更新您的问题。已更新。我更改了代码并尝试使用另一个逻辑,但现在它给了我另一个错误。
numopout
应定义为
wire
,而不是
reg
always @ (btn1, btn2, numopin[0], numopin[1], numopin[2], numopin[3])
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