2016-03-28 40 views
0

我是一名初學者,我想用generate塊編寫一個紋波進位加法器。所以我寫了以下模塊:使用verilog生成所有輸出的紋波進位加法器X

module ripple_carry_adder(ia, ib, ci, so, co); 

parameter N = 32; 
input[N-1:0] ia; 
input[N-1:0] ib; 
input ci; 
output[N-1:0] so; 
output co; 

wire [N:0] carry; 
assign carry[0] = ci; 

genvar j; 
generate for(j = 0; j < N; j = j + 1) 
begin:r_loop 
    wire t1, t2, t3; 
    xor g1(t1, ia[i], ib[j]); 
    xor g2(so[j], t1, carry[j]); 
    and g3(t2, ia[i], ib[j]); 
    and g4(t3, t1, carry[j]); 
    or g5(carry[j+1], t2, t3); 
end 
endgenerate 

assign co = carry[N]; 
endmodule 

而且測試臺模塊:

`include "ripple_carry_adder.v" 
`timescale 1ns/1ps 
module ripple_carry_adder_tb; 

parameter N = 32; 

reg clk; 
reg[N-1:0] a, b; 
wire[N-1:0] sum; 
reg cin; 
wire cout; 

ripple_carry_adder rca(.ia(a), .ib(b), .ci(cin), .so(sum), .co(cout)); 
initial begin 
    #10; 
    a = 0; 
    b = 0; 
    cin = 0; 
    clk = 0; 
    #10; 
end 

always @(posedge clk) 
begin 
    #50; 
    #1 a <= $random() % 1000000; 
    #1 b <= $random() % 1000000; 
end 

always @(a or b) 
    #5 $display("%d + %d = %d", a, b, sum); 

always #5 clk = ~clk; 

endmodule 

但我得到了與未知的所有位的結果: result

我白白花了1小時嘗試找到錯誤。你可以幫我嗎?

+4

的'i'在'IA得到default_nettype更多詳情[I]'是不確定的。未定義的變量推斷出單個位線。也許你的意思是'j'? – Greg

+0

天啊!非常感謝 ! –

+0

但是很奇怪,這個編譯器甚至沒有提示一個警告:( –

回答

1

正如我的評論所述,ia[i]中的i未定義。將其更改爲j應該可以獲得所需的功能。 Verilog會將任何未聲明的變量視爲單個位線,這被認爲是正常的,並且您很少會收到警告。一些模擬器可以選擇標記未聲明的變量。在IEEE Std 1364-2001(又名Verilog-2001)中增加了一個univeral選項。您可以使用`define_nettype宏覆蓋默認的網絡類型。通過將其設置爲none,必須明確聲明宏聲明後的所有網絡。您可以通過閱讀IEEE標準1364-2001 § 19.2 `default_nettypeIEEE Std 1800-2012 § 22.8 `default_nettype

+0

非常感謝你!我從你的詳細的答案中學到了很多東西! –

+0

我在源代碼開頭添加了「default_nettype none」,它工作正常。不幸的是,在這種情況下,我不得不添加一些額外的「電線」。我不能吃我的蛋糕和吃它:( –

+0

你可以把'''default_nettype線''放在其他文件的頭部以恢復只要不要瘋狂地把宏放到任何地方,它就會成爲調試任何東西的噩夢。 – Greg