2014-02-24 23 views
2

我想在verilog中爲進位選擇加法器創建一個模塊。除了以下導致編譯錯誤的部分,一切正常。<<module name>>不是verilog中的任務或void函數

module csa(a,b,s,cout); 
input[15:0] a,b; 
output [15:0] s; 
output cout; 
wire zero_c1, zero_c2,zero_c3,zero_c4,zero_c5; 
wire one_c1, one_c2,one_c3,one_c4,one_c5; 
wire temp_c1,temp_c2,temp_c3,temp_c4,temp_c5; 
wire [15:0] s_zero, s_one; 

initial 
begin 
fork 
    fa(s[0], temp_c1,a[0],b[0],0); 
    fa_one(s_zero[1],s_one[1],zero_c1,one_c1,a[1],b[1]); 
    fa_two(s_zero[3:2],s_one[3:2],zero_c2,one_c2,a[3:2],b[3:2]); 
    fa_three(s_zero[6:4],s_one[6:4],zero_c3,one_c3,a[6:4],b[6:4]); 
    fa_four(s_zero[10:7],s_one[10:7],zero_c4,one_c4,a[10:7],b[10:7]); 
    fa_five(s_zero[15:11],s_one[15:11],zero_c5,one_c5,a[15:11],b[15:11]); 
join 
end 

當我嘗試編譯它說 -

模塊 「FA」, 「fa_one」 不是一個任務或void函數

我刪除了 「初始」聲明,現在它說 -

「叉」附近的語法錯誤,期待「endmodule」

我只是想在並行和連接之間運行代碼。我也確認模塊fa,fa_one正常工作。

希望如果有人能幫我指出我在這裏做錯了什麼。謝謝。

回答

1

fork用於並行運行模塊內的過程語句。獨立模塊實例始終並行運行。

子模塊直接在其父模塊中實例化,而不在用於過程語句的initial,beginfork之內。因此,您可以刪除initial,begin,fork,joinend,並在最後添加endmodule

+0

謝謝。我修改了代碼。現在編譯好了。只是一個問題。所以「fa」,「fa_one」的所有實例現在都會並行運行?如果它們之間有某種關係(例如fa_one使用fa的輸出)會怎麼樣? – DataEnthusiastic

+0

是的,所有實例都將並行運行。它取決於你如何編寫模塊,但是如果它們只包含原語和/或連續賦值,那麼只要輸入改變就會重新計算輸出。 – mark4o

3

Verilog模塊不運行或執行,但實例化,它們表示硬件的物理塊。

除非您花時間分享硬件,否則一切都是平行的。例如,你可能編寫一個ALU核心,它只存在一次,但是使用程序ROM來告訴它每個時鐘週期處理哪個指令。

在模塊內部,您可以使用組合代碼和順序代碼。

組合邏輯將在0時間內模擬,但實際需要一些時間才能將值放置在實際設備上時傳播。

如果沒有考慮到這種傳播延遲,並且創建了非常大的邏輯塊,則由於邏輯的建立時間大於組合邏輯兩端的時鐘速度,您將難以關閉合成時序。

連續邏輯意味着結果保存在觸發器中,只在時鐘邊沿更新。這意味着時序邏輯鏈可能花費許多時鐘週期來傳播數據。

當流水線化處理器時,用觸發器打破各個部分,給每個部分一個完整的時鐘週期用於組合傳播,代價是需要幾個時鐘週期來計算單個結果。

要糾正你的榜樣,你只想有:

module csa(
    input [15:0] a, 
    input [15:0] b, 
    output [15:0] s, 
    output  cout 
); 
wire zero_c1, zero_c2,zero_c3,zero_c4,zero_c5; 
wire one_c1, one_c2,one_c3,one_c4,one_c5; 
wire temp_c1,temp_c2,temp_c3,temp_c4,temp_c5; 
wire [15:0] s_zero, s_one; 

fa  ufa(s[0], temp_c1,a[0],b[0],0); 
fa_one ufa_one(s_zero[1],s_one[1],zero_c1,one_c1,a[1],b[1]); 
fa_two ufa_two(s_zero[3:2],s_one[3:2],zero_c2,one_c2,a[3:2],b[3:2]); 
fa_three ufa_three(s_zero[6:4],s_one[6:4],zero_c3,one_c3,a[6:4],b[6:4]); 
fa_four ufa_four(s_zero[10:7],s_one[10:7],zero_c4,one_c4,a[10:7],b[10:7]); 
fa_five ufa_five(s_zero[15:11],s_one[15:11],zero_c5,one_c5,a[15:11],b[15:11]); 
endmodule 

注:這是module_name #(parameters) instance_name (ports);

+0

謝謝。我糾正了,現在編譯好了。 – DataEnthusiastic

+1

@ user2813436沒問題,提出有用答案並接受最好(最有用)是一個好主意。低問題接受比例可能會讓人們回答未來的問題。 – Morgan

+0

我試圖upvote你的答案。但不幸的是,我有太低評分upvote答案:( – DataEnthusiastic

相關問題