码迷,mamicode.com
首页 > 其他好文 > 详细

Verilog杂谈

时间:2016-01-19 23:42:37      阅读:352      评论:0      收藏:0      [点我收藏+]

标签:

1. Testbech总是用reg去驱动DUT的input端口,因为需要在仿真期间设置和保持输入端的值(例如在initial中设置初值,在always中设置激励值);

2. 避免对局部reg在定义时赋值,尽管这在计算机语言中很常见。例如:

   always @(...) begin : XXX

       reg c = 0;

       c = ...

   end

   上面的代码中,定义时赋值会使得c仅在初次进入always时被赋值为0,其后的值因reg特性而得以保留,从而综合工具(至少quartus)会综合出组合环路。改成如下形式即可:

   reg c;

   c = 0;

   c = ...

   modelsim甚至拒绝编译局部reg定义时赋值的代码。

3. 可以在always语句中给reg赋默认值

    always @(...) begin

          c = 1;            // c is a reg

          if(condition)

               c = 0;

    end

    这样即使没有else也不会综合出环路。(VHDL的process语句也可采用这种写法)

4. in/out/reg等等可直接写在端口列表中,例如:

    module(input clk, input[3:0] preset, output reg[3:0] cnt);

5. always begin/end中,“=”是阻塞式赋值,"<="是并发式赋值。所以:

    always @(posedge clk) begin

          d1 = d0;

          d2 = d1;      // 阻塞赋值,两条语句依次执行完毕后(d2=d1)等待下一个clk,对应综合结果一级锁存

          d3 <= d0;

          d4 <= d3;    // 并发赋值,两条语句(在同一个时钟边沿)并发执行,对应综合结果二级并行锁存

    end

    综合工具(至少quartus)拒绝综合always fork/join。

Verilog杂谈

标签:

原文地址:http://www.cnblogs.com/byeyear/p/5143718.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!