高级Verilog设计.ppt

上传人:本田雅阁 文档编号:3165375 上传时间:2019-07-18 格式:PPT 页数:47 大小:981.03KB
返回 下载 相关 举报
高级Verilog设计.ppt_第1页
第1页 / 共47页
高级Verilog设计.ppt_第2页
第2页 / 共47页
高级Verilog设计.ppt_第3页
第3页 / 共47页
高级Verilog设计.ppt_第4页
第4页 / 共47页
高级Verilog设计.ppt_第5页
第5页 / 共47页
点击查看更多>>
资源描述

《高级Verilog设计.ppt》由会员分享,可在线阅读,更多相关《高级Verilog设计.ppt(47页珍藏版)》请在三一文库上搜索。

1、第十章 高级Verilog设计,不支持的Verilog结构,综合工具通常不支持下列Verilog结构: initial 循环: repeat forever while(2001标准后支持但有限制) 非结构化的for语句 数据类型: event real time,UDP forkjoin块 wait 过程持续赋值: deassign force release 操作符: = = = ! = =,持续赋值,module orand ( input wire a, b, c, d, e, output wire out ); assign out = e endmodule,持续赋值驱动值到ne

2、t上。因为驱动是持续的,所以输出将随任意输入的改变而随时更新,因此将产生组合逻辑。,连续赋值语句,assign #10 D = (A ,从综合的角度看,延时会被忽略掉! 延时会造成功能仿真和定时仿真的差异 推荐的编码风格是不带任何的延时信息 assign D = (A 对于过程块: always块可综合 initial块 不可综合,过程块敏感列表,任意边沿 在所有输入信号的任意边沿进入的过程块称为组合块。 always ( a or b) / 与门 y = a ,敏感列表,敏感表不完全: module sens (q, a, b, sl); input a, b, sl; output q;

3、reg q; always ( sl) begin if (! sl) q = a; else q = b; end endmodule,完全的敏感列表 module sensc (q, a, b, sl); input a, b, sl; output q; reg q; always ( sl or a or b) begin if (! sl) q = a; else q = b; end endmodule,在下面的例子,a, b, sl是块的输入 sl用作条件, a、b用在过程赋值语句的右边,将块的所有输入都列入敏感表是很好的描述习惯。不同的综合工具对不完全敏感表的处理有所不同。有的

