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

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 6294|回复: 8

[求助] 一个组合逻辑always@(<signal>)语句的测试(已解决,结论4楼)

[复制链接]
发表于 2013-4-21 23:21:16 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 changan1216 于 2013-4-22 12:06 编辑

求解:组合逻辑always语句的敏感信号为何会被综合器优化掉?

一个对组合逻辑always语句测试的简单代码,如下:





  1.     reg     out;
  2.     always @(ctl)
  3.         out = in;


复制代码



综合后形成的实际电路结构,以及仿真波形却等效于如下代码:





  1.     wire    out;
  2.     assign  out = in;


复制代码

综合后控制变量ctl被优化掉了,实际电路如下:

                              1.png

仿真波形如下:

前仿真:可以实现always @(ctl),敏感信号ctl对语句内代码的触发

2.png

后仿真:敏感信号ctl完全不起作用

3.png

Quartus+ModelSim /ISE 均是同样结果

求解:组合逻辑always语句的敏感信号为何会被综合器优化掉?

初步怀疑,如果使用always语句内部没有涉及到的信号做敏感信号,则综合时会被综合器直接砍掉……

完全失去代码本来目的.......

不知原因为何如此.求高手解答

初步怀疑,是否因为用always语句内没有涉及的信号做为敏感信号

源代码如下:

---------设计模块代码-------------------





  1. module t1(in, out, ctl);
  2.     input   in, ctl;
  3.     output  out;
  4.    
  5.     reg     out;
  6.     always @(ctl)
  7.         out = in;
  8.    
  9. //    wire    out;
  10. //    assign  out = in;

  11. endmodule


复制代码

----------测试模块代码----------------





  1. `timescale  1ns/1ps
  2. module  t1_tb();
  3.     reg     in, ctl;
  4.     wire    out;
  5.    
  6.     t1  t1_inst(
  7.         .in (in),
  8.         .out(out),
  9.         .ctl(ctl)
  10.     );
  11.    
  12.     initial
  13.     begin
  14.         in  = 1;
  15.         ctl = 1;
  16.         #270
  17.         ctl = 0;
  18.     end
  19.    
  20.     always #50 in = ~in;

  21. endmodule


复制代码

发表于 2013-4-22 08:36:11 | 显示全部楼层
这是一个典型的不可综合的例子。对RTL设计没有理解。
发表于 2013-4-22 09:48:28 | 显示全部楼层
out <= in ?
 楼主| 发表于 2013-4-22 12:01:55 | 显示全部楼层
回复 2# guoyu

感谢提示,已解决

一直以为always语句必然是可综合的....实际情况有所差异
always语句被综合为实际电路时,尤其是组合逻辑,只会关注always语句内实际代码,而不会关注所谓的敏感信号列表,
最终有效触发信号只和实际综合后形成的最终电路模型有关,因此敏感列表不完整或者多余时,并不影响综合后电路,
仿真差异原因,前仿真执行会通过敏感信号列表触发,才执行内部逻辑,而后仿真则完全按照综合后和实际电路对应的网表文件执行,已经没有所谓的敏感信号了
 楼主| 发表于 2013-4-22 12:04:31 | 显示全部楼层
回复 3# yucaoxilin


    与阻塞,非阻塞无关,不影响
发表于 2013-4-22 13:36:54 | 显示全部楼层
以后直接用always@*来实现组合逻辑即可。
发表于 2013-4-22 17:21:53 | 显示全部楼层
回复 6# guoyu

    正解,括号内敏感信号是给编译器看的,最终生成的电路才是主要的。
如果要实现控制,用if  else语句。
 楼主| 发表于 2013-4-22 19:31:05 | 显示全部楼层
回复 6# guoyu


    非常感谢~~~早上起来,您一句不可综合直接点醒我了,....
从接触verilog到几小时前,一直以来印象都是always是可综合的,从没怀疑过居然会不可综合.....一直纠结可综合为什么还会被砍掉........
您一句不可综合,恍然大悟,仔细想想,这种想在组合逻辑中,依靠X信号变化一次触发其他和X信号无关的信号传递一次的逻辑,在实际电路中应该是不可实现的,貌似只能老实的改为时序逻辑了......

另一个例子,
always @(*)
    if(ctl)
        out = in;
    else
        out = in;
ctl即便做了条件判断信号,但由于实际逻辑的原因,同样会被综合器优化砍掉,依然等价于
assign out = in;
发表于 2013-4-23 09:09:34 | 显示全部楼层
问题讨论的够深入
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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


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

GMT+8, 2024-11-22 11:31 , Processed in 0.022740 second(s), 8 queries , Gzip On, Redis On.

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