一个困扰小弟3个月的FPGA难题,希望高手解答,不胜感激

2019-07-16 00:20发布

比如说两个模块由同一个时钟控制,完成的功能是 在同一个时钟沿到达的那一刻,A模块的对信号 sign1进行置位,同时B模块sign1是否置位,如果是的话就进行某项操作。
比如

  1. module A
  2. (
  3.         rst,clk,sign1
  4. );

  5.         input clk;
  6.         input rst;
  7.         output  reg sign1;
  8.         
  9.         always @(posedge clk or negedge rst)
  10.                 if(!rst)
  11.                         sign1<=1'b0;
  12.                 else
  13.                         sign1<=~sign1;
  14.                         

  15. endmodule


  16. module B
  17. (
  18.         rst,clk,sign1,sign2
  19. );

  20.         input clk;
  21.         input rst;
  22.         input sign1;
  23.         output reg sign2;
  24.         
  25.         always @(posedge clk or negedge rst)
  26.                 if(!rst)
  27.                         sign2<=1'b0;
  28.                 else if(sign1)
  29.                         sign2<=1'b1;
  30.                 else
  31.                         sign2<=1'b0;

  32. endmodule


  33. module top
  34. (
  35.         clk,sign2,rst
  36. );

  37.         input clk;
  38.         input rst;
  39.         wire sign1;
  40.         output sign2;
  41.         A a1
  42. (
  43.         .rst(rst),
  44.         .clk(clk),
  45.         .sign1(sign1)
  46. );

  47.         B B1
  48. (
  49.         .rst(rst),
  50.         .clk(clk),
  51.         .sign1(sign1),
  52.         .sign2(sign2)
  53. );


  54. endmodule
复制代码





如果按道理来说如果clk同时到达的话,A模块对sign1进行置位的时刻,B已经完成对数据sign1的检测,而sign1物理传输到B还要时间,所以这样本来应该会导致在一个时钟沿不能完成想要的功能,但是结果根据我这几个月做的东西来看,都是满足的。
所以我有以下的猜想

1.有可能是当综合软件检测到有这样行为的时候,会在综合时对布线进行控制,使得clk到达A的时间稍微早于B,那样就可以满足A的信号变化传递到B模块时clk才到B模块,使得模块不出问题。

2.综合软件并不会对布线进行控制,并且clk确实是同时到达,但是因为信号在线上的延时时间远小于寄存器建立时间,所以即使晚传递到B的信号也有足够的寄存器建立时间去建立数据,所以没有问题。

以上就是我自己的猜想,不知道是不是正确,如果都不正确那么究竟是怎么出现这样的情况呢。

希望懂的人能够回答,另外希望能够附上与这个问题相关资料供大家分享

刚开始学FPGA因为什么都不懂,也不懂什么亚稳态什么所以写起模块很容易,觉得很简单,写出来也是好使的,越是学的深了就越觉得无从入手,总是怕出现亚稳态,现在每写模块的时候都要考虑再三但是最后一分析还是存在可能导致亚稳态的问题。


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。