如何使用display提高debug效率呢?

2023-08-28 07:31:34 来源: IC的世界

1、display的使用


(资料图)

verilog中虽然没有system verilog的assertion,但是我们依旧可以使用display打印检查各类错误,在RTL级的仿真中能够快速定位问题。

例如:

检查不合理的配置,不合理的配置组合;

检查不合理的输入数据类型,例如vld/sop/eop 组合缺少了sop或者eop;

案例:

如下案例中,如果复位释放且cfg_mode_in为INVLD_CFG状态,则打印ERROR。%0t表示的是以当前时间格式显示,即仿真中的时间。%0t中的0指的是以数值的真实位宽显示,不会额外再补充0。%m 显示当前模块层级,即下图中的display_exp_top.u_display_exp。$write在屏幕显示时是不换行的,$display自带换行符,显示后换行。

Verilog代码

`timescale 1ns/1ps`define INVLD_CFG 2"b0module display_exp (   input                                               clk                                  ,   //   input                                               rst_n                                ,   //   input       [1:0]                                   cfg_mode_in                              //);  reg   [1:0]  cfg_mode ;  always@(posedge clk ornegedge rst_n)if(~rst_n)          cfg_mode <= 1"b0;else          cfg_mode <= cfg_mode_in; `ifdef WAR_ERR_PRINT  always@(posedge clk or negedge rst_n)     if((rst_n==1)&&(cfg_mode_in==`INVLD_CFG))       begin          $write("%0t ps: %m : ERROR : ",    $time) ;          $display("cfg_mode not be INVLD CFG when rst_n is release") ;      end `endifendmodule

Testbench

module display_exp_top();reg clk;reg rst_n;reg [1:0] cfg_mode_in ;initial beginclk = 0;forever #1 clk = ~clk;endinitial beginrst_n = 1"b0;   #2.5 rst_n = 1;enddisplay_exp  u_display_exp(.clk(clk),.rst_n(rst_n),.cfg_mode_in(cfg_mode_in));initial begincfg_mode_in = 2"b0 ;   #10cfg_mode_in = 2"b1 ;   #10cfg_mode_in = 2"b10 ;   #10cfg_mode_in = 2"b11 ;endendmodule

2、打印效果

3、注意事项

$write和$display是不可综合的语句,因此在设计中,我们通常使用宏定义来生效打印语句。案例中就采用了`ifdef WAR_ERR_PRINT和`endif。在RTL仿真中,可以生效WAR_ERR_PRINT,而在综合时不能生效WAR_ERR_PRINT。

4、打印的优缺点

采用$display的优势在于它不会占用硬件资源,因此设计人员可以添加任意多的检测语句,方便快速定位问题。缺点就是不可综合,在网表中以及芯片中不存在此检测手段,无法像中断,统计计数那样去debug问题。

审核编辑:刘清

标签:

[责任编辑:]

最近更新