版主: 51FPGA

分享到:
共1条 1/1 1   

由IOB = true失败引发的问题

    [您是本帖的第1071位阅读者]
091217272
我是MM
高级会员

最后登陆时间:2015-01-13 22:12:51

直达楼层
1# 发表于 2015-07-16 22:40:16

本质上是要把如下述的一个同步置位/复位FD放入IOB中(即使用OFD)

always @(posedge clk or negedge rst_n)
if (!rst_n) SS <= 1'b1;
else
if ( rst ) SS <= 1'b0;
else if ( set ) SS <= 1'b1;

 

如果逻辑中仅包含这个简单的逻辑的话,通过UCF约束,放入IOB是没问题的。但是,实际逻辑复杂了,这个FD就放不到IOB去。报的警告是,因为存在反馈... 所以不能放入IOB。

从FPGA Editor 看来,对应的FD没有使用CE,而确实是由反馈实现状态保持,即应该是实现成如下形式:

SS <= (set | SS) & ~rst;

输入激励中存在输出的反馈。并且功能与前述等效。

 

通过RTL看逻辑,形式上是  FD的CE端输入为 (rst || set), D输入为~rst;

相当于 if (rst || set)   SS <= ~rst;

这也与前述功能等效。

 

那么,为了达到把它放到 IOB的目的,我决定设计一个功能相同但输入简单的“副本” DUP_SS,即

SS             <= (set | SS) & ~rst;

DUP_SS  <= (set | SS) & ~rst;

前者有反馈,后者没有。两个时序相同,所以企图把后者放IOB,实现目的。

 

但不幸的是,编译把它优化掉了----认为两个是一样的,仍然不把余下的那个放入IOB。

 

最终,我通过将这两个reg(FD)的异步初值设为不同,编译才认为这两个不同。我才达到把这个输出放入IOB的目的。
虽然达到了目的,但感觉很不爽。

 

请教各位,有没有什么更好的方法,避免前面编译认为两个逻辑一样而被“优化”掉一个的情况呢?

 

谢谢!

共1条 1/1 1   
快速回复主题
  • 匿名不能发帖!请先 [ 登陆 注册 ]