verilog行为建模(二):命名事件和行为描述

微信公众号获取更多FPGA相关源码:
在这里插入图片描述

1. 命名事件(named event)

在行为代码中定义一个命名事件可以触发一个活动。命名事件不可综合。

module add_mult (out, a, b);
   input [2: 0]  a, b;
   output [3: 0] out;
   reg [3: 0] out;
 //***define events***
   event add, mult;
   always@ (a or b)
      if (a> b)
         -> add; // *** trigger event ***
      else
         -> mult; // *** trigger event ***
// *** respond to an   event trigger ***
   always @( add)
      out = a + b;
// *** respond to an event trigger ***
   always @( mult)
       out = a * b;
endmodule

在例子中,事件add和mult不是端口,但定义为事件,它们没有对应的硬件实现。

  • 是一种数据类型,能在过程块中触发一个使能。
  • 在引用前必须声明
  • 没有持续时间,也不具有任何值
  • 只能在过程块中触发一个事件。
  • ->操作符用来触发命名事件。
  1. a大于b,事件add被触发,控制传递到等待add的always块。
  2. 如果a小于或等于b,事件mult被触发,控制被传送到等待mult的always块。

2.行为描述举例

always wait (set)
begin
    @( posedge clk) #3  q = 1;
    #10 q = 0;
    wait (! set);
end

image
在上面的例子中发生下面顺序的事件:

  1. 等待set=1,忽略时刻10的clk的posedge。
  2. 等待下一个clk的posedge,它将在时刻30发生。
  3. 等待3个时间单位,在时刻33(30+3)置q=1。
  4. 等待10个时间单位,在时刻43(33+10)置q=0。
  5. 等待在时刻48发生的set=0。
  6. 等待在时刻70发生且与clk的上升沿同时发生的set=1。
  7. 等待下一个上升沿。时刻70的边沿被忽略,因为到达该语句时时间已经过去了,如例子所示,clk=1。

重要内容:在实际硬件设计中,事件6应该被视为一个竞争(race condition)。在仿真过程中,值的确定倚赖于顺序,所以是不可预测的。这是不推荐的建模类型。

3.RTL描述举例

下面的RTL例子中只使用单个边沿敏感时序控制。

module dff (q, qb, d, clk);
      output q, qb;
      input d, clk;
      reg q, qb;
   always @( posedge clk)
   begin
       q = d;
      qb = ~d;
   end
endmodule

微信公众号获取更多FPGA相关源码:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值