1、display的使用
在verilog中雖然沒有system verilog的assertion,但是我們依舊可以使用display打印檢查各類錯誤,在RTL級的仿真中能夠快速定位問題。
例如:
檢查不合理的配置,不合理的配置組合;
檢查不合理的輸入數(shù)據(jù)類型,例如vld/sop/eop 組合缺少了sop或者eop;
案例:
如下案例中,如果復(fù)位釋放且cfg_mode_in為INVLD_CFG狀態(tài),則打印ERROR。%0t表示的是以當前時間格式顯示,即仿真中的時間。%0t中的0指的是以數(shù)值的真實位寬顯示,不會額外再補充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 or negedge 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 begin clk = 0; forever #1 clk = ~clk; end initial begin rst_n = 1'b0; #2.5 rst_n = 1; end display_exp u_display_exp( .clk(clk), .rst_n(rst_n), .cfg_mode_in(cfg_mode_in) ); initial begin cfg_mode_in = 2'b0 ; #10 cfg_mode_in = 2'b1 ; #10 cfg_mode_in = 2'b10 ; #10 cfg_mode_in = 2'b11 ; end endmodule
2、打印效果
3、注意事項
$write和$display是不可綜合的語句,因此在設(shè)計中,我們通常使用宏定義來生效打印語句。案例中就采用了`ifdef WAR_ERR_PRINT和`endif。在RTL仿真中,可以生效WAR_ERR_PRINT,而在綜合時不能生效WAR_ERR_PRINT。
4、打印的優(yōu)缺點
采用$display的優(yōu)勢在于它不會占用硬件資源,因此設(shè)計人員可以添加任意多的檢測語句,方便快速定位問題。缺點就是不可綜合,在網(wǎng)表中以及芯片中不存在此檢測手段,無法像中斷,統(tǒng)計計數(shù)那樣去debug問題。
審核編輯:劉清
-
芯片設(shè)計
+關(guān)注
關(guān)注
15文章
1004瀏覽量
54815 -
仿真器
+關(guān)注
關(guān)注
14文章
1016瀏覽量
83646 -
RTL
+關(guān)注
關(guān)注
1文章
385瀏覽量
59710 -
Verilog語言
+關(guān)注
關(guān)注
0文章
113瀏覽量
8219
原文標題:Verilog :使用display 提高debug效率
文章出處:【微信號:處芯積律,微信公眾號:處芯積律】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論