新手上路
- 积分
- 28
- 金钱
- 28
- 注册时间
- 2018-8-30
- 在线时间
- 9 小时
|
利用modelsim 进行仿真时,发现initia语句在使用阻塞和非阻塞赋值时,会出现不同的结果,请问在initial语句中什么时候该用阻塞什么时候该用非阻塞赋值呢?代码如下:
module key_decount(
input sys_clk,
input sys_rst_n,
input key,
);
reg touch_key_d0;
reg touch_key_d1;
always @(posedge sys_clk or negedge sys_rst_n) begin
if(!sys_rst_n) begin
touch_key_d0 <= 1'b0;
touch_key_d1 <= 1'b0;
end
else begin
touch_key_d0 <= key;
touch_key_d1 <= touch_key_d0;
end
end
endmodule
使用阻塞赋值时的testbench:
initial
begin
sys_clk = 1'b0;
sys_rst_n = 1'b0;
key = 1'b1;
#100 sys_rst_n = 1'b1;
#210 key = 1'b0;
#210 key = 1'b1;
#205 key = 1'b0;
#205 key = 1'b1;
#200 key = 1'b0;
#200 key = 1'b1;
end
always #10 sys_clk=~sys_clk;
仿真波形如图:
当key的值恰好在上升沿变化时,touch_key_d0会立刻跟随key发生变化;
使用非阻塞赋值时的testbench:
initial
begin
sys_clk <= 1'b0;
sys_rst_n <= 1'b0;
key <= 1'b1;
#100 sys_rst_n <= 1'b1;
#210 key <= 1'b0;
#210 key <= 1'b1;
#205 key <= 1'b0;
#205 key <= 1'b1;
#200 key <= 1'b0;
#200 key <= 1'b1;
end
always #10 sys_clk=~sys_clk;
仿真波形:
当key恰好在上升沿变化时,touch_key_d0会在下一时钟周期上升沿发生变化;
|
|