2016-06-01 8 views
0

Dieser Code beschreibt diesen Ausdruck ->(a+b)(c+d). Ich benutzte 2 Summierer, um zuerst a und b und dann c und d zu addieren. Und dann noch eins, um die Ergebnisse zu multiplizieren. Leider bin ich bei Verilog wirklich schlecht, daher kann ich nicht verstehen, was falsch ist.Sagen Sie mir, was mit diesem Code nicht stimmt

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 

Prüfstand:

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 

aber hier ist, was ich bekommen:

+0

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

+0

Meine Vermutung ist, dass Sie das Modul automatisieren, nicht die Testbench. –

+0

Vielen Dank für Ihre Antwort. Ja, Sie haben Recht, ich simuliere das Modul automatisieren ... ist es falsch? Ich erhalte einen Fehler, wenn ich Wave Testbench hinzufüge -> https://www.dropbox.com/s/1w6qbrmrj22f4gs/Untitled.png?dl=0. Könnten Sie mir bitte sagen, was ich tun soll? – Tatev

Antwort

0

Ihr Code funktioniert gut wie pro @Matthew Taylor !!,

Simulation ist möglicherweise nicht von TB, wie es oberste Modul ist, wird nichts zu DUT so Ihre Signale sind X und Z.

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

Und es einfach laufen, werden Sie sehen dann als unten,

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

Auch wenn, würde ich sagen, Sie HDL-Code schreiben, eine echte Hardware so nicht verwenden repeat, verwenden Sie für Schleife.

Und wenn Ihre Anforderung nur (A+B)/(C+D) ist, dann gibt es keine Verwendung der Uhr.

Für hinaus

[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 

Für Funktion product die sm1 und sm2 vermehren kann,

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 

Also ich denke, Start- und bereit wäre auf demselben Zyklus geltend gemacht werden. In Ihrem Code ist keine sequentielle Logik enthalten.

Hoffe, das wird Ihnen helfen.

Edit:

für Ihr zweites Problem, verwenden Sie folgende Transkript Befehle:

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

add wave -r /* 

run -all 
+0

Vielen Dank für Ihre Antwort. Sorry, aber könntest du erklären was bedeutet "nichts zu DUT gefahren"? – Tatev

+0

Wenn Sie Testbench nicht ausführen, werden die Eingänge, die mit Ihrem Designmodul verbunden sind, nicht angesteuert und bleiben unverbunden, so dass "nichts zu DUT (Design im Test) gefahren wird" –

+0

Vielen Dank !!! Es klappt!!! Nachdem ich Transkriptbefehle geschrieben hatte, fing es an zu arbeiten !! – Tatev