2014-04-21 177 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;