verilog总复习_第1页
verilog总复习_第2页
verilog总复习_第3页
verilog总复习_第4页
verilog总复习_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1. Verilog 的主要应用包括:a) ASIC 和 FPGA 工程师编写可综合的 RTL 代码b) 使用高抽象级描述仿真系统,进行系统结构开发c) 测试工程师用于编写各种层次的测试程序d) 用于 ASIC 和 FPGA 单元或更高层次的模块的模型开发2. Verilog 模型可以是实际电路的不同级别的抽象, 这些抽象的级别包括:(a) 行为级(系统说明)-设计文档/ 算法描述(b) RTL/功能级, Verilog(c) 门级/结构级, Verilog(d) 版图/物理级, 几何图形Verilog 既是一种行为描述的语言也是一种结构描述语言。行为综合综合前仿真逻辑综合综合后仿真版图3. Verilog 可以在三种抽象级上进行描述:a. 行为级(Behavioral level) 1. 用功能块之间的数据流对系统进行描述2. 在需要时在函数块之间进行调度赋值。 b. RTL 级/功能级(RTL level or Functional level) 1. 用功能块内部或功能块之间的数据流和控制信号描2. 基于一个已定义的时钟的周期来定义系统模型c. 结构级/门级(Structural level or Gate level)1. 用基本单元(primitive)或低层元件(component) 的连接来描述系统以得到更高的精确性,特别是时序方面。2. 在综合时用特定工艺和低层元件将 RTL 描述映射到门级网表 4. a. Behavioral input a, b, s1;output out; reg out;always (s1 or a or b)if (!s1)out = a;elseout = b;endmoduleabseloutb. Structuralmodule muxtwo (out, a, b, s1 ); input a, b, s1;output out; reg out;not U1 (ns1, s1);and #1 U2 (sela, a, ns1);and #1 U3 (selb, b, s1);or #2 U4 (out, sela, selb);endmodule5. 基本词法:空白符、注释、常量、字符串、标识符编译指令基本语法:- 模块结构- 端口定义(input 、output、inout)- 数据类型(net、register、parameter)- 功能描述(assign 语句、always 语句) 6. 基本构件 module(Verilog 程序包含:端口定义,I/O 说明,内部信号声明,功能定义)module DFF (q, qb, d, clk, clr);/ 端口说明output q, qb;input d, / input dataclk, /*input clock */ clr;reg q;wire qb, d, clk, clr;/*clk is posedge and clr is active low*/assign qb = !q;always (posedge clk or negedge clr)if(!clr)q 其中 size :十进制数表示的二进制位数(bit),缺省为 32 位base:数基,可为 b、o、d、h 进制,缺省为 10 进制value:是所选数基内任意有效数字,包括 X(表不定值) 、Z (表高阻值) 。实数常量可以用十进制或科学表示法表示。12 无符号十进制数(32 位) 二进制整数(b 或 B)H83a 无符号 16 进制数(32 位) 十进制整数(d 或 D)8b1100_0001 8 位二进制数 十六进制整数( h 或 H)64hff01 64 位 16 进制数 八进制整数(o 或 O)9O17 9 位 8 进制数32bz01x 32 位 2 进制数 3b1010_ 1101 3 位 2 进制数,截为 3b1016.3 十进制实数32e-4 科学法表示 0.00324.1E3 科学法表示 4100整数的大小可以定义也可以不定义。整数表示为: 数字中(_ )忽略,便于查看 没有定义大小(size)整数缺省为 32 位 缺省数基为十进制 数基(base)和数字(16 进制 )中的字母无大小写之分 当数值 value 大于指定的位数时,截去高位。如 2b1101 表示的是 2b01;小于指定的位数?实数常量 实数可用科学表示法或十进制表示 科学表示法表示方式:, 表示:尾数10 指数 负数 一个数字可以被定义为负数,只需在位宽前加个减号,必须在最前面。下画线 不可用在位宽和进制处,只能用在具体的数字之间。10.字符串,格式控制符Verilog 中,字符串大多用于显示信息Verilog 没有字符串数据类型注意点: 字符串要在一行中用双引号括起来,不能跨行。字符串中可以使用一些 C 语言转义(escape)符,如t n可以使用一些 C 语言格式符(如%b)在仿真时产生格式化输出.”This is a normal string”This string has a t tab and ends with a new linen”This string formats a value: val = %b” 格式符:格式符%0d 表示没有前导 0 的十进制数%h %o %d %b %c %s %v %m %tHex oct dec bin ACSII string strength module time转义符:t n ”Tab 换行 反斜杠 双引号标识符: a. 标识符是用户在描述时给 Verilog 对象起的名字b. 标识符必须以字母 (a-z, A-Z) 或( _ )开头,后面可以是字母、数字、( $ )或( _ )c. 最长可以是 1023 个字符d. 标识符区分大小写 , sel 和 SEL 是不同的标识符e. 模块、端口和实例的名字都是标识符.无效标识符举例:34net / 开头不是字母、 “_”a*b_net / 包含了非字母、数字、 “$”、 “_”n238 / 包含了非字母、数字、 “$”、 “_”Verilog 区分大小写,所有 Verilog 关键词使用小写字母。11.系统任务和函数($ )$符号指示这是系统任务和函数;系统函数有很多,如:- 返回当前仿真时间$time- 显示/ 监视信号值($display, $monitor)- 停止仿真$stop- 结束仿真$finish# delay延迟声明( )编译指令:resetall 复位所有的编译指令为缺省值,应该在其它编译指令之前使用 这些编译指令使仿真编译器进行一些特殊的操作 编译指令一直保持有效直到被覆盖或解除define文本替换: define ,替换 define not_delay #1define and_delay #2define or_delay #1 module MUX2_1 (out, a, b, sel);output out;input a, b, sel;not not_delay not1( sel_, sel); /此处编译是就用#1 替换 not_delay,提高可读性include文本包含: a. include 在文件中保存全局的或经常用到的一些定义 ,如文本宏b. 在模块内部 include 一些任务(tasks),提高代码的可维护性.timescale说明 时间单位及精度( timescale 必须在模块之前出现)P101格式: timescale / 如:timescale 1 ns / 100 pstime_unit: 延时或时间的测量单位time_precision: 延时值超出精度要先舍入后使用注意点:1. time_precision 不能大于 time_unit2. time_precision 和 time_unit 的表示方法:integer unit_string3. precision 的时间单位应尽量与设计的实际精度相同 (timescale 1s / 1ps,则仿真器在 1 秒内要扫描其事件序列 1012 次;而timescale 1s/1ms 则只需扫描 103)4. 如果没有 timescale 说明将使用缺省值,一般是 s.5. $time 输出的总是整数(需先四舍五入后再输出)6.$time 显示时刻受时间尺度比例的影响。 $realtime 输出的是实型数。7.所有 timescale 中的最小值决定仿真时的最小时间单位,这是因为仿真器必须对整个设计进行精确仿真。12.端口和它的数据类型 P27三种端口:input output inout格式:信号位宽1:0三种数据类型:net(连线): 表示器件之间的物理连接(wire,tri)真值表见 P32register(寄存器):表示抽象存储元件parameter(参数): 运行时的常数(run-time constants)寄存器的类型:reg 可定义的无符号整数变量(二进制补码)integer 32 位有符号整数变量,通常用作不会由硬件实现的的数据处理real 双精度的带符号浮点变量time 64 位无符号整数变量,用于仿真时间的保存与处理realtime 与 real 内容一致,但可以用作实数仿真时间的保存与处理。reg a; /一个标量寄存器wand w; / 一个标量 wand 类型 netreg 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 为 bit013. Verilog 采用 4 值逻辑 0, 1,X,Z0表示 Zero Low 1表示 One,High Z表示高阻状态,也就是没有任何驱动X表示信号状态时表示未知;当表示条件判断时(casex 或 casez 中)表示不关心14.参数(重载)用参数声明一个可变常量,常用于定义延时及宽度变量。parameter;参数的定义是局部的,只在当前模块中有效。可一次定义多个参数,用逗号隔开 在使用常数的地方都可以使用参数参数定义可使用以前定义的整数和实数参数 参数重载( overriding ): defparam 语句(现在综合工具还不支持)1. 可用 defparam 语句在编译时重载参数值2. defparam 语句引用参数的层次化名称 3. 使用 defparam 语句可单独重载任何参数值 15. Register 数组 : 1.声明一个寄存器数组: integer NUMS 7:0; /8 个整数变量的数组P34 time t_vals 3:0; /4 个 time 变量的数组2.数据类型为 reg 的数组通常称为一个 memory:reg 15:0 MEM 0:1023; /1K x 16-bit memory arrayreg 7:0 PREP hFFFE:hFFFF; /2 x 8-bit memory array3. 可以使用 parameters 建模 memory size16.块语句:用来将多个语句组织在一起,使得他们在语法上如同一个语句 P45分为两类:顺序块:语句置于关键字 begin 和 end 之间,块中的语句以顺序方式执行并行块:关键字 fork 和 join 之间的是并行块语句,块中的语句并行执行顺序块的特点:1.块内语句是按顺序执行的。P45 2.每一条语句的延迟是相对于前一条语句的仿真时间而言的。3.直到最后一条语句执行完毕,程序流程控制才跳出该语句块。并行块的特点:1.块内语句是同时执行的。2. 块内每条语句的延迟时间是相对于程序控制进入到块内的仿真时间的。3延迟时间是用来给赋值语句提供执行程序的。4.当按时间时序排序在最后的语句执行完后或一个 disable 语句执行时,程序流程控制跳出该程序块过程语句有两种: initial : 只执行一次 always :循环执行 所有过程在时间 0 执行一次。过程块之间、assign 语句之间、过程块与 assign 语句均为并行执行always (时序控制) 1. 在过程块中的赋值称为过程赋值begin/fork 2. 表达式左边的信号必须是寄存器类型(如 reg 类型)过程赋值语句; 3. 等式右边可以是任何有效的表达式,数据类型也没有限制 系统任务和函数; 4. 如果信号没有声明则缺省为 wire 类型,使用过程 高级描述语句; 赋值语句给 wire 赋值会产生错误if 语句;case 语句;循环语句;end/join17.操作符的优先级:最高最低18.持续赋值(continuous assignment) 描述的是组合逻辑,在过程块外部使用 ,用于 net 驱动,可以是显式或隐含在等式左边可以有一个简单延时说明(只限于在表达式左边用#delay 形式)19. 结构描述用门及门的连接描述器件的功能基本单元Verilog 语言已定义的具有简单逻辑功能的功能模型(models) 模块module MUX4x1(Z, D0, D1, D2, D3, S0, S1);output Z;input D0, D1, D2, D3, S0, S1;and (T0, D0, S0_, S1_),(T1, D1, S0_, S1),(T2, D2, S0, S1_),(T3, D3, S0, S1);not (S0_, S0), (S1_, S1);or (Z, T0, T1, T2, T3);endmodulemodule rs_latch (y, yb, r, s);output y, yb;input r, s;nor n1(y, r, yb);nor n2(yb, s, y);endmodule结构描述等价于逻辑图,都是连接简单元件构成更复杂元件通 过 门 的 实例 使 用 门忽 略 了 门 的实 例 名同 一 种 门 可以 通 过 一 个LatchMUX4x1 结构描述等价于逻辑图,它们都是连接简单元件来构成更为复杂的元件;Verilog 使用其连接特性完成简单元件的连接; 在描述中使用元件时,通过建立这些元件的实例来完成; 上面的例子中 MUX 是没有反馈的组合电路,使用中间或内部信号将门连接起来;描述中忽略了门的实例名,并且同一种门的所有实例可以在一个语句中实例化; 上面的锁存器(latch)是一个时序元件,其输出反馈到输入上;它没有使用任何内部信号;它使用了实例名并且对两个 nor 门使用了分开的实例化语句; 基本单元引脚的数目由连接到门上的 net 的数量决定,因此当基本单元输入或输出的数量变化时用户不需要重定义一个新的逻辑功能; 所有门(除了 not 和 buf)可以有多个输入,但只能有 一个输出; not 和 buf 门可以有多个输出,但只能有 一个输入;20. 基本单元实例化: 在端口列表中,先说明输出端口,然后是输入端口 实例化时实例的名字是可选项and (out, in1, in2, in3, in4); / unnamed instancebuf b1 (out1, out2, in); / named instance 延时说明是可选项,所说明的延时是固有延时。输出信号经过所说明的延时才变化。没有说明时延时为 0。 notif0 #3.1 n1 (out, in, cntrl); / delay specified信号强度说明是可选项。 not (strong1, weak0) n1 (inv, bit); / strength specifiedmodule 实例化:模块实例化时实例必须有一个名字 使用位置映射时,端口次序与模块的说明相同使用名称映射时,端口次序与位置无关没有连接的输入端口初始化值为 x实例数组:实例名字后有范围说明时会创建一个实例数组。在说明实例数组时,实例必须有一个名字 (包括基本单元实例 )。其说明语法为:(); bufif0 u2:0 (out, in, en);bufif0 u2 (out2, in2, en); bufif0 u1 (out1, in1, en); bufif0 u0 (out0, in0, en);如果范围中 MSB 与 LSB 相同,则只产生一个实例;一个实例名字只能有一个范围。21操作符的运算(1 )算术操作符:module arithops (); 注意:integer 和 reg 类型在算术运算时的差别。parameter five = 5; integer 是有符号数,而 reg 是无符号数。integer ans, int; reg 3: 0 rega, regb;reg 3: 0 num;initial beginrega = 3;regb = 4b1010;int = -3; /int = 11111111_1101endinitial fork#10 ans = five * int; / ans = -15#20 ans = (int + 5) / 2; / ans = 1#30 ans = five / int; / ans = -1#40 num = rega + regb; / num = 1101 在整数除法中,余数舍弃#50 num = rega + 1; / num = 0100 如果操作数的某一位是 x 或 z,则结果为x#60 num = int; / num = 1101 负数赋值给 reg 或其它无符号变量时使用 2 的补码表示#70 num = regb % rega; / num = 1 模运算中使用第一个操作数的符号#80 $finish;joinendmodule(2 )按位操作符module bitwise ();reg 3: 0 rega, regb, regc;reg 3: 0 num;initial beginrega = 4b1001;regb = 4b1010;regc = 4b11x0;endinitial fork#10 num = rega / num = 0000#20 num = rega / num = 1000#30 num = rega | regb; / num = 1011#40 num = regb / num = 10x0#50 num = regb | regc; / num = 1110#60 $finish;joinendmodule notregc = 4b1x10;num = regb 当两个操作数位数不同时,位数少的操作数零扩展到相同位数a = 4b1011;b = 8b01010011;c = a | b; / a零扩展为(3 )逻辑操作符module logical ();parameter five = 5;reg ans;reg 3: 0 rega, regb, regc;initialbeginrega = 4b0011;regb = 4b10xz;regc = 4b0z0x;endinitial fork#10 ans = rega #20 ans = rega | 0;#30 ans = rega #40 ans = regb #50 ans = regc | 0;#60 $finish;joinendmodule! notreg 9: 0 num, num1;reg 7: 0 rega, regb;initial rega = 8b0000_1100;initial fork#10 num 3; / num = 00_0000_0001#20 regb 3 ; / regb = 0000_0001#30 num 2; /rega = 1111_1100#50 num1 2;/num1=00_1111_1100#60

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论