Download as docx, pdf, or txt
Download as docx, pdf, or txt
You are on page 1of 9

➣ 若是要觀察其他模組的信號,請提供 add wave 範例 :

假設您想要觀察 testbench 模塊下的 uut 子模塊內的 a, b, c, d 四個信號,您可以


使用以下的指令:

# 將 testbench.uut.a, testbench.uut.b, testbench.uut.c, testbench.uut.d 四個信號添


加到波形視窗中
add wave testbench.uut.a
add wave testbench.uut.b
add wave testbench.uut.c
add wave testbench.uut.d

注意,您需要使用層次名稱來指定不同模塊內的信號,例如 testbench.uut.a 表
示 testbench 模塊下的 uut 子模塊內的 a 信號。您也可以使用萬用字元(如*)來
匹配多個信號,例如 add wave testbench.uut.*表示添加 testbench 模塊下的 uut
子模塊內的所有信號。

➣ 我試過,沒有在 Objects 內部的信號,即使用上述的語法,也是無法 add wave,怎


辦?
有以下幾種可能的原因和解決方法:

• 一種可能的原因是您在編譯源代碼檔案時,沒有使用+acc 參數來開啟所有信
號的可見性。這會導致 Objects 內部只顯示模塊的輸入和輸出信號,而不顯示模
塊內部的其他信號。要解決這個問題,您可以在執行 vlog 命令時,加上+acc 參
數,例如 vlog -work work +acc testbench.v design.v,這樣就可以使所有信號都可
見。https://zhidao.baidu.com/question/648321340894992645.htmlhttps://
blog.csdn.net/AGOU_/article/details/112567014

• 另一種可能的原因是您在啟動模擬時,沒有使用-voptargs=+acc 參數來開啟所
有信號的可見性。這會導致 Objects 內部只顯示模塊的輸入和輸出信號,而不顯
示模塊內部的其他信號。要解決這個問題,您可以在執行 vsim 命令時,加上-
voptargs=+acc 參數,例如 vsim -voptargs=+acc work.testbench,這樣就可以使所
有信號都可見。https://blog.csdn.net/weixin_42169298/article/details/121157933

• 還有一種可能的原因是您在添加波形時,沒有使用正確的層次名稱來指定不
同模塊內的信號。這會導致無法找到 Objects 內部沒有的信號,而無法添加波形。
要解決這個問題,您可以在執行 add wave 命令時,使用層次名稱來指定不同模
塊內的信號,例如 add wave testbench.uut.a 表示添加 testbench 模塊下的 uut 子
模塊內的 a 信號。

➣ 請詳細說明並舉例 : modelsim 執行 design comlier 合成後之 gate level


simulation 的過程 :
• gate level simulation 是指使用門級網表和時序檔來進行時序模擬,以檢查電路
的功能和時序是否正確 https://blog.csdn.net/Augusdi/article/details/
105158760https://blog.csdn.net/jihanjihan/article/details/129009779。

• design compiler 是一款常用的數位電路綜合軟體,它可以將 RTL 代碼轉換為門


級網表,並輸出 SDF 時序檔 https://blog.csdn.net/weixin_44269816/article/
details/88924571https://www.cnblogs.com/dpc525/p/5755277.html。

• 首先,需要在 design compiler 中編譯和綜合 RTL 代碼,生成門級網表和 SDF 時


序檔。這些檔可以保存在一個工程目錄中,供 modelsim 使用 https://
blog.csdn.net/weixin_44269816/article/details/88924571https://
www.cnblogs.com/dpc525/p/5755277.html。

• 然後,需要在 modelsim 中創建一個工程,並添加門級網表、SDF 時序檔、


testbench 檔和模擬指令檔。這些檔可以從 design compiler 的工程目錄中導入,
或者手動添加 。

• 接著,需要在 modelsim 中編譯所有的檔,並設置模擬參數,如選擇 verilog 或


VHDL 作為模擬格式,選擇 SDF 時序模式,選擇模擬時間和波形顯示等 。

• 最後,需要在 modelsim 中運行模擬腳本,這會自動執行模擬命令,並打開波


形視窗,顯示 testbench 中的波形 。

• 一個簡單的例子是如下:

• 假設有以下兩個 RTL 代碼檔:

