Verilog中使用连续@posedge会是什么现象,是否可综合

连续@posedge是可以综合,如果后面是阻塞赋值,会出现以下现象:

这部分是源码中的执行部分:

@(posedge clk) b = a;
@(posedge clk) c = b;
$display("blocking2 a = %b	b = %b	c = %b",a,b,c);




@(posedge clk)
begin
	c = b;
	b = a; 
	$display("blocking1 a = %b	b = %b	c = %b",a,b,c);
end

这部分是测试代码的主体: 

initial
begin
	clk	= 1'b1;
	a	= 4'b0;
	sel	= 2'b0;
	repeat(15)
	begin
		#6
		sel = sel + 2'b1;
		a	 = 4'd0;
		#6 
		a	 = 4'd6;	
	end
end
always #1 clk = ~clk;

 现象如下:

 可以看到,其他的单个@posedge的都是输出6次,两个@posedge连着用,后面又跟的是阻塞赋值,就导致本来该出现6次的$display只出现了6/2次,更改位三连@就只剩6/3 = 2次了。是由于第一次阻塞赋值必须完成之后才能出第一个@,这时候边沿已经过去了,然后还得接着等第二个边沿,就在第二个@处等着,所以对于 $display,就错过了一个沿,所以就少了半,两个轮回就是三次。

那如果是三个@posedge是不是就应该只显示两次了呢,是的:

@(posedge clk) b = a;
@(posedge clk) c = b;
@(posedge clk) $display("blocking2 a = %b	b = %b	c = %b",a,b,c);

但是这种写法是可以综合的吗?我们验证一下:

的确是可综合的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值