微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > FPGA,CPLD和ASIC > 一个组合逻辑always@(<signal>)语句的测试(已解决,结论4楼)

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

时间:10-02 整理:3721RD 点击:

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

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

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

复制代码


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

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

复制代码

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

                             

仿真波形如下:

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



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



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

复制代码

这是一个典型的不可综合的例子。对RTL设计没有理解。

out <= in ?


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



    与阻塞,非阻塞无关,不影响

以后直接用always@*来实现组合逻辑即可。


    正解,括号内敏感信号是给编译器看的,最终生成的电路才是主要的。
如果要实现控制,用if  else语句。



    非常感谢~早上起来,您一句不可综合直接点醒我了,....
从接触verilog到几小时前,一直以来印象都是always是可综合的,从没怀疑过居然会不可综合.....一直纠结可综合为什么还会被砍掉........
您一句不可综合,恍然大悟,仔细想想,这种想在组合逻辑中,依靠X信号变化一次触发其他和X信号无关的信号传递一次的逻辑,在实际电路中应该是不可实现的,貌似只能老实的改为时序逻辑了......
另一个例子,
always @(*)
    if(ctl)
        out = in;
    else
        out = in;
ctl即便做了条件判断信号,但由于实际逻辑的原因,同样会被综合器优化砍掉,依然等价于
assign out = in;

问题讨论的够深入

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top