引子:ModelSim是HDL仿真软件,Debussy是波形查看软件;搭配使用,相当爽。此处所谓快速查看前仿真波形仅为抛砖引玉,大家不要拘泥于此。两款软件的功能都很强大,请自行研究。
注:本篇博文的软件环境为:Debussy 5.3v9 + Modelsim SE 6.5
配置篇
1 安装、和谐软件。略。
2 拷贝文件..NovasDebussysharePLImodelsim_pliWINNT ovas.dll至文件夹..modeltech_6.5win32。
3 取消文件..modeltech_6.5modelsim.ini的只读属性后,打开。
找到
1
|
; Veriuser = veriuser.sl |
替换为
1
|
Veriuser = novas.dll |
保存;关闭;设为只读。
配置完,以后就一劳永逸了。
实战篇
此处以一简单分频器为例。文件地图如下:
1
2
3
4
5
6
7
8
|
│ rtl.f │ run.bat │ sim.do │ └─rtl clk_rst.v divider.v divider_tb.v |
1 编写欲仿真的HDL文件:RTL级代码+Testbench代码。保存在文件夹rtl中。
(1)divider.v // RTL级代码模块
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
|
` timescale 1ns/10ps module divider( input i_clk, input i_rst_n, output o_clk ); parameter U_DLY = 1; // log2(5) = 2.3219 <= 3 reg [2:0] cnt_p; // 上升沿计数子 // 5位上升沿计数器: 0 ~ 4 // 4 = 5 - 1 always @ ( posedge i_clk, negedge i_rst_n) begin if (!i_rst_n) cnt_p <= 0; else begin if (cnt_p == 4) cnt_p <= 0; else cnt_p <= #U_DLY cnt_p + 1'b1 ; end end // log2(5) = 2.3219 <= 3 reg [2:0] cnt_n; // 下降沿计数子 // 5位下降沿计数器: 0 ~ 4 // 4 = 5 - 1 always @ ( negedge i_clk, negedge i_rst_n) begin if (!i_rst_n) cnt_n <= 0; else begin if (cnt_n == 4) cnt_n <= 0; else cnt_n <= #U_DLY cnt_n + 1'b1 ; end end reg o_clk_p; // 上升沿时钟输出寄存器 // 输出上升沿时钟 // 0 ~ 2 ↑-> 1 // (2+1) ~ 4 ↑-> 0 // 2 = 5>>1 // 4 = 5 - 1 always @ ( posedge i_clk, negedge i_rst_n) begin if (!i_rst_n) o_clk_p <= 0; else begin if (cnt_p <= 2) // 2 = 5>>1 o_clk_p <= 1; else o_clk_p <= 0; end end reg o_clk_n; // 下降沿时钟输出寄存器 // 输出下降沿时钟 // 0 ~ 2 ↓-> 1 // (2+1) ~ 4 ↓-> 0 // 2 = 5>>1 // 4 = 5 - 1 always @ ( negedge i_clk, negedge i_rst_n) begin if (!i_rst_n) o_clk_n <= 0; else begin if (cnt_n <= 2) // 2 = 5>>1 o_clk_n <= 1; else o_clk_n <= 0; end end assign o_clk = o_clk_n & o_clk_p; // 按位与(作用:掩码) endmodule |
(2)clk_rst.v // Testbench的时钟及复位模块
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
` timescale 1ns/10ps module clk_rst( output reg i_clk, output reg i_rst_n ); parameter CLK_PERIOD = 20; parameter MULT_RATIO = 10; parameter RESET_TIME = MULT_RATIO * CLK_PERIOD + 1; initial begin i_rst_n <= 1'b0 ; #RESET_TIME i_rst_n <= 1'b1 ; end initial begin i_clk <= 1'b0 ; forever #(CLK_PERIOD / 2) i_clk <= ~i_clk; end endmodule |
把时钟及复位单独剥出来,便于移植到其他平台。
(3)divider_tb.v // Testbench顶层例化模块
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
` timescale 1ns/10ps module divider_tb(); wire i_clk; wire i_rst_n; wire o_clk; // genrate clock clk_rst clk_rst_inst( .i_clk(i_clk), .i_rst_n(i_rst_n) ); // user logic divider divider_inst( .i_clk(i_clk), .i_rst_n(i_rst_n), .o_clk(o_clk) ); // dump fsdb file for debussy initial begin $fsdbDumpfile( "wave.fsdb" ); $fsdbDumpvars; end endmodule |
注意第22行到第27行
1
2
3
4
5
6
|
// dump fsdb file for debussy initial begin $fsdbDumpfile( "wave.fsdb" ); $fsdbDumpvars; end |
这段语句的意思,就是调用ModelSim生成波形文件,并保存为wave.fsdb,供Debussy查看。
2 编写HDL文件列表文件,供ModelSim和Debussy使用。
rtl.f
1
2
3
|
rtl/divider.v rtl/clk_rst.v rtl/divider_tb.v |
3 编写ModelSim命令行脚本文件。
sim.do
1
2
3
4
5
|
vlib work vlog -f rtl.f vsim work.divider_tb run 10us q |
4 编写批处理脚步文件,调用命令行ModelSim生成波形文件,再调用Debusyy查看。
run.bat
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
::关闭回显 @ECHO OFF ::设置软件路径 SET debussy=C:NovasDebussyinDebussy.exe SET vsim=C:modeltech_6.5win32vsim.exe ::ModelSim Command %vsim% -c -do sim.do ::删除ModelSim生成的相关文件 RD work /s /q DEL transcript vsim.wlf /q ::Debussy Command %debussy% -f rtl.f -ssf wave.fsdb -2001 ::删除波形文件 DEL wave.fsdb /q ::删除Debussy生成的相关文件 RD Debussy.exeLog /s /q DEL debussy.rc /q ::退出命令行 EXIT |
注意:请适当修改相关路径,本处仅以我个人的配置为例。
5 双击运行run.bat
显示命令行画面
图1 运行run.bat画面
弹出Debussy及Debussy波形查看组件。
图2 Debussy及Debussy波形查看组件
我CALL,波形在哪里。小样竟敢唬我。
呵呵,别着急,慢慢来。
(6)添加欲观察信号。
单击 或Signal-Get Signals…添加信号;或者偷懒一点,单击Signal-Get All Signals。此处我就一懒到底,就添加全部信号吧。
弹出警告,告知我们添加所有信号需要花费一段时间,是否要确认。确认OK。
图3 警告
看,波形出来了。
图4 devider前仿真波形
结语
正如引子所言,ModelSim的功能太强大了,于是就有点繁琐。和Debussy协同仿真,我们就省却了许多不必要,何乐而不为呢。当然,还有许多的功能,由于水平有限,就写到这里吧。