2016-06-01 89 views
0

這段代碼描述了這個表達式 - >(a+b)(c+d)。我使用了兩個總和,首先總結a和b,然後總結c和d。然後再增加一個結果。不幸的是,我對Verilog非常不滿,所以我無法理解哪裏出了問題。告訴我這個代碼有什麼問題

module automate(a,b,c,d,clk,start,result,ready); 
    parameter n=8; 
    input [7:0] a,b,c,d; 
    input start,clk; 
    output reg[17:0] result; 
    output reg ready; 
    reg[7:0] ra; 
    reg[7:0] rb; 
    reg[7:0] rc; 
    reg[7:0] rd; 
    reg[8:0] sm1; 
    reg[8:0] sm2; 
    reg[8:0] acc,q; 

    [email protected](posedge start) 
    begin 
    ra=a; 
    rb=b; 
    rc=c; 
    rd=d; 

    sm1=ra+rb; 
    sm2=rc+rd; 

    q=sm2; 
    acc=0; 
    ready=0; 

    repeat(9) 
    begin 
     @(posedge clk) 
     if(q[0]) 
     acc=acc+sm1; 
     else 
     acc=acc; 
     q=q>>1; 
     q[8] = acc[0]; 
     acc=acc>>1; 
    end 

    ready=1; 
    result={acc[8:0],q}; 
    end 

endmodule 

測試平臺:

module test_bench; 
reg[7:0] a,b,c,d; 
reg clk,start; 
wire ready; 
wire[17:0] result; 

automate res(a,b,c,d,clk,start,result,ready); 
initial begin 
    start = 0; 
    clk=0; 

    a=8'd7; 
    b=8'd5; 
    c=8'd9; 
    d=8'd3; 

    #30 start = 1; 
    wait(ready); 
    #20 start = 0; 

    #500 $finish; 
end 

always #10 clk=~clk; 

endmodule 

但這裏是我得到:

+0

https://www.dropbox.com/s/1w6qbrmrj22f4gs/Untitled.png?dl=0 – Tatev

+0

我的猜測是你模擬模塊自動化,而不是測試臺。 –

+0

謝謝你的回覆。是的,你是對的,我模擬模塊自動化...是不是錯誤?當我添加到wave testbench時,出現錯誤 - > https://www.dropbox.com/s/1w6qbrmrj22f4gs/Untitled.png?dl=0。你能告訴我該怎麼辦? – Tatev

回答

0

你的代碼是工作的罰款爲每@Matthew泰勒!!,

仿真是可能不是TB,因爲它是頂級模塊,沒有東西被驅動到DUT所以你的信號是XZ

..... 
automate res(a,b,c,d,clk,start,result,ready); 
initial begin 
    $monitor (result, res.sm1, res.sm2); // added monitor system task 
    start = 0; 
..... 

而且只要運行它,你會看到,然後輸出如下,

#  x x x 
#  x 12 12 
# 144 12 12 

即使這樣,我還想說,你正在編寫HDL代碼,一個真正的硬件,所以不要使用repeat,使用循環。

如果您的要求只是(A+B)/(C+D)那麼沒有使用時鐘。

對於另外,

[email protected](*) 
    begin 
    ra = 0; 
    rb = 0; 
    rc = 0; 
    sm1 = 0; 
    sm2 = 0; 
    result = 0; 

    if(start) begin 
     ra = a; 
     rb = b; 
     rc = c; 
     rd = d; 

     sm1 = ra + rb; 
     sm2 = rc + rd; 

     result = product(sm1, sm2); 
    end 
    end 

對於功能product這將成倍sm1sm2就可以了,

function [17:0] product; 
    input [8:0] multiplier, multiplicand; 

    integer i; 

    begin 
     product = 0; 
     for(i=0; i<17; i=i+1) 
     if(multiplier[i] == 1'b1) 
      product = product + (multiplicand << i); 
    end 
    endfunction 

所以我覺得開始,並準備將在同一週期內有效。截至目前,代碼中沒有順序邏輯。

希望這會幫助你。

編輯:

你的第二個問題,請使用以下命令成績單:

vsim -novopt -c -do "add wave -r /*; run -all;" work.test_bench 

add wave -r /* 

run -all 
+0

非常感謝您的回覆。對不起,你能解釋一下「沒有任何東西被驅動到DUT」嗎? – Tatev

+0

如果您不運行測試臺,連接到您的設計模塊的輸入不會被驅動並且保持未連接狀態,因此結果爲「沒有任何東西被驅動到DUT(被測設計)」 –

+0

非常感謝!有用!!!寫成文稿命令後,它開始工作! – Tatev

相關問題