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