《verilog语言学习17-22.ppt》由会员分享,可在线阅读,更多相关《verilog语言学习17-22.ppt(122页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、Verilog的任务及函数的任务及函数 结构化设计是将任务分解为较小的,更易管理的单元,并将可重用代结构化设计是将任务分解为较小的,更易管理的单元,并将可重用代码进行封装。这通过将设计分成模块,或任务和函数实现。码进行封装。这通过将设计分成模块,或任务和函数实现。任务(任务(task) 通常用于调试,或对硬件进行行为描述通常用于调试,或对硬件进行行为描述 可以包含时序控制(可以包含时序控制(#延迟,延迟,, wait) 可以有可以有 input,output,和,和inout参数参数 可以调用其他任务或函数可以调用其他任务或函数函数函数(function) 通常用于计算,或描述组合逻辑通常用于
2、计算,或描述组合逻辑 不能包含任何延迟;函数仿真时间为不能包含任何延迟;函数仿真时间为0 只含有只含有input参数并由函数名返回一个结果参数并由函数名返回一个结果 可以调用其他函数,但不能调用任务可以调用其他函数,但不能调用任务Verilog的任务及函数的任务及函数任务和函数必须在任务和函数必须在module内调用内调用在任务和函数中不能声明在任务和函数中不能声明wire所有输入所有输入/输出都是输出都是局部局部寄存器寄存器任务任务/函数执行完成后才返回结果。函数执行完成后才返回结果。 例如,若任务例如,若任务/函数中有函数中有forever语句,则永远不会返回结果语句,则永远不会返回结果任
3、务任务 下面的任务中含有时序控制和一个输入,并引用了一个下面的任务中含有时序控制和一个输入,并引用了一个module变量,变量,但没有输出、输入输出和内部变量,也不显示任何结果。但没有输出、输入输出和内部变量,也不显示任何结果。 时序控制中使用的信号(例如时序控制中使用的信号(例如ck)一定不能作为任务的输入,因为)一定不能作为任务的输入,因为输入值只向该任务传送一次。输入值只向该任务传送一次。module top; reg clk, a, b; DUT u1 (out, a, b, clk); always #5 clk = !clk; task neg_clocks; input 31:0
4、 number_of_edges; repeat( number_of_edges) ( negedge clk); endtask initial begin clk = 0; a = 1; b = 1; neg_clocks(3); / 任务调用任务调用 a = 0; neg_clocks (5); b = 0; endendmodule任务任务任务可以有任务可以有input,output 和和 inout参数。参数。传送到任务的参数和与任务传送到任务的参数和与任务I/O说明顺序相同。尽管传送到任务的参数名说明顺序相同。尽管传送到任务的参数名称与任务内部称与任务内部I/O说明的名字可以相同
5、,但在实际中这通常不是一个好的说明的名字可以相同,但在实际中这通常不是一个好的方法。参数名的唯一性可以使任务具有好的模块性。方法。参数名的唯一性可以使任务具有好的模块性。可以在任务内使用时序控制。可以在任务内使用时序控制。在在Verilog中任务定义一个新范围(中任务定义一个新范围(scope)要禁止任务,使用关键字要禁止任务,使用关键字disable 。 主要特点:主要特点: 从代码中多处调用任务时要小心。从代码中多处调用任务时要小心。因为任务的局部变量的只有一个拷贝,并因为任务的局部变量的只有一个拷贝,并行调用任务可能导致错误的结果。在任务中使用时序控制时这种情况时常发生。行调用任务可能导
6、致错误的结果。在任务中使用时序控制时这种情况时常发生。 在任务或函数中引用调用模块的变量时要小心。在任务或函数中引用调用模块的变量时要小心。如果想使任务或函数能从另如果想使任务或函数能从另一个模块调用,则所有在任务或函数内部用到的变量都必须列在端口列表中。一个模块调用,则所有在任务或函数内部用到的变量都必须列在端口列表中。任务任务 下面的任务中有输入,输出,时序控制和一个内部变量,并且引用了下面的任务中有输入,输出,时序控制和一个内部变量,并且引用了一个一个module变量。但没有双向端口,也没有显示。变量。但没有双向端口,也没有显示。 任务调用时的参数按任务定义的顺序列出。任务调用时的参数按
7、任务定义的顺序列出。 module mult (clk, a, b, out, en_mult); input clk, en_mult; input 3: 0 a, b; output 7: 0 out; reg 7: 0 out; always ( posedge clk) multme (a, b, out); / 任务调用任务调用 task multme; / 任务定义任务定义 input 3: 0 xme, tome; output 7: 0 result; wait (en_mult) result = xme * tome; endtaskendmodule函数(函数(funct
8、ion)函数中不能有时序控制,但调用它的过程可以有时序控制。函数中不能有时序控制,但调用它的过程可以有时序控制。函数名函数名f_or_and在函数中作为在函数中作为register使用使用module orand (a, b, c, d, e, out); input 7: 0 a, b, c, d, e; output 7: 0 out; reg 7: 0 out; always ( a or b or c or d or e) out = f_or_and (a, b, c, d, e); / 函数调用函数调用 function 7:0 f_or_and; input 7:0 a, b,
9、c, d, e; if (e = = 1) f_or_and = (a | b) & (c | d); else f_or_and = 0; endfunctionendmodule函数函数主要特性:主要特性:函数定义中不能包含任何时序控制语句。函数定义中不能包含任何时序控制语句。函数至少有一个输入,不能包含任何输出或双向端口。函数至少有一个输入,不能包含任何输出或双向端口。函数只返回一个数据,其缺省为函数只返回一个数据,其缺省为reg类型。类型。传送到函数的参数顺序和函数输入参数的说明顺序相同。传送到函数的参数顺序和函数输入参数的说明顺序相同。函数在模块(函数在模块(module)内部定义。
10、内部定义。函数不能调用任务,但任务可以调用函数。函数不能调用任务,但任务可以调用函数。函数在函数在Verilog中定义了一个新的范围(中定义了一个新的范围(scope)。虽然函数只返回单个值,但返回的值可以直接给信号连接赋值。虽然函数只返回单个值,但返回的值可以直接给信号连接赋值。这在需要有多个输出时非常有效。这在需要有多个输出时非常有效。 o1, o2, o3, o4 = f_ or_ and (a, b, c, d, e);函数函数 要返回一个向量值(多于一位),在函数定义时在函数名前说明范要返回一个向量值(多于一位),在函数定义时在函数名前说明范围。函数中需要多条语句时用围。函数中需要多
11、条语句时用begin和和end。 不管在函数内对函数名进行多少次赋值,值只返回一次。下例中,不管在函数内对函数名进行多少次赋值,值只返回一次。下例中,函数还在内部声明了一个整数。函数还在内部声明了一个整数。 module foo; input 7: 0 loo; output 7: 0 goo;/ 可以持续赋值中调用函数可以持续赋值中调用函数 wire 7: 0 goo = zero_count ( loo ); function 3: 0 zero_count; input 7: 0 in_ bus; integer I; begin zero_count = 0; for (I = 0;
12、I 8; I = I + 1) if (! in_bus I ) zero_count = zero_count + 1; end endfunctionendmodule函数函数函数返回值可以声明为其它函数返回值可以声明为其它register类型:类型:integer, real, 或或time。在任何表达式中都可调用函数在任何表达式中都可调用函数module checksub (neg, a, b); output neg; reg neg; input a, b; function integer subtr; input 7: 0 in_a, in_b; subtr = in_a -
13、in_b; / 结果结果可能为负可能为负 endfunction always (a or b) if (subtr( a, b) 0) neg = 1; else neg = 0;endmodule函数函数函数中可以对返回值的个别位进行赋值。函数中可以对返回值的个别位进行赋值。函数值的位数、函数端口甚至函数功能都可以参数化。函数值的位数、函数端口甚至函数功能都可以参数化。. . .parameter MAX_BITS = 8;reg MAX_BITS: 1 D;function MAX_BITS: 1 reverse_bits; input MAX_BITS-1: 0 data; integ
14、er K; for (K = 0; K MAX_BITS; K = K + 1) reverse_ bits MAX_BITS - (K+ 1) = data K;endfunctionalways (posedge clk) D = reverse_bits (D) ;. . .命名块命名块(named block) 在关键词在关键词begin或或fork后加上后加上 : 对块进行命名对块进行命名module named_ blk; . . . begin : seq_blk. . . end. . . fork : par_blk. . . join. . .endmodule 在命名块中
15、可以声明局部变量在命名块中可以声明局部变量 可以使用关键词可以使用关键词disable禁止一个命名块禁止一个命名块 命名块定义了一个新的范围命名块定义了一个新的范围 命名块会降低仿真速度命名块会降低仿真速度禁止命名块和任务禁止命名块和任务module do_arith (out, a, b, c, d, e, clk, en_mult); input clk, en_mult; input 7: 0 a, b, c, d, e; output 15: 0 out; reg 15: 0 out; always ( posedge clk) begin : arith_block / * 命名块命
16、名块 * reg 3: 0 tmp1, tmp2; / * 局部变局部变量量 * tmp1, tmp2 = f_or_and (a, b, c, d, e); / 函数调用函数调用 if (en_mult) multme (tmp1, tmp2, out); / 任务调用任务调用 end always ( negedge en_mult) begin / 中止运算中止运算 disable multme ; / * 禁止任务禁止任务 * disable arith_block; / * 禁止命名块禁止命名块 * end/ 下面下面定义任务和函数定义任务和函数 endmodule禁止命名块和任务禁
17、止命名块和任务disable语句终结一个命名块或任务的所有活动。也就是说,在一个语句终结一个命名块或任务的所有活动。也就是说,在一个命名块或任务中的所有语句执行完之前就返回。命名块或任务中的所有语句执行完之前就返回。 语法:语法: disable 或或 disable 当命名块或任务被禁止时,所有因他们调度的事件将从事件队列中当命名块或任务被禁止时,所有因他们调度的事件将从事件队列中清除清除disable是典型的不可综合语句。是典型的不可综合语句。在前面的例子中,只禁止命名块也可以达到同样的目的:所有由命在前面的例子中,只禁止命名块也可以达到同样的目的:所有由命名块、任务及其中的函数调度的事件
18、都被取消。名块、任务及其中的函数调度的事件都被取消。有限状态机有限状态机隐式状态机隐式状态机FSM 不需要声明状态寄存器不需要声明状态寄存器 仿真效率高仿真效率高 只适合于线性的状态改变只适合于线性的状态改变 大多数综合工具不能处理大多数综合工具不能处理显式显式FSM: 利于结构化利于结构化 易于处理缺省条件易于处理缺省条件 能处理复杂的状态改变能处理复杂的状态改变 所有综合工具都支持所有综合工具都支持 有限状态机有限状态机在隐式在隐式FSM中,只要数据在一个时钟沿写入并在另一个周期读出,中,只要数据在一个时钟沿写入并在另一个周期读出,则会生成寄存器。则会生成寄存器。所有所有FSM必须有复位,
19、且状态改变必须在单一时钟信号的同一边必须有复位,且状态改变必须在单一时钟信号的同一边沿。沿。通常,如果状态改变简单明确,且综合工具接受隐式状态机,就通常,如果状态改变简单明确,且综合工具接受隐式状态机,就可以使用隐式类型。如果状态改变很复杂,则显式类型更加有效。可以使用隐式类型。如果状态改变很复杂,则显式类型更加有效。隐式状态机是一个行为级而非隐式状态机是一个行为级而非RTL代码的典型例子。这种代码依代码的典型例子。这种代码依赖循环和内嵌时序控制,有时也有命名事件、赖循环和内嵌时序控制,有时也有命名事件、wait和和disable语句。语句。因此,隐式状态机在综合时通常不被支持。因此,隐式状态
20、机在综合时通常不被支持。 线性线性FSM是指从一个状态到下一个状态的转换不需要任何条件。是指从一个状态到下一个状态的转换不需要任何条件。显式有限状态机module exp (out, datain, clk, rst); input clk, rst, datain; output out; reg out; reg state; always ( posedge clk or posedge rst) if (rst) state, out = 2b00; else case (state) 1b0: begin out = 1b0; if (! datain) state = 1b0; e
21、lse state = 1b1; end 1b1: begin out = datain; state = 1b0; end default: state, out = 2b00; endcaseendmodule显式有限状态机可以在过程块中用单一时钟边沿和可以在过程块中用单一时钟边沿和case语句显式地描述语句显式地描述FSM。必须声明定义状态机的状态状态变量。必须声明定义状态机的状态状态变量。要改变当前状态,必须在时钟边沿改变状态变量的值。要改变当前状态,必须在时钟边沿改变状态变量的值。给通常不会发生的条件指定缺省动作是一个很好的描述方式。给通常不会发生的条件指定缺省动作是一个很好的描述方
22、式。 隐式有限状态机module imp (out, datain, clk, rst); output out; reg out; input clk, datain, rst; always ( rst) / Synergy reset method if (rst) assign out = 1b0; else begin deassign out; disable seq_block; /返回初始状态返回初始状态 end always ( posedge clk) begin: seq_block out = 1b0; if (!datain) / 状态状态1: output = 0
23、disable seq_block; / 状态状态2: output = 2nd bit ( posedge clk) out = datain; endendmodule隐式有限状态机可以在过程块中用多个时钟边沿(每个状态一个),条件语句,可以在过程块中用多个时钟边沿(每个状态一个),条件语句,循环,和循环,和disable语句隐式地描述一个语句隐式地描述一个FSM。通常不可综合。通常不可综合。不必声明状态变量。不必声明状态变量。在下一个时钟边沿改变状态,除非迫使状态重复。例如在一个循在下一个时钟边沿改变状态,除非迫使状态重复。例如在一个循环中或用一个环中或用一个disable语句。下一个状
24、态可以由条件语句决定。语句。下一个状态可以由条件语句决定。复习在在Verilog中什么结构能产生一个新的中什么结构能产生一个新的“范围范围” ?哪些结构可以被禁止?哪些结构可以被禁止?什么时候一个函数比一个任务更合适?反过来呢?什么时候一个函数比一个任务更合适?反过来呢?解答解答模块,任务,函数,和命名块。模块,任务,函数,和命名块。Verilog中模块作为主要层次分中模块作为主要层次分割方法。函数和任务提供附加的代码分割和封装方法。割方法。函数和任务提供附加的代码分割和封装方法。命名块和任务可以被禁止。命名块和任务可以被禁止。1.函数更适用于组合逻辑描述,并且使用灵活(例如在一个持续函数更适
25、用于组合逻辑描述,并且使用灵活(例如在一个持续赋值的右边或在一个端口列表里)。如果需要时序控制,则任赋值的右边或在一个端口列表里)。如果需要时序控制,则任务更适合。任务还可以被禁止。务更适合。任务还可以被禁止。 第18章 用户定义基本单元学习内容:学习内容:学习如何使用用户定义基本单元进行逻辑设计学习如何使用用户定义基本单元进行逻辑设计术语及定义UDP: 用户定义基本单元,其行为和用户定义基本单元,其行为和Verilog内部的基本单元相似。内部的基本单元相似。其功能用真值表定义。其功能用真值表定义。什么是UDP在在Verilog结构级描述中,可以使用:结构级描述中,可以使用:二十多个内部门级基
26、本单元二十多个内部门级基本单元用户自定义基本单元用户自定义基本单元UDP在在ASIC库单元开发、中小型芯片设计中很有用库单元开发、中小型芯片设计中很有用可以使用可以使用UDP扩充已定义的基本单元集扩充已定义的基本单元集UDP是自包容的,也就是不需要实例化其它模块是自包容的,也就是不需要实例化其它模块UDP可以表示时序元件和组合元件可以表示时序元件和组合元件UDP的行为由真值表表示的行为由真值表表示UDP实例化与基本单元实例化相同实例化与基本单元实例化相同什么是UDP可以使用可以使用UDP扩充已定义的基本单元集扩充已定义的基本单元集UDP是一种非常紧凑的逻辑表示方法。是一种非常紧凑的逻辑表示方法
27、。UDP可以减少消极(可以减少消极(pessimism)因素,因为一个)因素,因为一个input上的上的x不不会像基本单元那样自动传送到会像基本单元那样自动传送到output。一个一个UDP可以替代多个基本单元构成的逻辑,因此可以大幅减可以替代多个基本单元构成的逻辑,因此可以大幅减少仿真时间和存储需求。相同逻辑的行为级模型甚至可以更快,少仿真时间和存储需求。相同逻辑的行为级模型甚至可以更快,这取决于仿真器。这取决于仿真器。UDP的特点UDP只能有一个输出只能有一个输出 如果在功能上要求有多个输出,则需要在如果在功能上要求有多个输出,则需要在UDP输出端连接其它的基本输出端连接其它的基本单元,或
28、者同时使用几个单元,或者同时使用几个UDP。 UDP可以有可以有1到到10个输入个输入 若输入端口超过若输入端口超过5,存储需求会大幅增加。下表列出输入端口数与存储,存储需求会大幅增加。下表列出输入端口数与存储需求的关系。需求的关系。所有端口必须为标量且不允许双向端口所有端口必须为标量且不允许双向端口不支持逻辑值不支持逻辑值Z输出端口必须列为端口列表的第一个输出端口必须列为端口列表的第一个时序时序UDP输出端可以用输出端可以用initial语句初始化为一个确定值。语句初始化为一个确定值。UDP不可综合不可综合#输入存储器(KB) #输入存储器(KB)1-5185665918771710623这
29、两行用于减少消极因素。表示若这两行用于减少消极因素。表示若a, b有相同有相同逻辑值,即使逻辑值,即使sel=x,o也输出与也输出与a,b相同的值。相同的值。Verilog内部基本单元不能描述这种行为。内部基本单元不能描述这种行为。UDP将将X作为真实世界的未知值作为真实世界的未知值(0或或1),而不,而不是是Verilog值,描述也更为精确。值,描述也更为精确。这两行表示不管这两行表示不管a为何值,若为何值,若s为为o,o输出输出b值值组合逻辑举例:2-1多路器UDP在模块在模块(module)外部定义。外部定义。没有在真值表中说明的输入组合,输出没有在真值表中说明的输入组合,输出X。真值表
30、中输入信号按端口列表顺序给出。真值表中输入信号按端口列表顺序给出。primitive multiplexer (o, a, b, s); output o; input s, a, b; table / a b s : o 0 ? 1 : 0; 1 ? 1 : 1; ? 0 0 : 0; ? 1 0 : 1; 0 0 x : 0; 1 1 x : 1; endtableendprimitiveUDP名称名称输出端口输出端口真值表中?真值表中?表示的逻辑表示的逻辑值为:值为:0、1或或x这两行表示不管这两行表示不管b为何值,若为何值,若s为为1,o输出输出a值值组合逻辑组合逻辑举例:全加器:全加
31、器/ FULL ADDER CARRY-OUT TERMprimitive U_ADDR2_C (CO, A, B, CI); output CO; input A, B, Ci; table / A B CI : CO 1 1 ? : 1; 1 ? 1 : 1; ? 1 1 : 1; 0 0 ? : 0; 0 ? 0 : 0; ? 0 0 : 0; endtableendprimitive全加器可以由两个组合逻辑全加器可以由两个组合逻辑UDP实现实现/ FULL ADDER SUM TERMprimitive U_ADDR2_S (S, A, B, CI); output S; input
32、A, B, CI; table / A B CI : S0 0 0 : 0;0 0 1 : 1;0 1 0 : 1;0 1 1 : 0;1 0 0 : 1;1 0 1 : 0;1 1 0 : 0;1 1 1 : 1; endtableendprimitive组合逻辑举例:全加器组合逻辑举例:全加器当需要大量全加器时,可以大幅度减少存储器需求当需要大量全加器时,可以大幅度减少存储器需求大幅减小事件数目。使用内部基本单元时,事件通过大幅减小事件数目。使用内部基本单元时,事件通过3个基本单元后个基本单元后才能到达进位输出;而使用才能到达进位输出;而使用UDP,事件只需经过一个基本单元。,事件只需经过
33、一个基本单元。全加器可以由两个组合逻辑全加器可以由两个组合逻辑UDP实现,而不使用内部基本单元。实现,而不使用内部基本单元。电平敏感时序元件举例:锁存器电平敏感时序元件举例:锁存器latch锁存器的行为如下:锁存器的行为如下:当时钟输入为当时钟输入为0时,时,data输入的值传送到输出。输入的值传送到输出。当时钟输入为当时钟输入为1时,输出不变。时,输出不变。这种加电初始化在实际元件中很少见,但在这种加电初始化在实际元件中很少见,但在UDP功能测试时很有用。功能测试时很有用。 primitive latch (q, clock, data); output q; reg q; input cl
34、ock, data; initial q = 1b1; table / clock data current next / state state 0 1 : ? : 1 ; 0 0 : ? : 0 ; 1 ? : ? : - ; endtableendprimitive输出必须声明为输出必须声明为reg以保存前一状态以保存前一状态时序时序UDP初始化语句,初始化语句,将输出初始化为将输出初始化为1输入及当前状态中输入及当前状态中的?表示无关值的?表示无关值用另一个场表用另一个场表示下一状态示下一状态-状态值表示状态值表示输出没有变化输出没有变化边沿敏感时序元件举例:边沿敏感时序元件举例:D触
35、发器触发器在任何一个真值表入口语句中只能说明一个输入跳变。在任何一个真值表入口语句中只能说明一个输入跳变。如果说明了任何输入跳变,则必须说明所有输入上的所有跳变。如果说明了任何输入跳变,则必须说明所有输入上的所有跳变。 primitive d_edge_ff (q, clk, data); output q; input clk, data; reg q; table / clk dat state next(01) 0 : ? : 0 ;(01) 1 : ? : 1 ;(0 x) 1 : 1 : 1 ;(0 x) 0 : 0 : 0 ;(x1) 0 : 0 : 0 ;(x1) 1 : 1 :
36、 1 ;/忽略时钟下降沿忽略时钟下降沿(?0) ? : ? : - ; (1x) ? : ? : - ;/时钟稳定时忽略时钟稳定时忽略data变化变化? (?) : ? : - ; endtableendprimitive表里有边沿项表示输入跳变。表里有边沿项表示输入跳变。在一条入口语句中只能说明一个在一条入口语句中只能说明一个输入跳变,因为输入跳变,因为Verilog仿真是基仿真是基于事件,一次只允许一个事件发于事件,一次只允许一个事件发生。生。在每个时间步中,电平入口优先在每个时间步中,电平入口优先于边沿入口,因为电平最后处理。于边沿入口,因为电平最后处理。因此,下面的出口:因此,下面的出
37、口: (? 0) ? : ? : - ; 可由下式取代可由下式取代: 0 ? : ? : - ; 两个都给出时,只有后两个都给出时,只有后者起作用者起作用 提高可读性的简写形式提高可读性的简写形式Verilog中有一些符号可用于中有一些符号可用于UDP真值表中以提高可读性真值表中以提高可读性符号表示解释-没有变化时序元件输出的下一个值与当前值相同?0、1或x任何值b0或1任何确定值r(01)0-1跳变f(10)1-0跳变p(01)、(0 x)或(x1)任何上升沿(posedge)n(10)、(1x)或(x0)任何下降沿(negedge)*(?)任何跳变提高可读性的简写形式提高可读性的简写形式t
38、able/ clk dat state next r 0 : ? : 0 ; r 1 : ? : 1 ; (0 x) 1 : 1 : 1 ; (0 x) 0 : 0 : 0 ; (x1) 1 : 1 : 1 ; (x1) 0 : 0 : 0 ;/ 忽略时钟的下降沿忽略时钟的下降沿 n ? : ? : - ;/ 忽略时钟稳定时的任何数据变化忽略时钟稳定时的任何数据变化 ? * : ? : - ;endtable带同步复位的带同步复位的D触发器触发器primitive U_ff_p_cl( q, d, clk, cl); input d, clk, cl; output q; reg q;tabl
39、e/ dclk cl :q:q+ 1 1r 1 :?: 1; / clock 1 0 r ? :?: 0; / clock 0 ? r 0 :?: 0; / reset ? p 0 :0: -; / reducing pessimism 1 p 1 :1: -; 0 p ? :0: -; ? n ? :?: -; / ignore falling clk * ? ? :?: -; / ignore changes on d ? ? * :?: -; / ignore changes on clkendtableendprimitive带使能和复位的锁存器带使能和复位的锁存器primitive
40、u_latch_cl (q, d, g, cl); output q; input d, g, cl; reg q;table/ dgcl:q:q+ 1 01?:?: 0; 11?:?: 1; 1?0:1: 1; / reducing pessimism 0?0:0: 0; / reducing pessimism 0?1:?: 0; / reducing pessimism 0?:0: 0; / reducing pessimism ?00:?: -; / latch disabled ?01:?: 0; / clearendtableendprimitive当使能当使能g为高为高(H)时,
41、锁存器锁存时,锁存器锁存d;只有当;只有当g为低时复位信号为低时复位信号cl才有效才有效(高有效)。(高有效)。使用通报符使用通报符(notifier)的寄存器的寄存器timescale 1ns/ 1nsmodule dff_nt (q, ck, d, rst);input ck, d, rst;output q;reg nt;U_FFD_RB i1 (q, d, ck, rst, nt);specify specparam tsu = 2; (ck = q) = (2: 3: 4); $setup (d, posedge ck, tsu, nt);endspecifyendmodule下面的
42、例子是异步复位的上升沿下面的例子是异步复位的上升沿D触发器,有时序检查和路径延迟。触发器,有时序检查和路径延迟。这个模型使用了一个这个模型使用了一个UDP,并将通报符作为,并将通报符作为UDP的一个输入。的一个输入。 primitive U_ FFD_ RB (Q, D, CP, RB,NT);output Q; reg Q;input D, CP, RB, NT;table/ D CP RB NT :Q :Q+ 1 0 r ? ? :? : 0; / clock a 0 1 r 1 ? :? : 1; / clock a 1 1 p 1 ? :1 : -; / reducing pessim
43、ism 0 p ? ? :0 : -; / reducing pessimism ? ? 0 ? :? : 0; / asynchronous reset ? ? x ? :0 : -; / reducing pessimism ? n ? ? :? : -; / ignore falling clock * ? ? ? :? : -; / ignore rising edges on D ? ? * ? :? : -; / ignore changes on reset ? ? ? * :? : x; / NT变化使变化使Q产生产生xendtableendprimitive第第1919章章
44、Verilog的可综合描述风格的可综合描述风格学习目标:学习目标: 学习组合逻辑和时序逻辑的可综合的描述风格及技术,包括:学习组合逻辑和时序逻辑的可综合的描述风格及技术,包括:不支持的不支持的Verilog结构结构过程块过程块寄存器寄存器敏感列表敏感列表持续赋值持续赋值综合指导综合指导条件结构条件结构阻塞及非阻塞赋值阻塞及非阻塞赋值锁存器锁存器/MUX推断推断函数函数function任务任务task复位复位有限状态机有限状态机FSM宏库及设计复用宏库及设计复用描述风格简介描述风格简介如果逻辑输出在任何时候都直接由当前输入组合决定,则为如果逻辑输出在任何时候都直接由当前输入组合决定,则为组合逻辑
45、组合逻辑。如果逻辑暗示存储则为如果逻辑暗示存储则为时序逻辑时序逻辑。如果输出在任何给定时刻不能由输。如果输出在任何给定时刻不能由输入的状态决定,则暗示存储。入的状态决定,则暗示存储。 通常综合输出不会只是一个纯组合或纯时序逻辑。通常综合输出不会只是一个纯组合或纯时序逻辑。 一定要清楚所写的源代码会产生什么类型输出,一定要清楚所写的源代码会产生什么类型输出, 并能够反过来确定为什么所用的综合工具产生这个输出,并能够反过来确定为什么所用的综合工具产生这个输出, 这是非常重要的。这是非常重要的。 不支持的不支持的Verilog结构结构综合工具通常不支持下列综合工具通常不支持下列Verilog结构结构
46、: initial循环循环: repeat forever while 非结构化的非结构化的for语句语句数据类型数据类型: event real time UDP forkjoin块块 wait过程持续赋值:过程持续赋值: assign deassign force release操作符:操作符: = = = ! = =过程块过程块任意边沿任意边沿在所有输入信号的任意边沿进入的过程块产生组合逻辑。这种过程在所有输入信号的任意边沿进入的过程块产生组合逻辑。这种过程块称为组合块。块称为组合块。 always ( a or b) / 与门与门 y = a & b;单个边单个边沿沿在一个控制信号的单
47、一边沿上进入的过程块产生同步逻辑。这种过在一个控制信号的单一边沿上进入的过程块产生同步逻辑。这种过程块称为同步块。程块称为同步块。 always ( posedge clk) / D flip-flop q = d;同步块也可以对异步复位信号的变化产生敏感同步块也可以对异步复位信号的变化产生敏感 always ( posedge clk or negedge rst_) if (! rst_) q = 0; else q = d;过程块中的寄存器类型过程块中的寄存器类型若同步块中使用一个若同步块中使用一个reg,则:则:如果在一个时钟周期赋值并在另一个周期被采样,则只能以硬件寄如果在一个时钟周
48、期赋值并在另一个周期被采样,则只能以硬件寄存器实现。存器实现。如果如果reg还是一个基本输出,它会出现在综合网表中,但不一定是还是一个基本输出,它会出现在综合网表中,但不一定是一个硬件寄存器。一个硬件寄存器。若两者都不是,该信号可能被优化掉。若两者都不是,该信号可能被优化掉。若组合块中使用一个若组合块中使用一个reg,则:则:如果如果reg值随块的任何一个输入的变化而改变,值随块的任何一个输入的变化而改变, 则在综合时不会产则在综合时不会产生硬件寄存器。生硬件寄存器。如果如果reg值并不总是随块的输入变化而改变,则综合时会产生一个值并不总是随块的输入变化而改变,则综合时会产生一个锁存器。锁存器
49、。 同步寄存器举例同步寄存器举例在这个例子中,在这个例子中,rega只作暂存,只作暂存,因此会被优化掉。因此会被优化掉。module ex1reg (d, clk, q); input d, clk; output q; reg q, rega;always ( posedge clk) begin rega = 0; if (d) rega = 1; q = rega;endendmodule在这个例子中,在这个例子中,rega产生一个寄存产生一个寄存器,不会被优化掉。器,不会被优化掉。module ex2reg (d, clk, q); input d, clk; output q; re
50、g q, rega;always ( posedge clk) begin rega = 0; if (d) rega = 1; endalways ( posedge clk) q = rega;endmodule组合逻辑中的寄存器类型举例组合逻辑中的寄存器类型举例在这个例子中在这个例子中, y和和rega总是赋新值总是赋新值, 因此产生一个纯组合逻辑。因此产生一个纯组合逻辑。module ex3reg (y, a, b, c);input a, b, c;output y;reg y, rega;always ( a or b or c) begin if (a & b) rega = c