2017-09-25 11 views
0

私は論理計算機のように動作するコードを開発しようとしています。私はコードとテストベンチの両方をエラーなくコンパイルすることができました。システムVerilog Testbench波形データなし

`timescale 1ns/1ps 
module AriLogCal_tb; 
logic [3:0] in_OpA; 
logic [3:0] in_OpB; 
logic [2:0] in_DoOpt; 
logic in_EqualTo; 
logic in_AC; 
logic [6:0] out_S2, out_S1, out_S0; 

AriLogCal AriLogCal_inst0(.OpA(in_OpA), .OpB(in_OpB), .DoOpt(in_DoOpt), 
.EqualTo(in_EqualTo), .AC(in_AC), .S2(out_S2), .S1(out_S1), .S0(out_S0)); 

initial begin 
in_EqualTo=1'b0; 
in_AC=1'b0; 


in_OpA = 4'b0111; in_OpB = 4'b0010; in_DoOpt = 3'b000; 
in_EqualTo = 1'b0;#100; 

$finish; 

end 
endmodule 

これらのファイルの両方が可能です。

module AriLogCal(
        input logic [3:0] OpA, OpB, //Operands A and B. The two numbers we will operate on. 
        input logic [2:0] DoOpt,  //Operator. Determines the operation we will do. 
        input logic EqualTo, AC,  //Interrupts. AC resets, EqualTo transfers data to display. 
        output logic [6:0] S2, S1, S0 //Seven-Segement LEDS. Shows each digit separately. 
       ); 

logic [7:0] result;          //Result. 
Mathematical operation result data is stored here. 
logic [3:0] D2, D1, D0;         //Digits. Determines 
the number/symbol/deactivation for each respective SevenSeg. 

always begin 
if(AC)begin //Makes all the numbers display 0 if AC returns TRUE 
result=8'b00000000; 
S0=7'b1111110; 
S1=7'b1111110; 
S2=7'b1111110;   
end 
else if(EqualTo)begin //Does this stuff if EqualTo returns TRUE 

//Part 1: Operation. Decides the relationship between Operand A and B and stores data under "result" 
case(DoOpt) 
3'b000:result=OpA+OpB; //Addition 
3'b001:begin    //Subtraction 
    if(OpB>OpA) 
     result=OpB-OpA; 
    else 
     result=OpA-OpB; 
end 
3'b010:result=OpA*OpB; //Multiplication 
3'b011:begin    //Division 
    if(OpB) 
     result=OpA/OpB; 
    else 
     result=0; 
end 
3'b100:begin 
    if(OpA&&OpB)    //Logical AND 
     result=8'b00000001; 
    else 
     result=8'b00000000; 
end 
3'b101:begin 
    if(OpA||OpB)    //Logical OR 
     result=8'b00000001; 
    else result=8'b00000000; 
end 
endcase 

//Part 2: Digits. Dissects the value of "result" into its decimal digits and stores them in logic "D" 
if(!OpB&&DoOpt==3'b011)  //This will show "Err" on LED displays 
D0=4'b1010; 
else if(result<10)begin //Single Digit. S1 and S2 is temporarily set to zero 
D0=result; 
D1=4'b0000; 
D2=4'b0000; 
end 
else if(result<100)begin //Double digit. S2 is temporarily set to zero 
D0=result%10; 
D1=result/10; 
D2=4'b0000; 
end 
else begin     //Triple digit. 
D2=result/100; 
result=result%100; 
D1=result/10; 
D0=result%10; 
end 


//Part 3: Blanks. Adds blanks and negative sign depending on operation type, according to requirements 
case(DoOpt) 
3'b000:D2=4'b1011;  //Addition deactivates S2 
3'b001:begin    
if(OpB>OpA)     //Subtraction deactivates or shows negative sign 
for S2 
    D2=4'b1100; 
else 
    D2=4'b1011; 
end 
3'b011:begin     //Multiplcation is skipped. 
if(!OpB)begin    //Division has two options: 
    D0=4'b1010;    //If divider is 0, this will show "Err" on LED 
displays 
    D1=4'b1010; 
    D2=4'b1010; 
end else      //Otherwise, S2 is deactivated 
D2=4'b0000; 
end 
3'b100:begin    //Logical AND deactivates S2 and S1 
    D2=4'b1011; 
    D1=4'b1011; 
end 
3'b101:begin    //Logical OR deactivates S2 and S1 
    D2=4'b1011; 
    D1=4'b1011; 
end 
endcase 

//Part 4: Display. Prints the digits from "D" onto its respective Seven Segment LED S 
case(D0) 
4'b1010: S0<=7'b0000101; //D0=10 means S0 displays R 
4'b1001: S0<=7'b1110011; //9 
4'b1000: S0<=7'b1111111; //8 
4'b0111: S0<=7'b1110000; //7 
4'b0110: S0<=7'b1011111; //6 
4'b0101: S0<=7'b1011011; //5 
4'b0100: S0<=7'b0110011; //4 
4'b0011: S0<=7'b1111001; //3 
4'b0010: S0<=7'b1101101; //2 
4'b0001: S0<=7'b0110000; //1 
4'b0000: S0<=7'b1111110; //0 
endcase 
case(D1) 
4'b1011: S1<=7'b0000000; //D1=11 means S1 deactivates 
4'b1010: S1<=7'b0000101; //D1=10 means S1 displays R 
4'b1001: S1<=7'b1110011; //9 
4'b1000: S1<=7'b1111111; //8 
4'b0111: S1<=7'b1110000; //7 
4'b0110: S1<=7'b1011111; //6 
4'b0101: S1<=7'b1011011; //5 
4'b0100: S1<=7'b0110011; //4 
4'b0011: S1<=7'b1111001; //3 
4'b0010: S1<=7'b1101101; //2 
4'b0001: S1<=7'b0110000; //1 
4'b0000: S1<=7'b1111110; //0 
endcase 
case(D2) 
4'b1100: S2<=7'b0000001; //D2=12 means S2 shows negative sign 
4'b1011: S2<=7'b0000000; //D2=11 means S2 deactivates 
4'b1010: S2<=7'b1001111; //D2=10 means S2 displays E 
4'b1001: S2<=7'b1110011; //9 
4'b1000: S2<=7'b1111111; //8 
4'b0111: S2<=7'b1110000; //7 
4'b0110: S2<=7'b1011111; //6 
4'b0101: S2<=7'b1011011; //5 
4'b0100: S2<=7'b0110011; //4 
4'b0011: S2<=7'b1111001; //3 
4'b0010: S2<=7'b1101101; //2 
4'b0001: S2<=7'b0110000; //1 
4'b0000: S2<=7'b1111110; //0 
endcase 
end 
end 
endmodule 

、ここで現在のテストベンチです(私はまだ、この背後にある問題を見つけようとしているこれは短いバージョンです):ここでは、コードです個別に正常にコンパイルし、エラーは発生しません。

https://drive.google.com/file/d/0By4LCb9TUml0WWVsZEYtcG03LVk/view?usp=sharing

なぜ私はまだ成功したコンパイルにもかかわらず、私の結果に「データなし」を得るか:私はRTLシミュレータでそれらをコンパイルしようとすると、しかし、私はこれらの結果を得ますか?すぐに役立つでしょう。前もって感謝します。

+0

VCSは常に第1ブロックを警告します。「このブロックにはイベント制御や遅延文がありません。 はシミュレーションで無限ループになる可能性があります。」 – toolic

+0

どのようなデータがありますか?次のように、非常に具体的なものにしてください... "私は出力S2が42nsの時に123の値を持つことを期待しています。 – toolic

+0

テストベンチに '$ monitor'を追加すると、シミュレーションがハングアップします。私はVCSの警告が本当だと思う。常にブロックするようにしてください。 – toolic

答えて

0

AriLogCalのalwaysブロックには、イベント/時刻ブロッカーはありません。 always beginは無限ループです。継続的に再評価し、シミュレータが次のタイムステップに移動するのを防ぎます。

always_comb beginは、継承された時間ブロックを持ち、アットタイム0だけを起動し、刺激信号が変化するときに変更する必要があります。代わりに、Verilog自動感度@*(または同義語@(*))を使用して、ステートメントをalways @* beginに変更することもできます。 always_combは、always @*よりも優れています。なぜなら、基本的な合成要件が階層化されていないと、コンパイルエラーが発生するからです(例:レジスタはalwaysブロックにのみ割り当てられ、alwaysブロックにはブロック@または#ステートメントは割り当てられません)。

FYI:組み合わせ論理では非ブロック(<=)の割り当てを使用しないでください。ブロック(=)の割り当てが優先されます。 always_ffと時折always_latchにノンブロッキング割り当てを使用する必要があります。

関連する問題