2014-04-21 137 views
2

- 使用Modelsim 10.2d以verilog编写此代码。下面的错误表明{cout,l3}赋值存在一些问题。连续分配verilog

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. 

回答

5

wire不能在initialalways块内进行分配。您应该将类​​型更改为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 
1

代码中会出现一些问题。 1.

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

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

2.错误代码中的

您可以始终块(准连续分配)内赋值,但LHS必须是register.This是Verilog的高级特性,我强烈建议你不要使用it.FOr简单,不要用在分配总是块和块中的所有任务应该是寄存器(即左)

修改了代码

wire[31:0] l1,l2; 

...

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