14.12-常见的对于非阻塞复制的误解

发布时间:2023年12月29日

1,非阻塞赋值和$display

1.1,RTL案例
module	display_cmds;
reg		a;

initial	$monitor("\$ monitor: a = %b", a);

initial		begin
	$strobe		("\$ strobe : a = %b", a);
	a	= 	0;
	a 	<= 	1;
	$display	("\$ display: a = %b", a);
	#1	$finish;
	
end

endmodule
1.2,功能实现

在这里插入图片描述

1.3,解释误解

误解1:使用 d i s p l a y 命令不能用来显示非阻塞语句的赋值;事实:非阻塞语句的赋值在所有的 display命令不能用来显示非阻塞语句的赋值; 事实:非阻塞语句的赋值在所有的 display命令不能用来显示非阻塞语句的赋值;事实:非阻塞语句的赋值在所有的display命令执行后才更新数值。

对上述语句的解释:
以上3条语句是非阻塞赋值和 d i s p l a y 模块的仿真结果,这说明 display模块的仿真结果,这说明 display模块的仿真结果,这说明display命令的执行是安排在活动事件队列中,但排在非阻塞赋值数据更新事件之前。

注意事项:
$display,在仿真期间会自动执行,但在综合到实际硬件时可能会被忽略,因此请仅将其用于仿真和调试目的。

2,#0延时赋值

2.1,RTL案例
//	#0延时赋值
module	nb_schedule;
reg		a,	b;
initial		begin
	a 	= 	0;
	b 	= 	1;
	a	<=	b;
	b	<=	a;
	
	$monitor("%0dns:	\ $ monitor: a = %b, b = %b",	$stime,	a, b);
	$display("%0dns:	\ $ display: a = %b, b = %b",	$stime,	a, b);
	$strobe ("%0dns:	\ $ strobe:  a = %b, b = %b\n",	$stime,	a, b);
#0	$display("%0dns:			#0:  a = %b, b = %b",	$stime,	a, b);
	
#1	$monitor("%0dns:	\ $ monitor: a = %b, b = %b",	$stime,	a, b);
	$display("%0dns:	\ $ display: a = %b, b = %b",	$stime,	a, b);
	$strobe ("%0dns:	\ $ strobe : a = %b, b = %b\n",	$stime,	a, b);
	$display("%0dns:			#0:  a = %b, b = %b",	$stime,	a, b);
	
#200	$finish;

end
endmodule
2.2,功能实现

在这里插入图片描述
以上8条语句是#0延时赋值模块的仿真结果,这说明#0延时命令在非阻塞赋值事件发生前,在停止运行事件队列中执行。
在这里插入图片描述

#0延时赋值建议遵循以下的原则7:
原则7 用$strobe系统任务来显示,应该用非阻塞赋值的变量值。

2.3,解释误解

误解2:#0延时把赋值强制到仿真时间步的末尾;
事实是:#0延时将赋值事件强制加入停止运行事件队列中。

3,对同一变量进行多次非阻塞赋值

3.1,RTL案例
3.2,功能实现
3.3,解释误解
文章来源:https://blog.csdn.net/qq_21952195/article/details/135286617
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。