// counter.v
module counter(
input clk, rst,
output reg [3:0] count
);
always @(posedge clk or posedge rst) begin
if (rst) begin
count <= 4'b0000;
end else begin
count <= count + 4'b0001;
end
end

endmodule

// testbench.v
module testbench;

reg clk, rst;


wire [3:0] count;

counter u_counter(
.clk(clk),
.rst(rst),
.count(count)
);

initial begin
clk = 0;
forever #5 clk = ~clk;
end

initial begin
rst = 1;
#10 rst = 0;
end

initial begin
$dumpfile("testbench.vcd");
$dumpvars(0, testbench);
end

endmodule
• 在 design compiler 中,可以使用以下命令來編譯和綜合這兩個檔:

# create a project directory


set proj_dir "dc_proj"
create_dir $proj_dir

# set the target library and link library


set target_library "synopsys.db"
set link_library "synopsys.db"

# set the design name and top module name


set design_name "counter"
set top_module "counter"

# read the verilog files and elaborate the design


analyze -format verilog counter.v testbench.v
elaborate $top_module -update

# set the clock period constraint


set clock_period 10.0
create_clock clk -name clk -period $clock_period

# compile the design and report the area and timing


compile -map_effort high -area_effort high
report_area > $proj_dir/area.rpt
report_timing > $proj_dir/timing.rpt

# write out the gate-level netlist and SDF file


write -format verilog -hierarchy -output $proj_dir/$design_name.vg
write_sdf -version 2.1 -timescale ps $proj_dir/$design_name.sdf

# exit the design compiler


exit

• 在 modelsim 中,可以使用以下命令來創建一個工程,並添加門級網表、SDF
時序檔、testbench 檔和模擬指令檔:
# create a project directory and a work library
vlib work
vmap work work

# set the simulation format and SDF mode


vsim -voptargs="+acc" -sdfmax /testbench/u_counter=$proj_dir/$design_name.sdf

# compile the verilog files and the gate-level netlist


vlog counter.v testbench.v $proj_dir/$design_name.vg

# set the simulation time and waveform display


