数据流建模
Verilog中数据流建模是对数字电路中的组合逻辑电路的建模方法。数据流建模主要使用assign关键词引导的连续赋值语句进行逻辑描述。对于连续赋值语句只要输入端操作数发生变化,该语句就会重新计算并刷新赋值结果。连续赋值语句只能对线网类型的变量进行操作,而不能对寄存器类型的变量进行赋值。具体的赋值过程有显示连续赋值和隐式连续赋值两种方式。
显示连续赋值语句
显示连续赋值就是将变量的声明和语句和赋值语句分开写,具体语法格式如下:
<net_declaration><range><name>;
assign #<delay><name> = Assignment expression;
上面语法格式中的第一句是对变量的声明;第二条语句是assign关键字引导的连续赋值语句。
隐式连续赋值语句
隐式连续赋值就是将变量的声明和对该变量的连续赋值过程写到一条语句中。不显式的写出assign关键字。语法格式如下:
<net_declaration><drive_strength><range> #<delay><name> = assignment expression;
注意:
1.上面两种连续赋值语句中的变量类型可以是除了trireg类型以外的任何一种连线型数据类型。
2.<drive_strength>只能在隐式连续赋值语句中指定,并且是可选的。用于指定连线型变量受到的驱动强度。它由“对1驱动强度”和“对0驱动强度”两项组成。
wire(weak0,strong1) out = in1&in2;
上面的例子中,out被赋值为0时驱动强度时weak,被赋值为1时驱动强度是strong。如果缺省驱动强度,则默认为(strong0,strong1)。
3.#<delay>是连续赋值时的延时项,语法格式如下:
#(delay1, delay2, delay3)
delay1,delay2,delay3分别是变量从0到1,从1到0和变量转移到高阻态时的延时值。
assign #(3,2,4) c = a&b;
上面的语句说明当a&b的值发生变化时,需要等待一个延时时间变化后的值才会赋值给c。具体延时时间为:如果c从0到1则需要延时3个时间单位;其他情况以此类推。
另外,在没有指定延时时,赋值语句右边的表达式任何一个变量有变化,表达式立即被重新计算。并且结果会马上赋值给左边的连线型变量。
4.连续赋值语句不能出现在过程块中(后面会对过程块进行介绍)。
5.多个连续赋值语句是并行关系,程序开始后会一起被执行,与在程序中的位置没有关系。
6.连续赋值语句中的延时具有硬件电路中惯性延时的特性。即任何小于其延时时间的信号的变化脉冲都会被过滤掉,不会向下传输。