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.
4

2 回答 2

6

wire不能在initialoralways块内赋值。您应该将类​​型更改为reg.

初始块只会在模拟开始时运行一次,不会持续评估,因此您应该使用它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
于 2014-04-21T18:54:44.037 回答
1

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

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

连续赋值的主要规则是 LHS 必须是一个网络。这条规则的原因是寄存器在离散时间获取值,但网络总是由值驱动。对网络的更改可能异步发生。

2.代码中的错误

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

更改您的代码

wire[31:0] l1,l2;

...

if(bin == 1'b0)
   {cout,l3} = a + b + cin;
else
   {cout,l3} = a - b + cin;
于 2014-04-21T23:54:19.557 回答