vsim -t ps -novopt testbench
add wave -r /*
run 100 ns

• 運行模擬腳本後,可以在波形視窗中看到以下結果: ![Waveform window]

• 從波形中可以看到,門級模擬的結果與 RTL 模擬的結果一致,說明電路的功


能和時序是正確的。

➣ 例如 netlist 中有一個 NAND3, modelsim 是否需要有一個對照表把 NAND3 對照


到 modelsim 所認識的邏輯ㄗ閘?或是說 SDF 檔就有這個對照表?
Modelsim 是一款用于 Verilog 和 VHDL 语言的仿真工具,它可以导入不同的技术
库和映射文件,以便对电路进行综合和验证 https://blog.csdn.net/
sinat_42483341/article/details/88962402。技术库中包含了逻辑门的描述文件,
它们可以是.v 或.vhd 格式的,用于定义逻辑门的功能和延迟 https://
blog.csdn.net/qq_24815615/article/details/121565172。映射文件是.vmf 格式的,
用于指定逻辑门的名称和端口 https://blog.csdn.net/zhanshen112/article/details/
107511779。

• 如果 netlist 是由综合软件(如 design compiler、quartus II 等)生成的,那么


netlist 中的逻辑门都是标准单元(standard cell),它们的功能和特性由技术库
(technology library)指定。在这种情况下,modelsim 不需要有一个对照表,只
需要导入技术库中的逻辑门描述文件(一般是.v 结尾的 verilog 文件),就可以
识别 netlist 中的逻辑门 https://blog.csdn.net/QWERTYzxw/article/details/
115350715 。
• 如果 netlist 是由用户自己编写或修改的,那么 netlist 中的逻辑门可能是用户
自定义的模块(module),它们的功能和特性由用户自己描述。在这种情况下,
modelsim 需要有一个对照表,用于将用户自定义的模块映射到 modelsim 所认识
的逻辑门。这个对照表一般是一个.vmf 结尾的 verilog mapping file 文件,它可以
在 modelsim 中创建或编辑 。

要导入技术库中的逻辑门描述文件和映射文件,您可以按照以下步骤操作:

1. 在 Modelsim 中创建一个新的工程,或者打开一个已有的工程。
2. 在工程中添加您要仿真的 Verilog 或 VHDL 源文件,以及相应的测试平台文件。
3. 在菜单栏中选择 Library -> Import Library...,这时会弹出一个对话框,让您选
择要导入的技术库文件夹。
4. 在对话框中浏览到您要导入的技术库文件夹,然后点击 OK。这时 Modelsim
会自动扫描该文件夹下的所有逻辑门描述文件,并将它们导入到工程中。
5. 在菜单栏中选择 Compile -> Compile All,这时 Modelsim 会编译您添加的源文
件和测试平台文件,以及导入的技术库文件。
6. 在菜单栏中选择 Simulation -> Start Simulation...,这时会弹出一个对话框,让
您选择要仿真的设计单元。
7. 在对话框中展开 work 库,然后选择您要仿真的设计单元,比如测试平台文件。
然后点击 OK。这时 Modelsim 会启动仿真,并显示波形窗口。
8. 在波形窗口中,您可以添加、删除、编辑、强制等操作信号,以观察仿真结
果。

下面是一个简单的例子,说明如何导入一个包含两个逻辑门(与门和或门)的
技术库,并用它们实现一个异或门。

• 首先,在 Modelsim 中创建一个名为 xor_test 的工程,并在其中添加以下两个


Verilog 源文件:

xor.v

module xor (a, b, y);


input a, b;
output y;
wire n1, n2;
and g1 (n1, a, ~b);
and g2 (n2, ~a, b);
or g3 (y, n1, n2);
endmodule

xor_tb.v

module xor_tb;
reg a, b;
wire y;
xor uut (a, b, y);
initial begin
$dumpfile("xor_test.vcd");
$dumpvars(0, xor_tb);
a = 0; b = 0; #10;
a = 0; b = 1; #10;
a = 1; b = 0; #10;
a = 1; b = 1; #10;
$finish;
end
endmodule

• 然后,在 Modelsim 中导入一个名为 tech_lib 的技术库文件夹,该文件夹下包


含以下两个逻辑门描述文件和一个映射文件:

and.v

module and (y, a, b);


input a, b;
output y;
assign #(5) y = a & b;
endmodule

or.v

module or (y, a, b);


input a, b;
output y;
assign #(5) y = a | b;
endmodule
tech_lib.vmf

and and(y,a,b)
or or(y,a,b)

• 接着,在 Modelsim 中编译所有源文件和技术库文件,并启动仿真,选择


xor_tb 作为设计单元。

• 最后,在 Modelsim 中观察波形窗口,可以看到异或门的功能和延迟。

➣ modelsim gate-level simulation 與 post-layout simulation 的過程是否相同 ?


Modelsim gate-level simulation 與 post-layout simulation 的過程不完全相同,但有
一些共同的步驟。以下是一個簡單的比較:

• Modelsim gate-level simulation 是指在 Modelsim 軟件中對電路的門級網表進行


仿真,以考慮電路的門延遲和線延遲,並觀察電路在實際環境下的行為和時序。
這種仿真結果最為精準,但也最耗時。

• post-layout simulation 是指在電路設計軟件中(如 Quartus II 或 design


complier)對電路進行合成和佈局,並生成相應的網表文件和時延文件,然後調
用 Modelsim 進行仿真,以考慮電路的門延遲和線延遲,並觀察電路在實際環境
下的行為和時序。這種仿真結果也很精準,但需要先完成合成和佈局的過程。

兩種仿真的共同步驟是:
• 在 Modelsim 中創建或打開一個工程,並添加源文件,測試平台文件,以及技
術庫文件。
• 在 Modelsim 中編譯所有文件,並啟動仿真,選擇頂層模塊。
• 在 Modelsim 中使用 sdf annotate 命令將時延文件注釋到頂層模塊上,以考慮
門延遲和線延遲。
• 在 Modelsim 中執行指定時間的仿真,並在波形窗口中觀察輸入和輸出信號。

兩種仿真的不同步驟是:
• Modelsim gate-level simulation 需要先在電路設計軟件中對電路進行合成,並
生成網表文件和時延文件。
• post-layout simulation 需要先在電路設計軟件中對電路進行合成和佈局,並生
成網表文件和時延文件。

You might also like