ImageVerifierCode 换一换
格式:DOCX , 页数:18 ,大小:29.05KB ,
资源ID:7962936      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/7962936.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(RTL编码风格所造成的仿真和综合的不匹配.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

RTL编码风格所造成的仿真和综合的不匹配.docx

1、RTL编码风格所造成的仿真和综合的不匹配RTL编码风格所造成的仿真和综合的不匹配1.0简介ASIC或者FPGA设计就是把一个想法或者概念转换成物理实现的过程。这篇文章讨论了HDL编码风格所造成的 RTLGate-level 仿真的不一致的几种情况。它的一个基本的判定规则是,符合以下两种情况的编码风格是坏的编码风格。提供给HDL仿真器的关于设计的信息不能传送给综合工具综合开关提供给综合工具的信息在仿真器中不可得如果上犯了上两条禁忌,就会造成综合前的 RTL仿真和综合后的门级仿真不匹配的问题。这些问题很难发现,因为由于门的数量的增多,完备测试是不可能的,而且如果不注意会最终导致ASIC生产的失败。

2、解决方法就是了解什么样的编码风格或者综合选项会导致 RTL到门级的仿真不一致,并避免这些问题。2.0敏感列表当一个always 块中并不包含 Verilog 的关键字 posedge 或者negedge 的时候综合工具 会把它综合成组合或者锁存器逻辑。对于一个组合逻辑 always块,逻辑直接从块中的等式中推导岀,*而与敏感列表没有关系 *。综合工具读取敏感列表,并把它与 always块中的等式相比较,报告岀可能造成 pre-和post-synthesis 仿真不一致的疏漏的敏感列表。若一个信号在敏感列表中岀现而没有在 always 块用到,它不会对pre-和post-synthesis造成任

3、何功能上的不同。多余的敏感信号的唯一的后果就是使仿真变慢了。2.1不完全敏感信号列表综合工具总是把 always块中的等式按完整敏感信号来综合。但是 pre-s yn thesis 的功能仿真就会非常不同。module code1a (o, a, b);output o;in put a, b;reg o;always (a or b)o = a & b;en dmodule在code1a 中敏感列表时完整的, pre-synthesis 和post-synthesis 都会按一个 2输入and门来仿真module code1b (o, a, b);output o;in put a, b;r

4、eg o; always (a) o = a & b;en dmodule在codelb 中敏感列表不完整, post-synthesis 仍然是个 2-input and 门,而在pre-synthesis 的仿真中只有在 a有变化的时候 always块才会执行。module code1c (o, a, b);output o; in put a, b;reg o; always o = a & b;en dmodulecode1c 不包括任何敏感列表,在 pre-s yn thesis 的时候仿真器在在 always 块中陷入无限循环,而 post-synthesis 仍然是个2-inpu

5、t and 门冈一2.2不同赋值顺序的完整敏感列表-在pre-synthesis 时always 块中的赋值语句会按顺序执行。 这样,在always 块中有局 部临时变量时就会产生问题,临时变量可能在 if语句的判断条件部分,case语句,或者赋值语句的右端中用到。 *如果一个临时变量在被赋值之前用到,就会导致赋值的乱序 *。直到temp变量的赋值语句被执行,temp将保持之前传送给它的值。*module code2a (o, a, b, c, d);*output o;*in put a, b, c, d;*reg o, temp;*always (a or b or c or d) beg

6、 in*o = a & b | temp;*temp = c & d;*end*en dmodule-在code2a中,temp在被赋值之前被用到, temp将保持之前的值。之后 temp被赋新值。在pre-synthesis 仿真中,temp将像一个锁存器。而在综合时,它会按正确的顺序赋值。此会造成不一致。*module code2b (o, a, b, c, d); output o;*in put a, b, c, d; reg o, temp; always (a or b or c or d) beg intemp = c & d;o = a & b | temp;*end en d

7、module-code2b 中pre-和post-synthesis 仿真结果是一致的。3.0 fun ctio n-fun cti on 总是被综合成组合电路,由于这个原因,一些工程师把所有的组合逻辑都用fun ction 来实现。如果fun ction 按照组合逻辑来仿真使用 fun ction 是没有什么问题的。 当工程师在function 中的组合逻辑中犯了错误而使它仿真时像一个锁存器,就会产生错 误。当function 代码仿真寄存器的行为的时候综合工具是没有警告信息的。用 function建模组合逻辑是危险的。*module code3a (o, a, n rst, en); ou

8、tput o;*in put a, n rst, en;*reg o; always (a or nrst or en)*if (!n rst) o = 1b0;*else if (en) o = a;*en dmodule-code3a 是设计锁存器的典型方法。 module code3b (o, a, n rst, en); output o; in put a, n rst, en;*reg o; always (a or nrst or en)*o = latch(a, n rst, en); function latch; in put a, n rst, en;*if (!n rs

9、t) latch = 1bO;*else if (en) latch = a;*endfunction*en dmodule-code3b 中把相同的代码用在了一个 if语句中,产生了 3-input and 门。latch 的-如果在function 中的代码是用来生成 latch的,pre-synthesis 仿真将仿真成行为,为post-synthesis 仿真将会仿真成组合逻辑。从而造成不匹配。4.0 case 语句4.1Full Case输岀的仿这条*用编译指令synopsys full_case 给编译工具更多的关于设计的信息,而不能把这些信息提供给仿真工具 。这条特别指令是提醒编

10、译工具 ,case语句是fully defined 的,对于没用用到的 case是dont care 的。当用此条指令时, pre-和post-synthesis真可能会不同。此外,尽管此条指令是告诉编译工具把未用的的情况视为 不处理”,指令有时会使设计比忽略 full_case 时更大和更慢module code4a (y, a, en); output 3:0 y; in put 1:0 a;in put en;reg 3:0 y;always (a or en) begi ny = 4h0; case (e n, a)3b1_00: ya = 1b1;3b1_01: ya = 1b1;3

11、b1_10: ya = 1b1;3b1_11: ya = 1b1; endcaseenden dmodule在code4a中case没有综合指令,结果是三输入与门和一个反相器。 pre-和post-s yn thesis 仿真是一致的。 3b1_01: ya=1b1; 3b1_10: ya=1b1; 3b1_11: ya=1b1; endcase enden dmodule在code4b中case语句带综合指令 full_case ,正是因为此,在综合时 en输入被优化掉 而成为一个悬挂的输入。 code4a和code4b综合前的仿真结果以及 code4a综合后的结 果都是一致的,而它们是与

12、code4b综合后的结果不同的。可 4.2Parael Case*用编译指令synopsys parallel_case 给编译工具更多的关于设计的信息, 而不能把这些信息提供给仿真工具 *。这条编译指令是告诉编译器所有的情况是并行执行的, 尽管有重叠的情况(这种情况通常会形成一种优先编码器)。当设计中有重叠的 case时,pre-和post-s yn thesis 的仿真结果将会不同。在某些情况,用这条指令会使设计变得更大和更慢。添加parallel_case 的一个目的是优化面积和速度。 *优先编码器行为的 RTL模型通过了RTL级测试,但是如果在门级测试时忽略了这个漏洞(它其实是没有优先

13、级的并行逻辑), 导致的结果就是,设计是错误的,但是 bug直到ASIC原型交货前也没有发现,那么在高 度的金钱和时间成本下, ASIC必须重新设计。*module code5a (y, z, a, b, c, d);output y, z;in put a, b, c, d;reg y,乙always (a or b or c or d) begi ny, z = 2bo;casez (a, b, c, d)4b11?: z = 1;4b?11: y = 1;endcase enden dmodulecode5a会被被综合成成具有优先编码器的功能的逻辑。 但是code5b却被综合成两个 an

14、d门。module code5b (y, z, a, b, c, d);output y, z;in put a, b, c, d;reg y,乙always (a or b or c or d) begi ncasez (a, b, c, d) / synopsys parallel_case 4b11?: z = 1;4b?11: y = 1;endcaseend en dmodule综合工具指令synopsys parallel_case 的使用将导致具有优先编码器功能的逻辑实现成并行逻辑,从而导致综合前后的不匹配。4.3Casexcasex语句的使用也会导致设计问题。 casex把X视

15、为dont care(如果它们岀现在 case表达式和case条目里)。casex所导致的问题会在 casex表达式的输入被初始化成不定值时岀现。在处理 casex语句时,综合前仿真会把不定值视为 dont care。综合后的仿真把X在门级的模型中传递。有个公司在他们的设计中使用了 casex语句。casex语句的输入在复位后成为不定值,因为综合前RTL仿真把未知的输入视为dont care , casex语句错误地初始化设计在工作状态,而门级仿真并不够复杂或者说详细以致于没有发现这个错误,从而使递交的 ASIC带着严重的 bug。module code6 (memceO, memce1, c

16、s, en, addr);output memce0, memce1, cs;in putin put 31:30 addr;en;regalways (addr or en) beg inmemce0, memce1, cs;memceO, memce1, cs casex (addr, en)=3b0;3b101: memce0 =1b1;3b111: memce1 =1b1;3b0?1: csendcaseenden dmodule=1b1;code6是一个带着enable信号的简单的地址解码器,有时外部接口的设计错误会导致enable信号初始化后在被设置成一个有效状态之前成为不定值。

17、当enable处于未知状态时,case选择器基于addr信号错误地匹配 case选项。这个初始化的问题只有在 post-synthesis 仿真时岀岀现。一个类似的情况就是,当 en有效,地址线的 MSB位成为不定值时。这将会导致 memceO 或者memce1 有效,而不管片选 cs信号是否有效。4.4casezcasez语句会导致和casex相同的设计问题,只不过它在验证时更容易被发现。用 casez当输入被初始化成高阻态时就会岀现问题。但是 casez是设计很多结构的一种简洁和有效的方式,如优先编码器,中断处理器,和地址解码器。因此当设计工程师再用 HDL设计某些结构时应该考虑用 cas

18、ez语句。module code7 (memceO, memcel, cs, en, addr);output memceO, memcel, cs;in putin put 31:30 addr;en;regalways (addr or en) beg inmemce0, memcel, cs;memceO, memcel, cs casez (addr, en)=3b0;3b101: memceO =1b1;3b111: memcel =1b1;3b0?1: cs=1b1;endcaseenden dmodulecode7是与code6相同的带enable信号的简单地址解码器,只不过它用

19、 casez替换了casex。当某个输入成为高阻态而不是有效值时,它会与 code6产生相同的问题。同样,错误的case匹配会发生(取决于 case语句输入的状态)。然而, casez语句的匹配(浮 置输入(float ingin put )或者三态驱动信号)比 cazex语句匹配(信号成为不定值)可能性要小得多。*但是casez语句在设计地址解码器和优先编码器的时候是很有用的 *使用原则* :在RTL级谨慎使用casez语句。5.0初始化5.1 X初始化当在RTL代码中复制时,有时会被赋给 X值。X被Verilog仿真器解释为不定值(casex例外),但是会被综合工具当做 dont care

20、。赋值成X会导致综合前后仿真的不一致。但是赋值成X值也是一种有用的技巧。在 FSM设计中,存在未用到的状态时,把状态变量赋值成X可以帮助调试状态转换。这是在进入 case状态之前把状态寄存器赋值成 X值(它是为所有的不正确的状态而准备)。切记,综合工具将把任何的 X值解释为dontcare。module code8a (y, a, b, c, s);*output y;*in put a, b, c;*in put 1:0 s;*reg y;*always (a or b or c or s) begi ny = 1bx; case (s)2b00: y = a;2b01: y = b;2b1

21、0: y = c; endcaseenden dmodule module code8b (y, a, b, c, s);output y;in put a, b, c;in put 1:0 s;reg y;always (a or b or c or s) case (s)2b00: y = a;2b01: y = b;2b10, 2b11: y = c;endcaseen dmodulecode8a 和code8b 是3选1选择器的简单的 Verilog 模型。如果一旦 case的2b11 情 况发生,code8a的编码风格会造成仿真的不一致。而在 code8b中则不会发生这种情况。而这种

22、不匹配在 2b11情况永远不会发生时是有用的,因为一旦 2b11情况发生,y的仿真输出就会是不定值。5.2 用 translate_off/translate_on 初始化设计在translate_off 和translate_on ,对于综合工具是不可见的,而仿真工具可以。这样就会造成综合前后仿真的不一致,有可能在综合前仿真中初始化是正确的,但是在初始化之 后,结果就不正确了。module code9 (y1, go, clk, n rst); output y1;in put go, clk, n rst;reg y1;parameter IDLE = 1d0,BUSY = 1d1;reg

23、 0:0 state, n ext;/ Hiding the initialization of variables from the/ syn thesis tool is a very dan gerouspractice!/ syn opsys tran slate_offin itial y1 = 1b1;/ syn opsys tran slate_o nalways (posedge clk or n egedge n rst) if (!n rst) state = IDLE; else state = n ext; always (state or go) beg in n e

24、xt = 1bx; y1 = 1bO; case (state)*IDLE: if (go) n ext = BUSY;*BUSY: beginif (!go) next = IDLE;y1 = 1b1;end endcase enden dmoduletra nslate_off/tra nslate_ on 的初始化部分,会导致综合前后仿真结果的不一致。6.0 tran slate_off/tra nslate_ on 的一般用法tra nslate_off/tra nslate_ on 综合指令应该谨慎使用。 它们在显示设计的信息时是非常有用的,但是当它被用来模拟某种功能时是很危险的。一

25、个例外是异步复位和置位的 D触发器。他要求用非综合的模型提供正确的综合前仿真模型以和综合后模型匹配。这种条件按以下方式创建:置 reset有效,置set有效,置reset无效,使set继续有效。在这种情况,D触发器模型需要一点辅助来在综合前阶段正确建模 set条件。这是由于在 always块里只有在set/reset 的边沿时才会触发。当输入是异步的,一旦 reset信号被去除,set就会有效,但是这种情况不会发生,因为 always块不能被触发。为了解决这个问题,可以用translate_off/translate_on 指令强制输岀正确的值。 *最好的方法就是尽可能避免异步set/rese

26、t 触发器的使用。/ Gen erally good DFF with asynchronous set and resetmodule code10a (q, d, clk, rstn, setn);*output q;*in put d, clk, rst n, set n;*reg q;*always (posedge clk or n egedge rst n or n egedge set n)if (!rst n) q = 0; /asynchronous reset*else if (!setn) q = 1; / asynchronous set*else q = d;en d

27、module/ syno psys tran slate_off*/ Bad DFFwith asynchronous set and reset. This design*/ will not compile from Syn opsys, and the desig nwill*/ not simulate correctly.module codelOb (q, d, elk, rst n, set n);output q;in put d, elk, rst n, set n;reg q;always (posedge clk or rst n or set n)if (!rst n)

28、 q = 0; /asynchronous resetelse if (!setn) q = 1; / asynchronous setelse q = d;en dmodule/ syno psys tran slate_ on/ Good DFF with asynchronous set and reset and self-/ correcti ng/ set-reset assig nmentmodule code10c (q, d, clk, rst n, set n);output q;in put d, clk, rst n, set n;reg q;always (posed

29、ge clk or n egedge rst n or n egedge set n)if (!rst n) q = 0; /asynchronous resetelse if (!setn) q = 1; / asynchronous setelse q = d;/ syn opsys tran slate_offalways (rst n or set n)if (rstn & !set n) force q = 1;else release q;/ syn opsys tran slate_o nen dmodulecode10a 在仿真时99的情况是正确的,但是当 rstn的上升沿来到时,如果 setn 一直 是低电平,always块是不被触发的,这导致了仿真的不正确。而在 code10b 中不管是综合前后的仿真,还是综合本身,都会是错误的。而 code10c 会100%仿真正确,综合前后的仿真也会匹配,它使用translate_off/translate_on 综合指令,强制使输岀输岀正确的值。(这确实是很有意思)。7.0延

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1