2017-09-25 237 views
0

我想開發一個代碼,它像一個邏輯計算器一樣工作;我已經成功地編譯了代碼和測試平臺,沒有任何錯誤。下面是代碼:系統Verilog Testbench波形沒有數據

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 

,這裏是目前的測試平臺(這是一個較短的版本,我仍然試圖找到這背後的問題),這兩個文件都能夠

`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 

單獨編譯成功,沒有錯誤。然而,當我嘗試編譯他們在RTL仿真器,我得到這些結果:

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

爲什麼我仍然得到「無數據」在我的結果,儘管編譯成功?立即幫助將不勝感激。提前致謝。

+0

VCS在第一個always塊中給我一個警告:'這個always塊沒有事件控制或延遲語句,它可能導致 在仿真中無限循環。「# – toolic

+0

你期望什麼數據?非常具體,就像......「我希望輸出S2在時間42ns時具有123的值。」 – toolic

+0

只要我將「$ monitor」添加到測試平臺,我的仿真就會掛起。我認爲VCS警告是真實的。你應該嘗試解決這個問題,總是先阻止。 – toolic

回答

0

AriLogCal總是沒有任何事件/時間阻滯劑。 always begin是一個無限循環。它將不斷地重新評估和防止模擬器轉移到下一個時間步驟。

它應該被更改always_comb begin,它具有繼承時間阻塞,並且只會在時間0和刺激信號發生變化時觸發。或者,您可以使用Verilog自動靈敏度@*(或同義詞@(*))並將語句更改爲always @* beginalways_comb優於always @*,因爲如果基本綜合要求沒有分層(例如:寄存器只分配到一個always塊中,並且在always塊中沒有阻塞@#語句),它會通過編譯錯誤。

供參考:您不應該在組合邏輯中使用非阻塞(<=)分配;阻止(=)作業是首選。在always_ff和偶爾的always_latch中應使用非阻塞分配。