
verilog数据类型及应用.ppt
96页第六章 Verilog的数据类型及逻辑系统• 学习Verilog逻辑值系统• 学习Verilog中不同类的数据类型• 理解每种数据类型的用途及用法• 数据类型说明的语法学习内容:Verilog采用的四值逻辑系统’0’, Low, False, Logic Low, Ground,VSS, Negative Assertion‘1’, High, True, Logic High, Power,VDD, VCC, Positive Assertion’X’ Unknown: Occurs at Logical Which Cannot be Resolved ConflictHiZ, High Impedance, Tri- Stated,Disabled Driver (Unknown)主要数据类型Verilog主要有三类(class)数据类型:• net (线网) : 表示器件之间的物理连接 • register (寄存器) :表示抽象存储元件 • parameters(参数) : 运行时的常数(run-time constants)net(线网)net需要被持续的驱动,驱动它的可以是门和模块。
当net驱动器的值发生变化时, Verilog自动的将新值传送到net上在例 子中,线网out由or门驱动当or门的输入信号置位时将传输到线网net上net类的类型(线网)• 有多种net类型用于设计(design-specific)建模和工艺 (technology-specific)建模• 没有声明的net的缺省类型为 1 位(标量)wire类型但这个 缺省类型可由下面的编译指导改变:`default_nettype net类类型功 能wire, tri supply1, supply0 wor, trior wand, triand trireg tri1, tri0标标准内部连连接线线(缺省) 电电源和地 多驱动驱动 源线线或 多驱动驱动 源线线与 能保存电电荷的net 无驱动时驱动时 上拉/下拉综合编译 器不支持 的net类型net类的类型(线网)•wire类型是最常用的类型,只有连接功能•wire和tri类型有相同的功能用户可根据需要将线网定义为wire或tri以提高 可读性例如,可以用tri类型表示一个net有多个驱动源或者将一个net声 明为tri以指示这个net可以是高阻态Z(hign-impedance)。
可推广至wand和 triand、wor和trior•wand、wor有线逻辑功能;与wire的区别见下页的表•trireg类型很象wire类型,但trireg类型在没有驱动时保持以前的值这个值的强度随时间减弱•修改net缺省类型的编译指导:`default_nettype nettype不能是supply1和supply0net类在发生逻辑冲突时的决断• Verilog有预定义的决断函数• 支持与工艺无关的逻辑冲突决断 – wire-and用于集电极开路电路 – wire-or用于射极耦合电路寄存器类 (register)•寄存器类型在赋新值以前保持原值•寄存器类型大量应用于行为模型描述及激励描述在下面的例子中, reg_a、reg_b、reg_sel用于施加激励给2:1多路器•用行为描述结构给寄存器类型赋值给reg类型赋值是在过程块中寄存器类的类型• 寄存器类有四种数据类型寄存器类型 功能reg 可定义的无符号整数变量,可以是标量(1位)或矢量,是最常用的寄存器类型integer 32位有符号整数变量,算术操作产生二进制补码 形式的结果通常用作不会由硬件实现 的的数据处理。
real 双精度的带符号浮点变量,用法与integer相同 time 64位无符号整数变量,用于仿真时间 的保存与处理 realtime 与real内容一致,但可以用作实数仿真时间 的保存与处理• 不要混淆寄存器数据类型与结构级存储元件,如udp_dffVerilog中net和register声明语法• net声明[range] [delay] [, net_name];net_type: net类型 range: 矢量范围,以[MSB:LSB]格式 delay: 定义与net相关的延时 net_name: net名称,一次可定义多个net, 用逗号分开 • 寄存器声明[range] [, reg_name]; reg_type:寄存器类型 range: 矢量范围,以[MSB:LSB]格式只对reg类型有效 reg_name :寄存器名称,一次可定义多个寄存器,用逗号分开Verilog中net和register声明语法• 举例: reg a; //一个标量寄存器 wand w; // 一个标量wand类型net reg [3: 0] v; // 从MSB到LSB的4位寄存器向量 reg [7: 0] m, n; // 两个8位寄存器 tri [15: 0] busa; // 16位三态总线 wire [0: 31] w1, w2; // 两个32位wire,MSB为bit0选择正确的数据类型module top; wire y; reg a, b; DUT u1 (y, a, b) ; initial begin a = 0; b = 0;#5 a = 1;end endmodulemodule DUT (Y, A, B); output Y; input A, B; wire Y, A, B; and (Y, A, B) ; endmodule输入端口可以由 net/register驱动,但输 入端口只能是net输出端口可以是 net/register类型,输出 端口只能驱动net在过程块中只能给 register类型赋值若Y,A,B说明为 reg则会产生错误。
in1in2OABY双向端口输入/输出只 能是net类型选择数据类型时常犯的错误•用过程语句给一个net类型的或忘记声明类型的信号赋值信息:illegal …… assignment. •将实例的输出连接到声明为register类型的信号上信息: has illegal output port specification. •将模块的输入信号声明为register类型信息:incompatible declaration, ……下面所列是常出的错误及相应的错误信息(error message)•信号可以分为端口信号和内部信号出现在端口列表中的信号是端口信号,其它的信号为内部 信号 •对于端口信号,输入端口只能是net类型输出端口可以是net类型,也可以是register类型若 输出端口在过程块中赋值则为register类型;若在过程块外赋值(包括实例化语句),则为net类 型 •内部信号类型与输出端口相同,可以是net或register类型判断方法也与输出端口相同若在 过程块中赋值,则为register类型;若在过程块外赋值,则为net类型 •若信号既需要在过程块中赋值,又需要在过程块外赋值。
这种情况是有可能出现的,如决断信 号这时需要一个中间信号转换信号类型确定方法总结如下:选择数据类型时常犯的错误举例修改前:module example(o1, o2, a, b, c, d);input a, b, c, d;output o1, o2;reg c, d;reg o2and u1(o2, c, d);always @(a or b)if (a) o1 = b; else o1 = 0;endmodule修改后:module example(o1, o2, a, b, c, d);input a, b, c, d;output o1, o2;// reg c, d;// reg o2reg o1;and u1(o2, c, d);always @(a or b)if (a) o1 = b; else o1 = 0;endmoduleexample.v选择数据类型时常犯的错误举例Compiling source file “example.v“ Error! Illegal left-hand-side assignment [Verilog-ILHSA] “example.v“, 11: o1 = b; Error! Illegal left-hand-side assignment [Verilog-ILHSA] “example.v“, 12: o1 = 0; 2 errors第一次编译信息verilog –c example.v第二次编译信息Compiling source file “example.v“ Error! Incompatible declaration, (c) defined as input at line 2 [Verilog-IDDIL] “example.v“, 5: Error! Incompatible declaration, (d) defined as input at line 2 [Verilog-IDDIL] “example.v“, 5: Error! Gate (u1) has illegal output specification [Verilog-GHIOS] “example.v“, 8: 3 errors参数(parameters)•用参数声明一个可变常量,常用于定义延时及宽度变量。
•参数定义的语法:parameter ; •可一次定义多个参数,用逗号隔开 •在使用文字(literal)的地方都可以使用参数 •参数的定义是局部的,只在当前模块中有效 •参数定义可使用以前定义的整数和实数参数module mod1( out, in1, in2);. . . parameter cycle = 20, prop_ del = 3,setup = cycle/2 - prop_del,p1 = 8,x_ word = 16’bx,file = “/ usr1/ jdough/ design/ mem_ file. dat“;. . .wire [p1: 0] w1; // A wire declaration using parameter. . . endmodule注意:参数file不是string, 而是一个整数,其值是所有 字母的扩展ASCII值若 file=“AB”,则file值为 8‘h4142用法:$fopen(file);$display(“%s”, file);参数重载(overriding)•可用defparam语句在编译时重载参数值 •defparam语句引用参数的层次化名称 •使用defparam语句可单独重载任何参数值。
Defparam语句(现在综合工具还不支持)module mod1( out, in1, in2);. . .parameter p1 = 8,real_constant = 2.039,x_word = 16’bx,file = “/usr1/jdough/design/mem_file.dat“;. . . endmodulemodule test; . . .mod1 I1( out, in1, in2);defp。
