第20章 Verilog的可综合描述风格
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
这是非常重要的。
不支持的Verilog结构
综合工具通常不支持下列Verilog结构:
initial UDP fork…join块 wait 过程持续赋值: assign deassign force release 操作符: === !==
循环:
repeat forever while 非结构化的for语句 数据类型: event real time
// ambit synthesis architecture = cla or rpl
FSM指示 // ambit synthesis enum xyz
// ambit synthesis state_vector sig state_vector_ flag
综合指示 — case指示
case 语句通常综合为一个优先级编码器,列表中每个 case项都比后 面的case项的优先级高。
在上面的例子中,当a变为零时,不对e赋新值。因此e保 存其值直到a变为1。这是锁存器的特性。
default完全条件语句
module comcase (a, b, c, d, e); input a, b, c, d; output e; reg e; always @( a or b or c or d) case ({ a, b}) 2'b11: e = d; 2'b10: e = ~c; default: e = 'bx; endcase endmodule module compif (a, b, c, d, e); input a, b, c, d; output e; reg e; always @( a or b or c or d) if (a & b) e = d; else if (a & ~b) e = ~c; else e = 'bx; endmodule
例中定义了所有可能的选项,综合结果是纯组合逻辑,没有不期望 的锁存器产生。
不完全条件语句
若 a 变为 0, e 为何值
module inccase (a, b, c, d, e); input a, b, c, d; output e; reg e; always @( a or b or c or d) case ({ a, b}) 2'b11: e = d; 2'b10: e = ~c; endcase endmodule module incpif (a, b, c, d, e); input a, b, c, d; output e; reg e; always @( a or b or c or d) if (a & b) e = d; else if (a & ~b) e = ~c; endmodule
过程块中的寄存器类型
若同步块中使用一个reg,则:
• • 如果在一个时钟周期赋值并在另一个周期被采样,则只能以硬件 寄存器实现。 如果 reg还是一个基本输出,它会出现在综合网表中,但不一定是 一个硬件寄存器。
•
若两者都不是,该信号可能被优化掉。
若组合块中使用一个reg,则:
• • 如果reg值随块的任何一个输入的变化而改变, 则在综合时不会产 生硬件寄存器。 如果 reg值并不总是随块的输入变化而改变,则综合时会产生一个 锁存器。
第20章 Verilog的可综合描述风格
学习目标: 学习组合逻辑和时序逻辑的可综合的描述风格及技术,包括: • • • • • • • 不支持的Verilog结构 过程块 寄存器 敏感列表 持续赋值 综合指导 条件结构 • • • • • • • 阻塞及非阻塞赋值 锁存器/MUX推断 函数function 任务task 复位 有限状态机FSM 宏库及设计复用
将块的所有输入都列入敏感表是很好的描述习惯。不同的综合工具对不完全敏感 表的处理有所不同。有的将不完全敏感表当作非法。其他的则产生一个警告并假 设敏感表是完全的。在这种情况下,综合输出和RTL描述的仿真结果可能不一致。
敏感列表
将块的所有输入都列入敏感表是很好的描述习惯。不同的综合工具对不完全敏感 表的处理有所不同。有的将不完全敏感表当作非法。其他的则产生一个警告并假 设敏感表是完全的。在这种情况下,综合输出和RTL描述的仿真结果可能不一致。 上述两例综合结果(SYNOPSYS)相同,但RTL描述的仿真结果不同。也就是左边 的敏感表不完全的例子的RTL描述和综合出的网表的仿真结果不同。 module sens_t; reg a, b, sl; sens u1(a, q, b, sl); sensc u2(qc, a, b, sl); initial begin $monitor($time," %b %b %b %b %b", a, b, sl, q, qc); a =0;b=0;sl = 0; 0 000 00 #10 a =1; #10 sl = 1; 10 1 0 0 0 1 #10 sl = 0; 20 1 0 1 0 0 #10 $finish; end 30 1 0 0 1 1 endmodule
•
•
条件语句
自然完全的条件语句
module comcase (a, b, c, d, e); input a, b, c, d; output e; reg e; always @( a or b or c or d) case ({ a, b}) 2'b11: e = d; 2'b10: e = ~c; 2'b01: e = 1'b0; 2'b00: e = 1'b1; endcase endmodule module compif (a, b, c, d, e); input a, b, c, d; output e; reg e; always @( a or b or c or d) if (a & b) e = d; else if (a & ~b) e = ~c; else if (~ a & b) e = 1'b0; else if (~ a & ~b) e = 1'b1; endmodule
百度文库
综合指示
这里列出部分Cadence综合工具中综合指示。这些与其他工具,如Synopsys Design Compiler,中的指示很相似。 // ambit synthesis on // ambit synthesis off // ambit synthesis case = full, parallel, mux 结构指示
过程持续赋值
过程持续赋值是在过程块(always或initial)内给一个寄存器数据类型进行 的持续赋值。这在大多数综合工具中是非法的。 module latch_quasi (q, en, d); input en, d; output q; reg q; always @( en) if (en) assign q = d; else deassign q; endmodule
过程块
• 任意边沿 在所有输入信号的任意边沿进入的过程块产生组合逻辑。这种过 程块称为组合块。 always @( a or b) // 与门 y = a & b; 单个边沿 – 在一个控制信号的单一边沿上进入的过程块产生同步逻辑。这种 过程块称为同步块。 always @( posedge clk) // D flip-flop q <= d; – 同步块也可以对异步复位信号的变化产生敏感 always @( posedge clk or negedge rst_) if (! rst_) q <= 0; else q <= d; –
综合指示
• • 大多数综合工具都能处理综合指示。 综合指示可以嵌在Verilog注释中,因此他们在Verilog仿真时忽略, 只在综合工具解析时有意义。 • 不同工具使用的综合指示在语法上不同。但其目的相同,都是在
RTL代码内部进行最优化。
•
通常综合指示中包含工具或公司的名称。例如,下面介绍的 Envisia Ambit synthesis工具的编译指示都以ambit synthesis开头。
敏感列表
在下面的例子,a, b, sl是块的输入 • sl用作条件 • a、b用在过程赋值语句的右边 敏感表不完全: module sens (a, q, b, sl); input a, b, sl; output q; 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
持续赋值
持续赋值驱动值到net上。因为驱动是持续的,所以输出将随任意输入的改 变而随时更新,因此将产生组合逻辑。 module orand (out, a, b, c, d, e); input a, b, c, d, e; output out; assign out = e & (a | b) & (c | d); endmodule
组合逻辑中的寄存器类型举例
在下面的例子, rega是暂存变量,并被优化掉
在这个例子中, 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; else rega = 0; y = rega; end endmodule 在这个例子中,rega不总是产生新 值,因此会产生一个锁存器,y是 锁存器的输出 module ex4reg (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; y = rega; end endmodule
Case指示按下面所示指示优化器:
• //ambit synthesis case = parallel – 建立并行的编码逻辑,彼此无优先级。 //ambit synthesis case = mux – 若库中有多路器,使用多路器建立编码逻辑。 //ambit synthesis case = full – 假定所有缺少的case项都是“无关”项,使逻辑更 为优化并避免产生锁存器。
综合工具将 ‘bx作为无关值,因此if语句类似于“ full case”,可以 进行更好的优化。
例中没有定义所有选项,但对没有定义的项给出了缺省行为。同样, 其综合结果为纯组合逻辑——没有不期望的锁存器产生。
同步寄存器举例
在这个例子中,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; end endmodule 在这个例子中,rega产生一个寄存 器,不会被优化掉。 module ex2reg (d, clk, q); input d, clk; output q; reg q, rega; always @( posedge clk) begin rega = 0; if (d) rega = 1; end always @( posedge clk) q = rega; endmodule
描述风格简介
如果逻辑输出在任何时候都直接由当前输入组合决定,则为组合逻辑。 如果逻辑暗示存储则为时序逻辑。如果输出在任何给定时刻不能由输 入的状态决定,则暗示存储。
通常综合输出不会只是一个纯组合或纯时序逻辑。 一定要清楚所写的源代码会产生什么类型输出, 并能够反过来确定为什么所用的综合工具产生这个输出,