阻塞非阻塞和延时的奇妙组合

发布于:2023-01-03 ⋅ 阅读:(395) ⋅ 点赞:(0)

阻塞非阻塞和延时的奇妙组合

  • assign #2 y = ~a;
    描述:非门的延时为2ns,输入端信号变化到输出端体现出来需要2ns时间。即a发生变化后,经过2ns时间,y才发生变化。
    注意:任意小于2ns的信号变化脉冲都被过滤掉。
  • assign #(2,3) y = ~a;
    描述:非门的上升沿延时(输出变为1)为2ns,下降沿延时(输出变为0)为3ns;关闭延时(输出变成z,高阻态)和输出变为x的延时为2和3中的最小值,即2ns。
  • assign #(2,3,4) y = ~a;
    描述:非门的上升沿延时(输出变为1)为2ns,下降沿延时(输出变为0)为3ns;关闭延时为4ns;输出为x的延时为2,3和4中的最小值,即2ns。
  • #5 y = a ^ b;
    描述:当某时刻T时,a或b发生了变化,导致always语句开始执行,然后遇到#5,立刻将该always进程挂起。等到5ns后,再将T+5ns时刻的a^b赋值给y。T~T+5ns的时间之内,a和b上的任何变化都被忽略了。
  • y = #5 a ^ b;
    描述:当某个时刻T时,a或b发生了变化,导致always 语句开始执行,先将T时刻变化后的a和b异或,然后该always进程挂起。等5ns以后,再将T时刻的a^b的结果赋值给y。在T到T+5ns的时间之内,a和b上的任何变化都被忽略了。
  • #5 y <= a ^ b;
    描述:当某个时刻T,a发生了变化,导致always语句开始执行,然后遇到#5,立刻将该always进程挂起。等到5ns以后,always语句被重新激活,将T+5ns时刻的a^b赋值给y。在T~T+5ns时间之内,a和b上的任何变化都被忽略了。
  • y <= #5 a ^ b;
    描述:当某个时刻T,a发生了变化,导致always语句开始执行y = a ^ b。首先计算a^b的值,然后将赋值给y的更新事件调度到T+5ns以后执行。在T~T+5ns上a和b的任何变化都不会忽略,总是在变化后的5ns时刻体现在y上。

仿真截图

在这里插入图片描述

源代码

module test_code(
input a,b,
output  y1,y2,y3,
output reg y4,y5,y6,y7
);

assign #2 y1 = ~a;
assign #(2,3) y2 = ~a;
assign #(2,3,4) y3 = (a===1'bz)?1'bz:~a;

always @ (a or b) begin
    #5 y4 = a ^ b;
end

always @ (a or b) begin
    y5 = #5 a ^ b;
end

always @ (a or b) begin
    #5 y6 <= a ^ b;
end

always @ (a or b) begin
    y7 <= #5 a ^ b;
end

endmodule

测试代码

`timescale 1ns / 1ps
module test_code_tb;

  // Parameters

  // Ports
  reg a = 0;
  reg b = 0;
  wire y1;
  wire y2;
  wire y3;
  wire y4;
  wire y5;
  wire y6;
  wire y7;

  test_code 
  test_code_dut (
    .a (a ),
    .b (b ),
    .y1 (y1 ),
    .y2 (y2 ),
    .y3 (y3 ),
    .y4 (y4 ),
    .y5 (y5 ),
    .y6 (y6 ),
    .y7  ( y7)
  );

  initial begin
    begin
      a = 1'b0; b = 1'b0;
      #6 a = 1'b1;
      #4 a = 1'b0;
      #6 a = 1'b1;
      #5 a = 1'b0;
      #6 a = 1'b1;
      #5 a = 1'bx;
      #5 a = 1'b0;
      #5 a = 1'bz;
      #5 a = 1'b0;
    end
  end

endmodule

网站公告

今日签到

点亮在社区的每一天
去签到