连续赋值Verilog

3

-这段代码是使用Modelsim 10.2d编写的verilog代码。下面的错误表明{cout,l3}赋值存在问题。

module alu(a,b,bin,cin,op,cout,res);
input [31:0] a,b;
input [1:0] op;
input bin,cin;
reg [31:0] l1,l2,l3;
output cout;
output [31:0] res;

assign l1 = a & b;
assign l2 = a | b;

initial
if(bin == 1'b0)
  assign {cout,l3} = a + b + cin;
else
  assign {cout,l3} = a - b + cin;

mux4to1(l1,l2,l3,op,res);
endmodule

Error-
v(14): LHS in procedural continuous assignment may not be a net: cout.
v(16): LHS in procedural continuous assignment may not be a net: cout.
2个回答

6

wire 不能在 initialalways 块内被赋值。你应该将类型更改为 reg

initial 块仅在仿真开始时运行一次,不会持续评估,因此应改用 always

//...
output reg cout;
//...

always @* begin
  if(bin == 1'b0) begin
    {cout,l3} = a + b + cin;
  end
  else begin
    {cout,l3} = a - b + cin;
  end
end

1

您的代码还有一些问题。 1.

assign l1 = a & b;
assign l2 = a | b;

连续赋值的主要规则是左侧必须是一个网。这个规则的原因是寄存器在离散时间获取值,但网始终受到值的驱动。对网的更改可能会异步发生。

2. 代码中的错误

你可以在always块中(准连续赋值)分配值,但是左侧必须是一个寄存器。这是Verilog中的高级功能,我强烈建议您不要使用它。为了简单起见,在always块中不要使用assign,并且块中的所有赋值都应该是寄存器(即LHS)。

你的代码变更

wire[31:0] l1,l2;

...

if(bin == 1'b0)
   {cout,l3} = a + b + cin;
else
   {cout,l3} = a - b + cin;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接