• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录

SOC/IP验证工程师

  • 博客园
  • 联系
  • 订阅
  • 管理

公告

View Post

Verilog中的系统任务$strobe和$monitor的区别

$strobe
$strobe 为选通显示任务。$strobe 使用方法与 $display 一致,但打印信息的时间和 $display 有所差异(也可以直接打印文本)。
当许多语句与 $display 任务在同一时间内执行时,这些语句和 $display 的执行顺序是不确定的,一般按照程序的顺序结构执行。两者的区别在于:$strobe命令会在当前时间部结束时完成;而$display是只要仿真器看到就会立即执行。
$strobe 是在其他语句执行完毕之后,才执行显示任务。例如:
`timescale 1ns/1ns
module test_tb();
reg [3:0]  a ;
initial begin
	$strobe("begin!");
	a = 1 ;
	#1 ;
	a <= a + 1 ;
	//第一次显示
	$display("$display excuting result: %d.", a);
	$strobe("$strobe excuting result: %d.", a);
	#1 ;
	$display();
	//第二次显示
	$display("$display excuting result: %d.", a);
	$strobe("$strobe excuting result: %d.", a);
	$strobe("end!");
end
endmodule
其打印结果如下: 

可以看到,$strobe与$display的打印内容不是一致的。
这是因为该语句:    a <= a + 1 ;也就是说a的第二次赋值是非阻塞赋值,而非阻塞赋值是需要时间的。
在第一次打印时,$display不会管你a是阻塞赋值还是非阻塞赋值,它就直接打印a当前的值1。而$strobe则会等到非阻塞赋值完成后再打印,所以其打印的值为2。
在第二次打印时,又延时了1ns,所以此时的非阻塞赋值完成,那么$strobe与$display的打印内容就均为2了。
所以$strobe这个系统任务通常是用来打印当前非阻塞赋值的变量值的。

$monitor
$monitor 为监测任务,用于变量的持续监测。只要变量发生了变化,$monitor 就会打印显示出对应的信息。 其使用方法与 $display一致。
下面的代码用$monitor 来实现监控a,b,c这3个变量,只要其中一个发生了变化,就会立马在终端打印。
`timescale 1ns/1ns
module test_tb();
reg [1:0]  a ;
reg [1:0]  b ;
reg [1:0]  c ;
initial begin
	a = 0 ;
	b = 0 ;
	c = 0 ;
 
	$monitor("a=%d b=%d c=%d",a,b,c);
	#50 $finish;	//50ns后停止
end
always #10 begin		//每10ns,随机生成a,b,c
	a = {$random}%4;
	b = {$random}%4;
	c = {$random}%4;
end
endmodule 
终端打印结果如下: 

posted on 2023-06-04 13:49  SOC验证工程师  阅读(424)  评论(1)    收藏  举报

刷新页面返回顶部
 
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3