很多用法用过也容易忘记,以后在这里记录:
Verilog里div_cnt == {16{1’b1}}是啥意思:16个1赋值给div_cnt
Verilog强制激励语法
-
在一个过程块中,可以用两种不同的方式对信号变量或表达式进行连续赋值。
过程连续赋值往往是不可以综合的,通常用在测试模块中。
两种方式都有各自配套的命令来停止赋值过程。
两种不同方式均不允许赋值语句间的时间控制。 -
assign和deassign 适用于对寄存器类型的信号
例如:RTL级上的节点或测试模块中在多个地方被赋值的信号进行赋值。initial begin
#10 assign top.dut.fsml.state_reg = `init_state; #20 deassign top.dut.fsml.state_reg;
end
-
force 和 release 用于寄存器类型和网络连接类型(例如:门级扫描寄存器的输出)的强制赋值,强制改写其它地方的赋值。
initial begin
# 10 force top.dut.counter.scan_reg.q=0; # 20 release top.dut.counter.scan_reg.q;
end
在以上两个例子中,在10到20这个时间段内,网络或寄存器类型的信号被强制赋值,而别处对该变量的赋值均无效。
注意:
1、force的赋值优先级高于assign。
2、如果先使用assign,再使用force对同一信号赋值,则信号的值为force所赋的值,当执行release后,则信号的值为assign所赋的值。
3、如果用force对同一个信号赋了几次值,再执行release,则所有赋的值均不再存在。
4、可以对信号的某(确定)位、某些(确定)位或拼接的信号,使用force和release赋值;但不能对信号的可变位使用force和release 来赋值。
5、不能对寄存器类型的信号某位或某些位使用 assign 和deassign 来赋值。
赋值语句
7、过程赋值语句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 大括号{}作用
1、{ }表示拼接,{第一位,第二位…};
2、{{ }}表示复制,{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