Modelsim使用网表+标准延时文件做后仿真时,查看多个触发器组合的值

105 篇文章 13 订阅

方法一:在tb中查看内部信号的方法

1、使用综合工具得到的.v网表文件依然保持层次化的结构,但是综合工具会将其中的某些信号优化掉。不管工具怎么优化,综合后的网表依然具有和rtl代码相同的功能(如果rtl代码符合规范),我们不必在波形窗口中添加哪些被优化掉的信号,可以根据数据流找到与它相关的未被优化的信号,例如在时序电路中,在赋值语句的左侧的信号是一定不会被优化的。如下图是被综合后的一部分网表,实例化模块名为U5ad_cj。为了在tb中查看start_cnt[7]_net_1、start_cnt[6]_net_1、start_cnt[5]_net_1、start_cnt[4]_net_1、start_cnt[3]_net_1、start_cnt[2]_net_1、start_cnt[1]_net_1、start_cnt[0]_net_1,start_cnt[7:0]会被综合成8比特的寄存器(由8个独立的触发器组成),其中start_cnt[7]_net_1、start_cnt[6]_net_1、start_cnt[5]_net_1、start_cnt[4]_net_1、start_cnt[3]_net_1、start_cnt[2]_net_1、start_cnt[1]_net_1、start_cnt[0]_net_1分别表示与8个独立触发器的连线,通过这些连线与其他模块进行互联。

        \U5ad_cj/start_cnt[7]_net_1 , \U5ad_cj/cnt_RNIMU8H[0]_net_1 , 
        \U5ad_cj/cnt_RNIDNK8[2]_net_1 , \U5ad_cj/cnt_n4 , 
        \U5ad_cj/N_11_1 , \U5ad_cj/start_cnt_3[7] , 
        \U5ad_cj/ACT_LT3_E[4] , \U5ad_cj/cj_sp_cnt_m[7]_net_1 , 
        \U5ad_cj/ACT_LT3_E_1[5] , \U5ad_cj/ACT_LT3_E[3] , 
        \U5ad_cj/ACT_LT3_E[0] , \U5ad_cj/cj_sp_cnt_m_RNI46F1[5]_net_1 , 
        \U5ad_cj/cj_sp_cnt_m_RNI6EF1[6]_net_1 , \U5ad_cj/N_11_0 , 
        \U5ad_cj/N_17_2 , \U5ad_cj/N_14_1 , \U5ad_cj/N_13_1 , 
        \U5ad_cj/DWACT_COMP0_E_1[1] , 
        \U5ad_cj/DWACT_BL_EQUAL_0_E_1[2] , 
        \U5ad_cj/DWACT_BL_EQUAL_0_E_1[0] , \U5ad_cj/start_cnt_3[0] , 
        \U5ad_cj/N_4 , \U5ad_cj/ACT_LT3_E_0[2] , \U5ad_cj/N_14_2 , 
        \U5ad_cj/start_cnt[4]_net_1 , \U5ad_cj/N_17_0 , \U5ad_cj/N_14 , 
        \U5ad_cj/N_13 , \U5ad_cj/cnt_n3 , \U5ad_cj/cnt[3]_net_1 , 

2、在modelsim中运行时序仿真后,添加波形后,点击保存,打开保存的.do文件后,可以看到图2中的相关命令。

 图1 将波形保存为.do文件

.do文件

add wave -noupdate {/Top_tb/uut/\U5ad_cj/start_cnt[5]_net_1 }
add wave -noupdate {/Top_tb/uut/\U5ad_cj/cj_sp_cnt_m[6]_net_1 }
add wave -noupdate {/Top_tb/uut/\U5ad_cj/I_31_3 }
add wave -noupdate {/Top_tb/uut/\U5ad_cj/cj_sp_cnt_m[1]_net_1 }
add wave -noupdate {/Top_tb/uut/\U5ad_cj/I_5_3 }
add wave -noupdate {/Top_tb/uut/\U5ad_cj/DWACT_BL_EQUAL_0_E_0[2] }
add wave -noupdate {/Top_tb/uut/\U5ad_cj/N_9_2 }
add wave -noupdate {/Top_tb/uut/\U5ad_cj/DWACT_FINC_E[7] }
add wave -noupdate {/Top_tb/uut/\U5ad_cj/ACT_LT3_E[1] }
add wave -noupdate {/Top_tb/uut/\U5ad_cj/N_12_0 }
add wave -noupdate {/Top_tb/uut/\U5ad_cj/cnt[1]_net_1 }
add wave -noupdate {/Top_tb/uut/\U5ad_cj/N_42 }
add wave -noupdate {/Top_tb/uut/\U5ad_cj/start_cnt[7]_net_1 }

图2 .do文件中的命令

3、在tb文件中,为了查看start_cnt[7]_net_1信号,将.do文件中的信号拷贝到tb文件中更改如下:将.do文件中最前面的 / 去掉,将第一个 \ 前面的 / 替换为  ,如果需要观察一组信号,可以使用拼接运算符{ }将信号组合到一起,再通过$display等函数打印出来。

.do文件

{/Top_tb/uut/\U5ad_cj/start_cnt[7]_net_1 }



