verilog小技巧笔记

不少用法用过也容易忘记,之后在这里记录:
Verilog里div_cnt == {16{1’b1}}是啥意思:16个1赋值给div_cntweb

Verilog强制激励语法

  1. 在一个过程块中,能够用两种不一样的方式对信号变量或表达式进行连续赋值。
    过程连续赋值每每是不能够综合的,一般用在测试模块中。
    两种方式都有各自配套的命令来中止赋值过程。
    两种不一样方式均不容许赋值语句间的时间控制。网络

  2. assign和deassign 适用于对寄存器类型的信号
    例如:RTL级上的节点或测试模块中在多个地方被赋值的信号进行赋值。svg

    initial begin测试

    #10  assign top.dut.fsml.state_reg = `init_state;
    
     #20  deassign  top.dut.fsml.state_reg;

    end.net

  3. force 和 release 用于寄存器类型和网络链接类型(例如:门级扫描寄存器的输出)的强制赋值,强制改写其它地方的赋值。code

    initial beginxml

    # 10 force top.dut.counter.scan_reg.q=0;
    
      # 20 release top.dut.counter.scan_reg.q;

    endblog

在以上两个例子中,在10到20这个时间段内,网络或寄存器类型的信号被强制赋值,而别处对该变量的赋值均无效。it

注意:变量

一、force的赋值优先级高于assign。
 二、若是先使用assign,再使用force对同一信号赋值,则信号的值为force所赋的值,当执行release后,则信号的值为assign所赋的值。
 三、若是用force对同一个信号赋了几回值,再执行release,则全部赋的值均再也不存在。
 四、能够对信号的某(肯定)位、某些(肯定)位或拼接的信号,使用force和release赋值;但不能对信号的可变位使用force和release 来赋值。
 五、不能对寄存器类型的信号某位或某些位使用 assign 和deassign 来赋值。

赋值语句

七、过程赋值语句always@和连续赋值语句assign的区别:

(1)wire型用于assign的赋值,always@块下的信号用reg型。这里的reg并非真正的触发器,只有敏感列表内的为上升沿或降低沿触发时才综合为触发器。

(2)另外一个区别,举例:

      wire     a;

      reg      b;

     assign     a = 1'b0;

     always@(*)

             b = 1'b0;

     上面例子仿真时a将会是0,可是b的状态是不肯定的。由于Verilog规定,always@(*)中的*指的是该always块内的全部输入信号的变化为敏感列表,就是说只有当always@(*)块内输入信号发生变化,该块内描述的信号才会发生变化。

    像always@(*)  b= 1'b0; 中因为1‘b0是个常数,一直没有变化,因为b的足组合逻辑输出,全部复位时没有明确的值--即不肯定状态,又由于always@(*)块内没有敏感信号变化,此时b信号一直保持不变,即不肯定是啥,取决于b的初始状态

————————————————
原文连接:https://blog.csdn.net/u013025203/article/details/53410715

verilog 大括号{}做用

一、{ }表示拼接,{第一位,第二位…};
二、{{ }}表示复制,{4{a}}等同于{a,a,a,a};
因此{13{1‘b1}}就表示将13个1拼接起来,即13’b1111111111111。

BD导出为tcl脚本

vivado环境下 在TCL控制台输入以下命令将BD导出为tcl脚本: write_bd_tcl E:/dp_tx_ex/bdtcl.tcl