在线咨询 切换到宽版
eetop公众号 创芯大讲堂 创芯人才网

 找回密码
 注册

手机号码,快捷登录

手机号码,快捷登录

搜全文
查看: 12663|回复: 17

[求助] 一个不小心导致的隐秘的组合逻辑环

[复制链接]
发表于 2015-10-28 17:42:44 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

×
最近在写代码的时候发现一个很隐秘的组合逻辑环,一个不小心就会出现,应该是自己代码习惯的问题。代码见下方。刚好如下的两个模块fsm和fack形成了一个组合逻辑环“ack_i -> nstate -> req_o -> ack_i",用modelsim仿真一下代码会直接报错,用quartusII编译综合可以通过,但是会有警告表明产生了组合逻辑环。
仔细分析,产生这种情况的原因是,两个模块中都存在”input -> output 的组合逻辑“,如果这两个电路刚好匹配,就会形成组合逻辑环。但是如果是两个规模较大的模块,发现这种比较隐蔽的组合逻辑环感觉应该不是那么简单。


问题来了:是不是说每个模块里面最好将输入和输出用至少一级寄存器隔开比较安全?因为你不仔细分析不会知道其他人的代码是怎么写的,如果一旦产生了组合逻辑环,再次修改代码可能会导致比较复杂的改动(当然这里举例比较简单)。所以考虑安全性,最好采用这种方式。


请问,我的分析是不是正确的?上面讲的代码方式”每个模块里面最好将输入和输出用至少一级寄存器隔开比较安全“是不是应该采取?还是说”出现问题后再修改设计切断组合逻辑环“?谢谢!

代码如下:"fsm.v":


   

        

                
  1. `timescale 1ns/1ns

  2. module fsm(
  3.          input         clk
  4.         ,input         rst_n
  5.         ,output req_o
  6.         ,input         ack_i
  7.         ,output led_o
  8. );
  9.        
  10.         localparam         F_IDLE         = 2'd0,
  11.                                                         F_S0                =        2'd1,
  12.                                                         F_S1                =        2'd2;
  13.        
  14.         reg        [1:0] cstate;
  15.         reg        [1:0]        nstate;
  16.        
  17.         always @(posedge clk,negedge rst_n) begin
  18.                 if(!rst_n)
  19.                         cstate <= F_IDLE;
  20.                 else
  21.                         cstate <= nstate;
  22.         end
  23.        
  24.         always @( * ) begin
  25.                 case(cstate)
  26.                         F_IDLE:
  27.                                 nstate = F_S0;
  28.                                
  29.                         F_S0:
  30.                                 if(ack_i)
  31.                                         nstate = F_S1;
  32.                                 else
  33.                                         nstate = F_S0;
  34.                        
  35.                         F_S1:
  36.                                 nstate = F_IDLE;
  37.                        
  38.                         default:
  39.                                 nstate = F_IDLE;
  40.                        
  41.                 endcase
  42.         end
  43.        
  44.         //assign req_o = (cstate == F_S0);  //ok;
  45.         assign req_o = (cstate == F_S0) && (nstate == F_S0);  //error;
  46.        
  47.        
  48.         assign led_o = (cstate == F_S1);
  49.        
  50.        
  51. endmodule

  52.         

   

    复制代码




"fack.v":


   

        

                
  1. `timescale 1ns/1ns

  2. module fack(
  3.          input         req_i
  4.         ,output ack_o
  5. );

  6.         assign ack_o = req_i;
  7.        
  8. endmodule

  9.         

   

    复制代码



"top.v":


   

        

                
  1. `timescale 1ns/1ns

  2. module top(
  3.          input         clk
  4.         ,input         rst_n
  5.         ,output led_o
  6. );

  7.         fsm                                fsm(
  8.                  .clk                        (clk        )
  9.                 ,.rst_n                (rst_n)
  10.                 ,.req_o                (req        )
  11.                 ,.ack_i                (ack        )
  12.                 ,.led_o                (led_o)
  13.         );
  14.        
  15.         fack                        fack(
  16.                  .req_i                (req        )
  17.                 ,.ack_o                (ack        )
  18.         );
  19.        

  20. endmodule

  21.         

   

    复制代码
 楼主| 发表于 2015-10-28 19:00:32 | 显示全部楼层
怎么没人遇到么,,,,,
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-10-29 08:18:12 | 显示全部楼层
回复 3# liuguangxi


   嗯,谢谢了,设计时考虑好电路结构才是最重要的。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-11-14 15:20:59 | 显示全部楼层
回复 11# wdzic_fbb


   谢谢你的回复,这个我只是举一个简单的例子,当组合逻辑环由两个复杂模块甚至更多个复杂模块共同形成时,产生组合逻辑环就比较难发现,我想表达的只是这个意思。当然,事先进行设计的划分非常重要。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-11-14 15:23:47 | 显示全部楼层
回复 6# yucaoxilin


   是的,仿真或者综合都会产生warning或者error,但是最好在写代码之前就发现,等到所有的代码都集成好,可能由于时序原因,改动比较复杂。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-11-14 15:29:04 | 显示全部楼层
回复 7# wsz561208

  谢谢你的回复,我有两个疑问:
  1. 比如像mux这种组合逻辑,如果不用always 和case产生,用assign怎么设计?  2.“你的状态机避免使用组合逻辑而使用时序逻辑,不能实现你的要求吗?我感觉这样好理解些”是什么意思呢?这种三段式状态机不是最常用呢么?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-11-14 15:30:01 | 显示全部楼层
回复 8# glsunxiaofeng


   恩,最后一句话是关键。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-11-14 15:32:53 | 显示全部楼层
回复 5# fishkking


   恩,谢谢。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-11-14 15:34:23 | 显示全部楼层
回复 9# yaya126


   我只听过没用过lint这个工具,o(╯□╰)o
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /1 下一条


手机版| 小黑屋| 关于我们| 联系我们| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2025-9-17 03:32 , Processed in 0.020184 second(s), 6 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表