如何使用display提高debug效率呢?
2023-08-27 18:11:47 来源: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问题。
审核编辑:刘清
标签:
互联网
在verilog中虽然没有systemverilog的assertion,但是我们依旧可以使用d
2023-08-27 18:11:47
3000点“保卫战”下的投资逻辑
本刊特约丨玄铁本周,股谚“熊市地量之后见地价”再被验证。8月21日,A
2023-08-27 17:55:55
DPD的原理是什么?DPD到底是怎么实现运行的?
我一直认为射频工程师的最高进阶,是DPD,因为结合了算法处理,一下子
2023-08-27 17:18:36