Verilog单步调试:
System Verilog进行单步调试的步骤如下:
1. 编译设计
使用`-debug_all`或`-debug_pp`选项编译设计,生成调试信息。
我的4个文件:
1.led.v
module led(
input clk,
input rst_n,
output reg led
);
reg [7:0] cnt;
always @ (posedge clk)
begin
if(!rst_n)
cnt <= 0;
else if(cnt >= 10)
cnt <= 0;
else
cnt <= cnt + 1;
end
always @ (posedge clk)
begin
if(!rst_n)
led <= 0;
else if(cnt == 10)
led <= !led;
end
endmodule
2.led_tb.v
`timescale 1ns / 1ps
module led_tb;
// Parameters
parameter CLK_PERIOD = 10; // Clock period in ns
// Inputs
reg clk;
reg rst_n;
// Outputs
wire led;
// Instantiate the Unit Under Test (UUT)
led uut (
.clk(clk),
.rst_n(rst_n),
.led(led)
);
// Clock generation
initial begin
clk = 0;
forever # (CLK_PERIOD/2) clk = ~clk;
end
initial begin
$fsdbDumpfile("tb.fsdb");//这个是产生名为tb.fsdb的文件
$fsdbDumpvars;
end
// Test cases
initial begin
// Initialize inputs
rst_n = 0;
# (CLK_PERIOD*2); // Wait for a few clock cycles
// Test case 1: Reset active low
rst_n = 0;
# (CLK_PERIOD*10);
$display("Test case 1: After reset, led = %b", led); // Expected: led = 0
// Test case 2: Reset released, cnt < 10
rst_n = 1;
# (CLK_PERIOD*5);
$display("Test case 2: After reset release, led = %b", led); // Expected: led = 0
// Test case 3: cnt reaches 10, led toggles
# (CLK_PERIOD*5);
$display("Test case 3: After cnt reaches 10, led = %b", led); // Expected: led = 1
// Finish simulation
$finish;
end
3.Makefile
#------------------------------------------------------------------------------------------
FSDB_FILE = tb.fsdb
comp : clean vcs
#------------------------------------------------------------------------------------------
vcs :
vcs \
-f filelist.f \
-timescale=1ns/1ns \
-fsdb -full64 -R +vc +v2k -sverilog -debug_all \
-P ${LD_LIBRARY_PATH}/novas.tab ${LD_LIBRARY_PATH}/pli.a \
| tee vcs.log &
#------------------------------------------------------------------------------------------
verdi :
verdi -f filelist.f -ssf $(FSDB_FILE) &
#------------------------------------------------------------------------------------------
clean :
rm -rf *~ core csrc simv* vc_hdrs.h ucli.key urg* *.log novas.* *.fsdb* verdiLog 64* DVEfiles *.vpd
#------------------------------------------------------------------------------------------
4.file_list
./led.v
./led_tb.v
2. 启动仿真
编译后会生成可执行文件`simv`,运行它以启动仿真。
make vcs
3. 进入调试模式
使用`-gui`选项启动VCS的图形界面调试工具DVE(Discovery Visualization Environment)。
```bash
./simv -gui
```
4. 使用DVE进行单步调试
在DVE中,可以设置断点、单步执行代码、查看信号和变量等。
- **设置断点**:在代码行号旁点击设置断点。
法一(推荐):在行号旁,双击鼠标左键
如上,我是在led.v这个文件进行的断电设置;
法2:右键-->Breakpoint
- **添加待观测信号**:在波形窗口查看信号波形,或在变量窗口查看变量值。
将下面line1~18用鼠标左键选中,右键,添加到待观测波形中;
- **单步执行**:使用`Step Over`、`Step Into`等按钮逐步执行代码。
下面1 or 2都可以用来步进,推荐用快捷键F10.F11.
- **查看信号**:在波形窗口查看信号波形,或在变量窗口查看变量值。
5. 命令行调试(可选)
如果不使用DVE,可以通过命令行进行调试。
```bash
./simv -ucli
```
在UCLI命令行中,使用以下命令进行调试:
- `run`:运行仿真。
- `step`:单步执行。
- `next`:执行下一行代码。
- `cont`:继续执行直到下一个断点。
- `break`:设置断点。
其他:可以将DVE waveform窗口“Always on Top”
6. 分析调试结果
通过DVE或命令行工具分析调试结果,定位并修复问题。
7.总结
1. 使用`-debug_all`编译设计。
2. 运行`./simv -gui`启动DVE。
3. 在DVE中设置断点并单步调试。
4. 可选:使用命令行工具进行调试。
5. 分析调试结果,修复问题。
通过这些步骤,你可以有效地使用VCS对SystemVerilog进行单步调试。