tb文件
{ Top_tb.uut.\U5ad_cj/start_cnt[7]_net_1 }

4、为了查看start_cnt[7]_net_1、start_cnt[6]_net_1、start_cnt[5]_net_1、start_cnt[4]_net_1、start_cnt[3]_net_1、start_cnt[2]_net_1、start_cnt[1]_net_1、start_cnt[0]_net_1这些信号,在tb文件中按照如下写法:

	integer dout_file1;
	initial
		begin
			dout_file1=$fopen("C:/Test20230216/2023/a.txt");
		end
	
	always @(posedge CLK_dj)     
	 begin
	 //the below is right
     //$fdisplay(dout_file1,"%d",{Top_tb.uut.\dout[0]_4 }                                        );    
	 
	 
	 //the below is right
	  $fdisplay(dout_file1,"%d", { { Top_tb.uut.\U5ad_cj/start_cnt[6]_net_1 } , {  Top_tb.uut.\U5ad_cj/start_cnt[5]_net_1 }, {  Top_tb.uut.\U5ad_cj/start_cnt[4]_net_1 },  {  Top_tb.uut.\U5ad_cj/start_cnt[3]_net_1 }, {  Top_tb.uut.\U5ad_cj/start_cnt[2]_net_1 }, {  Top_tb.uut.\U5ad_cj/start_cnt[1]_net_1 },{  Top_tb.uut.\U5ad_cj/start_cnt[0]_net_1 } });
	 
	 
  
	end	

使用拼接运算符 { },将需要查看的信号拼接进行打印。

在执行后仿真时,可以同时开启两个modelsim进程,一个进程用于功能仿真,另一个用于时序仿真,借助功能仿真中的信号查找时序仿真中的信号,功能仿真的激励文件与时序仿真的激励文件一致,只是时序仿真相比于功能仿真增加了一个系统调用$sdf_annotate()。

小技巧:
        在testbench中,通过层次化访问某一模块内部的信号,为了减少重复工作,可以将比较长的路径通过`define定义一个宏,简化路径书写繁琐,如下示例,为u1_cache_fifo模块内部的RE信号赋值,层次路径为Top_tb.uut.U3uart.u1_cache_fifo.RE,可以将Top_tb.uut.U3uart.u1_cache_fifo定义为一个宏,然后在testbench中通过宏定义来引用。testbench书写如下:(注意`define和引用前的  `   符号
 

`define path  Top_tb.uut.U3uart.u1_cache_fifo
module Top_tb;

	// Inputs
	reg ClkIn;
	reg CLK_dj;
	reg RstnIn;
	reg CmdRstIn;
      
    initial 
	  begin 
		# 20000000  force `path.RE=0 ;      //Top_tb.uut.U3uart.u1_cache_fifo.RE=0 ;
		#110 ;
		$display(" ***** %d \n **********  ", Top_tb.uut.U3uart.u1_cache_fifo.RE );
	  end  

  /*  其他内容 */

endmodule



方法二:仿真波形界面查看组合信号值

(1)在“instance”窗口,鼠标左键点击需要仿真的实例名(如uut),再点击鼠标右键,在弹出的菜单中选择“add wave”,uut模块中的所有信号都会添加到“Ojbect”窗口中;
(2)鼠标点击到“Object”窗口中任何一个地方,点击“Ctrl+F”组合键,在弹出的“Find”搜索框中输入要搜索的信号,在“Object”窗口中一一找到所有对应的信号后,点击鼠标右键,选择“add wave”,将所有信号添加到“wave”窗口。

图1 将需要组合的信号添加到wave窗口

(3)“Ctrl+A”选中所有的信号,点击鼠标右键,选择“Combine Signals”,弹出如下的界面,“Result Name”输入组合信号的名字,“Top down ”和“Bottom up”表示按照自顶向下还是自底向上,“Ascending”和“Descending”表示升序还是降序排列。

 (4)执行上述过程,就相当于在.do文件中执行以下命令:(注意信号的排列顺序)

quietly virtual signal -install /Top_tb/uut { (context /Top_tb/uut )&{\uRstGen/cnt[19]_net_1 , \uRstGen/cnt[18]_net_1 , \uRstGen/cnt[17]_net_1 , \uRstGen/cnt[16]_net_1 , \uRstGen/cnt[15]_net_1 , \uRstGen/cnt[14]_net_1 , \uRstGen/cnt[13]_net_1 , \uRstGen/cnt[12]_net_1 , \uRstGen/cnt[11]_net_1 , \uRstGen/cnt[10]_net_1 , \uRstGen/cnt[9]_net_1 , \uRstGen/cnt[8]_net_1 , \uRstGen/cnt[7]_net_1 , \uRstGen/cnt[6]_net_1 , \uRstGen/cnt[5]_net_1 , \uRstGen/cnt[4]_net_1 , \uRstGen/cnt[3]_net_1 , \uRstGen/cnt[2]_net_1 , \uRstGen/cnt[1]_net_1 , \uRstGen/cnt[0]_net_1 }} aaa

(5)可以直接在.do文件中选择相应的信号,然后在transcript窗口中,加载完库后,运行do xxx.do命令即可。


 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值