Verilog HDL 语言具有下述描述能力:设计的行为特性、设计的数据流特性、设计的结构组成以及包含响应监控和设计验证方面的时延和波形产生机制。
Verilog HDL语言提供了编程语言接口,通过该接口可以在模拟、验证期间从设计外部访问设计,包括模拟的具体控制和运行。
* 用户定义原语(UDP)创建的灵活性。用户定义的原语既可以是组合逻辑原语,也可以是时序逻辑原语。
* 能够描述层次设计,可使用模块实例结构描述任何层次。
* 设计能够在多个层次上加以描述,从开关级、门级、寄存器传送级(RTL)到算法级,包括进程和队列级。
* 同一语言可用于生成模拟激励和指定测试的验证约束条件,例如输入值的指定。
* 可以显式地对并发和定时进行建模。
4. 语言中的什么特性能够用于描述参数化设计?
设计的数据流行为使用连续赋值语句进行描述; 时序行为使用过程结构描述
Module instantiation
Gate instantiation
UDP instantiation
Continuous assignment
assign #2 Sum = A ^ B;
assign #5 Carry = A & B;
模块包含两条描述半加器数据流行为的连续赋值语句。从这种意义上讲,这些语句在模块中出现的顺序无关紧要,这些语句是并发的
使用编译指令将时间单位与物理时间相关联。
右边表达式使用的操作数无论何时发生变化, 右边表达式都重新计算,
当EN在第5 ns变化时,语句3、4、5和6执行。这是因为EN是这些连续赋值语句中右边表达式的操作数。Z[0]在第7 ns时被赋予新值0。当A在第15 ns变化时, 语句1、5和6执行。执行语句5和6不影响Z[0]和Z[1]的取值。执行语句5导致Z[2]值在第17 ns变为0。执行语句1导致Abar在第16 ns被重新赋值。由于Abar的改变,反过来又导致Z[0]值在第18 ns变为1。
请注意连续赋值语句是如何对电路的数据流行为建模的;这种建模方式是隐式而非显式的建模方式。
只有寄存器类型数据能够在这两种语句中被赋值。
always 语句中有一个与事件控制(紧跟在字符@ 后面的表达式)
在顺序过程中出现的语句是过程赋值模块化的实例。过程赋值可以有一个可选的时延。
4) 模块实例 (创建层次结构)。
模块包含门的实例语句,也就是说包含内置门xor、and和or 的实例语句。
列表中的第一个是门输出,余下的是输入。例如,S1与xor 门实例X1的输出连接,而A和B与实例X1的输入连接。
input [SIZE:1]
wire [ 1: SIZE-1] FTemp;
FA1( .A (FA[1]), .B(FB[1]), .Cin(FCin),.Sum(FSum[1]), .Cout(FTemp[2])),
FA3(FA[3], FB[3], FTemp[2], FSum[3], FTemp[3],
端口的名称和它连接的线网被显式描述(每一个的形式都为“.port_name (net_name))。
模块描述中可以包含实例化的门、模块实例化语句、
只要A或B上有事件发生,门实例语句即被执行
而且提供对激励、控制、存储响应和设计验证的建模能力。
激励和控制可用初始化语句产生。
FA_Seq F1(PA, PB, PCi, PSum, PCo); // 定位。
#5 $display (“PA, PB, PCi = %b%b%b”, PA, PB, PCi,
“ : : : PCo, PSum=%b%b”, PCo, PSum);
使用了一个for循环语句,在PA、PB和PCi上产生波形
for 循环中的第一条赋值语句用于表示合并的目标。自右向左,右端各相应的位赋给左端的参数。
Pal在初始化语句内被局部定义。
ONLY_ONCE是顺序过程标记。
PA, PB, PCi = 000 ::: PCo, PSum = 00
PA, PB, PCi = 001 ::: PCo, PSum = 01
验证与非门交叉连接构成的RS_FF模块的测试模块如下例所示。
nand #1 (Q, R, Qbar);
7. 在顺序过程中何时需要定义标记?
8. 找出下面连续赋值语句的错误。
assign Reset = #2 ^ WriteBus;
系统任务和系统函数
/OutGate 与OutGate相同。
(编译过程可跨越多个文件),
* `default_nettype
* `timescale
* `celldefine, `endcelldefine
reg [ `MAX_BUS_SIZE - 1:0 ] AddReg;
该指令用于为隐式线网指定线网类型。
`default_nettype wand
该实例定义的缺省的线网为线与类型。
and # (5.22, 6.17 ) Al (Z, A, B);
当一个设计中的多个模块带有自身的`timescale编译指令时将发生什么?
设计中的所有模块最小时间精度为100 ps。因此,所有延迟(特别是模块TB中的延迟)将换算成精度为100 ps。延迟52
ns现在对应520*100 ps,104对应1040*100 ps,150对应1500*100 ps
正偏电路状态或者为反偏电路状态。
`unconnected_drive pull1
2) 基数格式
32在6位二进制形式中为110001
7'Hx 7位x(扩展的x), 即xxxxxxx
8'h 2 A 在位长和字符之间,以及基数和数值之间允许出现空格
'o721 9位八进制数
3'b1001_0011与3'b011 相等
5'H0FFF 与5'H1F 相等
为存储字符串“INTERNAL
ERROR”,变量需要8*14位。
reg [1 : 8*14] Message;
它的值由驱动元件的值决定,例如连续赋值或门的输出。
* tri
* wor
* trior
* wand
* triand
* trireg
* tri1
* tri0
* supply0
* supply1
当一个线网有多个驱动器时,即对一个线网有多个赋值时,不同的线网产生不同的行为。
由于它是线或线网,Rde的有效值由使用驱动源的值(右边表达式的值)的线或(wor)表(参见后面线或网的有关章节)决定。
连线与三态线(tri)网语法和语义一致;三态线可以用于描述多个驱动源驱动同一根线的线网类型;并且没有其他特殊的意义。
wire [3:2] Cla, Pla, Sla;
tri [ MSB-1 : LSB +1] Art;
如果多个驱动源驱动一个连线(或三态线网),
由于Cla是一个向量,每位的计算是相关的。例如,如果第一个右侧表达式的值为01x,
wor [MSB:LSB] Art;
wand [-7 : 0] Dbus;
triand Reset, Clk;
trior [MAX-1: MIN-1] Rdx, Sdx, Bdx;
此线网存储数值(类似于寄存器),并且用于电容节点的建模。
trireg [1:8] Dbus, Abus;
`default_nettype wand
任何未被说明的网缺省为1位线与网。
寄存器可以取任意长度。寄存器中的值通常被解释为无符号数, 例如:
reg [1:4] Comb;
. . .
Comb = -2; //Comb 的值为14(1110),1110是2的补码。
reg [0:3 ] MyMem [0:63]
RamCnt = 'b01x1Z;
parameter TQ_FILE = " /home/bhasker/TEST/add.tq";
reg [1:8*2] Qpr;
integer [0:3] Ripple;
11. 写出在编译时覆盖参数值的两种方法。
'b1, 'hFBA //非定长的整数常量。
Cone = -6'o54/ 4;
net_or_reg_vector [bit_select_expr]
net_or_reg_vector [msb_const_expr:1sb_const_expr]