4、将不完全敏感表当作非法。其他的则产生一个警告并假设敏感表是完全的。在这种情况下,综合输出和RTL描述的仿真结果可能不一致。,always块,可以描述时序逻辑也可以描述组合逻辑 敏感变量表中不能同时包含沿事件和非沿事件 敏感变量表必须完整,always (A or B or C) D = (A ,敏感变量表不完整的影响,always (A or B) D = (A ,敏感变量表不同的影响(一),reg a; always (posedge clk or negedge rst) begin if(!rst) a = 1b0; else a = b; end,敏感变量表不同的影响(二),reg a

5、; always (posedge clk ) begin if(!rst) a = 1b0; else a = b; end,Latch,任意边沿 在所有输入信号的任意边沿进入的过程块称为组合块。 always ( a or b) y = a 采用阻塞赋值语句 可能产生组合逻辑或锁存器 过程赋值语句产生组合逻辑 IF或CASE语句可能产生锁存器,module DFF (q, qb, d, clk, clr); output q, qb; input d, / input data clk, /*input clock */ clr; reg q; wire qb, d, clk, clr;

6、assign qb = !q; always (a, b, c) begin 过程赋值语句; 高级描述语句 if语句; case语句; 循环语句; end endmodule,锁存器(latch)推断,module latch (q, data, enable); input wire data, enable; output reg q; always ( enable, data) if (enable) q = data; endmodule,在always块中,条件语句如果没有说明所有条件,将产生latch。 在下面的例子中,由于没有定义enable为低电平时data的状态,因此ena

7、ble为低电平时data的值必须保持,综合时将产生一个锁存器,条件语句,自然完全的条件语句,module comcase ( input wire a, b, c, d, output reg e ); always ( a or b or c or d) case ( a, b) 2b11: e = d; 2b10: e = c; 2b01: e = 1b0; 2b00: e = 1b1; endcase endmodule,module compif ( input wire a, b, c, d, output reg e ); always ( a or b or c or d) if

8、 (a endmodule,例中定义了所有可能的选项,综合结果是纯组合逻辑,没有不期望的锁存器产生。,不完全条件语句,module inccase ( input wire a, b, c, d, output reg e ); always ( a or b or c or d) case ( a, b) 2b11: e = d; 2b10: e = c; endcase endmodule,module incpif ( input wire a, b, c, d, output reg e ); always ( a or b or c or d) if (a endmodule,在上面

9、的例子中,当a变为零时,不对e赋新值。因此e保存其值直到a变为1。这是锁存器的特性。,若 a 变为 0, e 为何值,default完全条件语句,module comcase ( input wire a, b, c, d, output reg e ); always ( a, b, c, d) case ( a, b) 2b11: e = d; 2b10: e = c; default: e = bx; endcase endmodule,module compif ( input wire a, b, c, d, output reg e ); always ( a, b, c, d)

10、if (a endmodule,综合工具将 bx作为无关值,因此if语句类似于“ full case”,可以进行更好的优化。 例中没有定义所有选项,但对没有定义的项给出了缺省行为。同样,其综合结果为纯组合逻辑没有不期望的锁存器产生。,指示完全条件语句,module dircase (a, b, c, d); input b, c; input 1: 0 a; output reg d; always ( a or b or c) case (a) / ambit synthesis case = full 2b00: d = b; 2b01: d = c; endcase endmodule,

11、和前例一样,没有定义所有case项,但综合指令通知优化器缺少的case项不会发生。结果也为纯组合逻辑,没有不期望锁存器产生。注意如果缺少的case项发生,而其结果未定义,综合结果和RTL的描述的行为可能不同。,综合指令举例,这里列出部分Cadence综合工具中综合指令。这些与其他工具,如Synopsys Design Compiler,中的指令很相似。 / ambit synthesis on / ambit synthesis off / ambit synthesis case = full, parallel, mux 结构指令 / ambit synthesis architectur

12、e = cla or rpl FSM指令 / ambit synthesis enum xyz / ambit synthesis state_vector sig state_vector_ flag,综合指令 case指示,case语句通常综合为一个优先级编码器,列表中每个case项都比后面的case项的优先级高。 Case指令按下面所示指示优化器:,/ambit synthesis case = parallel 建立并行的编码逻辑,彼此无优先级。 /ambit synthesis case = mux 若库中有多路器,使用多路器建立编码逻辑。 /ambit synthesis case

13、 = full 假定所有缺少的case项都是“无关”项,使逻辑更为优化并避免产生锁存器。,case指示例外,module select ( input wire 1: 0 sl, output reg a, b ); always ( sl) case (sl) / ambit synthesis case = full 2b00: begin a = 0; b = 0; end 2b01: begin a = 1; b = 1; end 2b10: begin a = 0; b = 1; end 2b11: b = 1; default: begin a = bx; b = bx; end

14、endcase endmodule,有时使用了case full指示,case语句也可能综合出latch。 下面的描述综合时产生了一个latch。 要求:条件语句中各分支的赋值对象一致。,module select ( input wrie 1: 0 sl, output reg a, b ); always ( sl) if(sl) a = 0; else b = 1; endmodule,函数的可综合性,module orand ( input a, b, c, d, e, output wire out ); assign out = forand (a, b, c, d, e); fu

15、nction forand; input a, b, c, d, e; if (e = 1) forand = (a| b) endfunction endmodule,函数没有时序控制,因此综合结果为组合逻辑。函数可以在过程块内或持续赋值语句中调用。 下例中的or/and块由持续赋值语句调用函数实现,任务,module orandtask (out, a, b, c, d, e); input a, b, c, d, e; output out; reg out; always ( a or b or c or d or e) orand (out, a, b, c, d, e); task

16、 orand; input a, b, c, d, e; output out; if (e = 1) out = (a| b) endtask endmodule,任务一般只在测试程序中使用,因为: 带有时序控制的任务不可综合 下面是用任务描述的or/and块:,第二部分 高性能编码技术,if 语句,module single_if(a, b, c, d, sel, z); input a, b, c, d; input 3:0 sel; output z; reg z; always (a or b or c or d or sel) begin if (sel3) z = d; else

17、 if (sel2) z = c; else if (sel1) z = b; else if (sel0) z = a; else z = 0; end endmodule,module mult_if(a, b, c, d, sel, z); input a, b, c, d; input 3:0 sel; output z; reg z; always (a or b or c or d or sel) begin z = 0; if (sel0) z = a; if (sel1) z = b; if (sel2) z = c; if (sel3) z = d; end endmodul

18、e,例1.1a 单个 if 语句,例1.1b 多重 if 语句,注意代码的优先级,推荐方式,if语句的电路结构,case语句,module case1(a, b, c, d, sel, z); input a, b, c, d; input 3:0 sel; output z; reg z; always (a or b or c or d or sel) begin casex (sel) 4b1xxx: z = d; 4bx1xx: z = c; 4bxx1x: z = b; 4bxxx1: z = a; default: z = 1b0; endcase end endmodule,ca

19、sex具有使用无关项的优点,不用列出sel的所有组合。,例1.2 case 语句,例中case语句的电路结构,晚到达信号处理,设计时通常知道哪一个 信号到达的时间要晚一些。这些信息可用于构造HDL,使到达晚的信号离输出近一些。 下面的例子中,针对晚到达信号重新构造if和case语句,以提高逻辑性能。,晚到达的是数据信号-无优先级,顺序if语句可以根据关键信号构造HDL。在例1.1a 中,输入信号d处于选择链的最后一级,也就是说d最靠近输出。 假如信号b_is_late是晚到达信号,我们就要重新构造例1.1a使其最优化。,原if结构,module single_if(a, b, c, d, se

20、l, z); input a, b, c, d; input 3:0 sel; output z; reg z; always (a or b or c or d or sel) begin if (sel1) z = b_is_late; else if (sel3) z = d; else if (sel2) z = c; else if (sel0) z = a; else z = 0; end endmodule,后if结构,module single_if(a, b, c, d, sel, z); input a, b, c, d; input 3:0 sel; output z;

21、reg z; always (a or b or c or d or sel) begin if (sel3) z = d; else if (sel2) z = c; else if (sel1) z = b; else if (sel0) z = a; else z = 0; end endmodule,晚到达的是数据信号-保持优先级,顺序if语句可以根据关键信号构造HDL。在例1.1a 中,输入信号d处于选择链的最后一级,也就是说d最靠近输出。 假如信号b_is_late是晚到达信号,我们就要重新构造例1.1a使其最优化。,module mult_if_improved(a, b_is_

22、late, c, d, sel, z); input a, b_is_late, c, d; input 3:0 sel; output z; reg z, z1; always (a or b_is_late or c or d or sel) begin if (sel1 end endmodule,保持优先级的if结构,原if结构,module single_if(a, b, c, d, sel, z); input a, b, c, d; input 3:0 sel; output z; reg z; always (a or b or c or d or sel) begin if

23、(sel3) z = d; else if (sel2) z = c; else if (sel1) z = b; else if (sel0) z = a; else z = 0; end endmodule,晚到达的是数据信号,晚到达的是控制信号,如果晚到达信号作为if语句条件分支的条件,也应使这个信号离输出最近。在下面的例子中,CTRL_is_late是晚到达的控制信号,module single_if_late(A, C, CTRL_is_late, Z); input 6:1 A; input 5:1 C; input CTRL_is_late; output Z; reg Z; a

24、lways (C or A or CTRL_is_late) if (C1 = 1b1) Z = A1; else if (C2 = 1b0) Z = A2; else if (C3 = 1b1) Z = A3; else if (C4 = 1b1 endmodule,晚到达的是控制信号,module single_if_late(A, C, CTRL_is_late, Z); input 6:1 A; input 5:1 C; input CTRL_is_late; output Z; reg Z; always (C or A or CTRL_is_late) / if条件中晚到达的信号

25、if (C4 = 1b1 endmodule,if-case嵌套语句,module case_in_if_01(A, DATA_is_late_arriving, C, sel, Z); input 8:1 A; input DATA_is_late_arriving; input 2:0 sel; input 5:1 C; output Z; reg Z; always (sel or C or A or DATA_is_late_arriving) if (C1) Z = A5; else if (C2 = = 1b0) Z = A4; else if (C3) Z = A1; else

26、if (C4) case (sel) 3b010: Z = A8; 3b011: Z = DATA_is_late_arriving; 3b101: Z = A7; 3b110: Z = A6; default: Z = A2; endcase else if (C5 = = 1b0) Z = A2; else Z = A3; endmodule,if-case嵌套语句修改后,always (sel or C or A or DATA_is_late_arriving) begin if (C1) Z1 = A5; else if (C2 = 1b0) Z1= A4; else if (C3)

27、 Z1 = A1; else if (C4) case (sel) 3b010: Z1 = A8; /3b011: Z1 = DATA_is_late_arriving; 3b101: Z1 = A7; 3b110: Z1 = A6; default: Z1 = A2; endcase else if (C5 = 1b0) Z1 = A2; else Z1 = A3; FIRST_IF = (C1 = 1b1) | (C2 = 1b0) | (C3 = 1b1); if (!FIRST_IF end,if-case嵌套语句,Case语句,if语句,if-case嵌套语句修改后的电路结构,设计练

28、习IF语句优先级,always (Sel_A or Sel_B or Sel_C or Data_A or Data_B or Data_C or Data_D) begin Data_out = Data_D; if(Sel_A) Data_Out = Data_A; if(Sel_B) Data_Out = Data_B; if(Sel_C) Data_Out = Data_C; end,优先级顺序:?,IF语句优先级例子(2),设计练习IF语句优先级例子,always (Sel_A or Sel_B or Sel_C or Data_A or Data_B or Data_C or Da

29、ta_D) begin if(Sel_A) Data_Out = Data_A; else if(Sel_B) Data_Out = Data_B; else if(Sel_C) Data_Out = Data_C; else Data_Out = Data_D; end,IF语句优先级例子,设计练习利用优先级优化关键路径,assign out = (in0,assign out = (in0,非结构化的for循环,综合工具处理循环的方法是将循环内的结构重复。在循环中包含不变化的表达式会使综合工具花很多时间优化这些冗余逻辑。,for( i =0; i4; i=i+1) begin sig1 =

30、 sig2; /无变化的语句 data_outi = data_ini; end,sig1 = sig2; /无变化的语句 for( i =0; i4; i=i+1) data_outi = data_ini;,资源共享,资源共享是指多节代码共享一组逻辑。例如:,always ( a or b or c or d) if (a) out = b + c; else out = b + d;,没有资源共享,资源共享,资源共享与所用综合工具有关。但通常,要共享资源,表达式必须在同一个always块中的同一个条件语句中。,资源共享,只有在同一个条件语句(if和case)不同的分支中的算术操作才会共享。 条件操作符 ?: 中的算术操作不共享。,if (cond) z = a + b; else z = c + d;,Z = (cond) ? (a + b) : (c + d);,利用括号分割逻辑。,z = a + b + c + d;,Z = (a + b) + (c + d);,+,a,b,+,c,+,z,d,+,a,b,+,c,d,+,z,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1