Modelsim仿真沒有想象的那麼難,我一直沒想着仔細研究一下,本來想着請教別人的,但是最後還是決定找資料,自己好好做一下。
我原先都是調試C語言程序,然後直接用硬件驗證的,沒有注意到仿真的重要性。在FPGA上面,仿真佔了很大的一部分。在我們實際驗證之前,就採用仿真來排除可能出現的錯誤,能夠節省很多時間。仿真過程中也可以讓我們更加深入的思考所設計的系統。因此Modelsim就顯得很重要了。
最初都是使用quartus進行直接調用的,對modelsim的整個操作流程還是不瞭解,後來直接用modelsim調用編寫的程序。
Modelsim也可以編譯verilog的程序的,我們可以建立一個空的工程進行編譯的。我們這裏使用的方法是在quartus裏面進行編譯。這兩種方法我都測試過,都是可以的。
下面現在列出具體的方法。
// 注意一點,最後我們仿真需要兩個文件,一個是我們的源文件.V文件,另外一個就是我們的testbench文件。我們最後仿真的時候,其實仿真的是testbench文件。
(1),使用quartus編寫源文件,此處以38譯碼器爲例。
/*
decode38
*/
module decode_38(keyin,led,clk);
input clk;
input [2:0]keyin;
output [7:0]led;
reg [2:0]read_key;
reg [7:0]led;
always@(keyin)
begin
read_key=keyin;
case(read_key)
3'd0: led=8'b1111_1110;
3'd1: led=8'b1111_1101;
3'd2: led=8'b1111_1011;
3'd3: led=8'b1111_0111;
3'd4: led=8'b1110_1111;
3'd5: led=8'b1101_1111;
3'd6: led=8'b1011_1111;
3'd7: led=8'b0111_1111;
default:
led=8'b1111_1111;
endcase
end
endmodule
(2)編寫testbench文件
`timescale 1 ns/ 1 ps
module decode_38_vlg_tst();
reg clk;
reg [2:0] keyin;
// wires
wire [7:0] led;
reg [3:0]invect;
initial
begin
#10 clk=1'b0;
forever
#10 clk=~clk;
end
initial
begin
for(invect=0;invect<8;invect=invect+1)
begin
keyin=invect[3:0];
#10 $display($time," clk=%b,keyin=%b,led=%b",clk,keyin,led);
end
end
initial
begin
#120 $stop;
end
decode_38 i1 (
// port map - connection between master ports and signals/registers
.clk(clk),
.keyin(keyin),
.led(led)
);
endmodule
(3)啓動modelsim ,File->New->Project,建立工程
(4)保存新建的工程
(5)添加項目到建立的工程之中。此處選擇Add Existing File(因爲要仿真的文件我們已經編譯好了)
(6)選擇編譯好的文件。需要加載我們的.V文件,以及testbench文件,一次可以加載多個文件的。
(7)在“Project”選項卡中顯示剛纔加載的文件,此時Status狀態欄顯示“?”,因爲我們現在還沒有對其進行編譯呢
(8)選擇菜單欄Complie進行全編譯
(9)打開Library選項卡中的work庫,找到我們加載的兩個文件(.v .vt)。
(10)選中testbench文件,並右擊鼠標,準備simulate
(11)右擊我們的testbench文件,選中Add->To Wave-> All items in region
(12)設置仿真時間,我們這裏設置10ms
(13)在最下面的命令行窗口輸入”run”,或者選中Simulate->Run-All
(14)得到仿真結果