当前位置:首页 > > 芯片验证工程师
[导读]下面是一个小的真实verilog代码,具有异步set/reset逻辑(低电平有效)的触发器模型。这个verilog模型可以正确地综合,但在一个cornercase情况下仿真结果不正确。这个cornercase是什么?always_ff@(posedgeclkornegedgers...

下面是一个小的真实verilog 代码,具有异步set/reset逻辑(低电平有效)的触发器模型。这个verilog模型可以正确地综合,但在一个 corner case情况下仿真结果不正确。这个 corner case是什么?

always_ff @( posedge clkor negedge rst_n // active-low resetor negedge set_n // active-low set)if (!rst_n) // reset has priority over set q_out <= '0; // reset all bits to zeroelse if (!set_n) q_out <= '1; // set all bits to oneelse q_out <= data_in; // d input assignment这个verilog模型按预期正确地进行综合,然而在某些仿真条件下功能错误。


当rst_n变低,它可以正确地异步复位触发器。然后拉低set_n,在rst_n和set_n同时为低的情况下,触发器将正确地保持复位,因为在verilog代码中复位的优先级比置位的优先级高。


到目前为止,一切都很好。接下来,rst_n变高,set_n保持低。由于敏感度列表只对rst_n和set_n的负边沿敏感,因此rst_n的拉高不会触发敏感列表。这意味着,当只有set_n为低电平时触发器仍然处于复位状态!

 

这个问题引入的关键在于,实际的异步置位/复位是电平敏感的,因此当复位信号rst_n被拉高时仍然会正确地发生置位。这就使得仿真和综合后的电路行为mismatch。

 

为了避免这种麻烦,有两种推荐的编码风格:

第一种方法:

1)在敏感度列表中新增一个敏感条件。

2)使用条件编译(`ifdef/`endif)或综合选项(translate_off/translate_on)对综合工具隐藏。

always_ff @( posedge clkor negedge rst_n // active-low resetor negedge set_n // active-low set`ifndef SYNTHESIS // non-synthesizable simulation codeor posedge (rst_n
本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除( 邮箱:macysun@21ic.com )。
换一批
延伸阅读
关闭