2.1 值集
0、1、x、z
当z值出现在门的输入处或在表达式中遇到它时,其效果通常与x值相同。值得注意的例外是金属氧化物半导体(MOS)基元,它可以通过z值。
2.2 线网和变量
线网数据类型可以便是结构实体之间的物理连接,例如门,但是线网数据类型并不能够存储值(trireg除外)。相反,它的值由驱动的值所决定,如果没有驱动连接到线网,它的值会是高阻抗除非线网类型为trireg。普通线网类型默认值为z,trireg数据类型默认值为x。
变量是存储数据元素的抽象,一个变量存储一个值,从一次赋值到下一次赋值过程中赋值语句充当触发器的作用,改变数据存储元素中的值。
reg,time和integer数据类型初始值为x,real和realtime变量默认为0.0
注意:线网和变量可以被赋负值,但是只有integer、real、realtime和signed reg、signed nets可以保留符号的意义。而time和unsiged reg/nets将会将赋值作为无符号值。
2.3 Vectors(矢量)
msb常数表达式指定的最高有效位是范围内左边的值,lsb常数表达式指定的最低有效位是范围内右边的值。msb常量表达式和lsb常量表达式都必须是常量整数表达式。msb和lsb常量表达式可以是任何整数值——正值、负值或零。lsb值可能大于、等于或小于msb值。
矢量net和reg应该遵循2^n定律,矢量中net和reg应被视为无符号数量。
关于对Vector的访问:
Vectored和scalared是可选的关键词在net和reg的声明中,如果实现关键词,对向量的某些操作或许受到限制,如果使用vectored,位选择、部分选择和强度规格或许不被允许且PLI可能认为对象没有扩展,而关键字scalared被使用的话,则允许位选择和部分选择,PLI也会认为对象可扩展。
tri1 scalared [63:0] bus64; //a bus that will be expanded
tri vectored [31:0] data; //a bus that may or may not be expanded
2.4 Strength
Charge strength只能在声明trireg的线网类型时使用。
charge strength可以使用下面的关键字之一表示电容的相对大小:small、medium、large,默认为medium。
trireg a; // trireg net of charge strength medium
trireg (large) #(0,0,50) cap1; // trireg net of charge strength large
// with charge decay time 50 time units
trireg (small)signed [3:0] cap2; // signed 4-bit trireg vector of
// charge strength small
Drive strength两种情况下使用:
用连续赋值语句对一个线性进行赋值
Verilog内建的原语逻辑门的门级输出(如and和bufif1等)
驱动强度分别为supply,strong,pull,weak,强度依次递减。
2.5 线网类型
wire和tri:wire和net在语法和功能上相同,区别于他们两个的是,wire可以被单个驱动,而tri可以被多个驱动。如果wire和tri来自于相同强度的多个源的逻辑冲突会使其x。
trireg:trireg存储一个值,用于建模电荷存储节点,trireg网可能处于两种状态之一。
驱动状态:当至少一个trireg驱动值有0,1,x的值,解析值传播至trireg网络并成为trireg网络的驱动值。
电容状态:当trireg所有驱动器都在高阻抗值,trireg网会保持其最后的驱动值,高阻抗并不会传播至trireg。
电容状态下,trireg的值可以是small、medium、large取决于trireg声明的大小。在驱动状态下,强度可以是supply、strong、pull、weak依靠于驱动的强度。
容性网络:两个或是多个trireg网络的连接,在容性网络中trireg处于容性状态,逻辑和强度值可以在trireg网络之间传播。
理想电容状态和电荷衰减:trireg可以无限期保持它的值,或是说它的电荷可以随着时间的推移而衰减。
tri0和tri1:tri0相当于一个有连续0值拉力驱动的线网,tri1相当于有连续1值拉力驱动的线网。当没有拉力驱动tri0时,它的拉力值为0,当没有拉力驱动tri1时,它的拉力值为1。
supply线网类型:模拟电路中的电源
reg的赋值是通过过程赋值完成,由于reg在赋值之间可以持有一个值,可以用来做寄存器,也可以用来做latch,但是不能作为存储元素,他是一个组合逻辑。(而wire的话,它并不能存储元素)
integer:integer被用来处理不被认为是硬件寄存器的数量。
time:通常和$time系统函数一起使用,时间变量用于在需要定时检查的情况下存储和操作模拟时间量。
integer和time的赋值方式应该和reg相同,过程赋值可以被用来触发它们的值的改变。
reg、integer和time变量都支持位选择和部分选择。
real不支持:位选择和向量选择、边缘敏感描述
参数的定义:
parametermsb = 7; // defines msb as a constant value 7
parametere = 25, f = 9; // defines two constant numbers
parameterr = 5.7; // declares r as a real parameter
parameterbyte_size = 8,
byte_mask = byte_size - 1;
parameteraverage_delay = (r + f) / 2;
修改参数:
1、defparam
2、模块实例化#()中
localparam:局部参数:不能被defparam和模块实例参数修改,局部参数可以有包含参数的常量表达式赋值,而这些表达式的值可以有defparam和模块实例参数值修改。
speparam:关键字specparam声明了一种特殊类型的参数,该参数仅用于提供计时和延迟值,但可以出现在任何没有赋值给参数且不属于声明范围规范的表达式中。
param和specparam的区别: