首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >for循环中的延迟

for循环中的延迟
EN

Stack Overflow用户
提问于 2017-09-28 17:15:47
回答 2查看 1.5K关注 0票数 0

所以我正在为DES.But写一段代码,现在我遇到了一个我无法通过的障碍。

代码语言:javascript
复制
module initialPermutation(cipher,plain);
  output reg [63:0]cipher;
  input [63:0]plain;
  integer i,j,k;
  
  initial
    begin
      for(i=57,k=0;i<=63;i=i+2)
        begin
          for(j=i;j>=i-56;j=j-8,k=k+1)
            begin
              cipher[k]=plain[j];
            end
        end
      for(i=56;i<=62;i=i+2)
        begin
          for(j=i;j>=i-56;j=j-8,k=k+1)
            begin
              cipher[k]=plain[j];
            end
        end
    end
endmodule  

这是初始的排列,它为最终的排列完美地运行fine...but。

代码语言:javascript
复制
module finalPermutation(cipher,plain);
  output reg [63:0]cipher;
  input [63:0]plain;
  integer i,c;
  
  initial
    begin
      for(i=39,c=0;i>=32;i=i-1,c=c+1)
        cipher[0+c*8]=plain[i];
      
      for(i=7,c=0;i>=0;i=i-1,c=c+1)
          cipher[1+c*8]=plain[i];
 
      for(i=47,c=0;i>=40;i=i-1,c=c+1)
          cipher[2+c*8]=plain[i];
      
      for(i=15,c=0;i>=8;i=i-1,c=c+1)
          cipher[3+c*8]=plain[i];
      
      for(i=55,c=0;i>=48;i=i-1,c=c+1)
          cipher[4+c*8]=plain[i];
      
      for(i=24,c=0;i>=16;i=i-1,c=c+1)
          cipher[5+c*8]=plain[i];
      
      for(i=63,c=0;i>=56;i=i-1,c=c+1)
          cipher[6+c*8]=plain[i];
      
      for(i=31,c=0;i>=24;i=i-1,c=c+1)
          cipher[7+c*8]=plain[i];
     
    end
endmodule

这是code.....it没有运行,只给出了“XXXXX...”...but如果我这样写的话...

代码语言:javascript
复制
module finalPermutation(cipher,plain);
  output reg [63:0]cipher;
  input [63:0]plain;
  integer i,c;
  
  initial
    begin
      #1;
      for(i=39,c=0;i>=32;i=i-1,c=c+1)
        cipher[0+c*8]=plain[i];
      
      for(i=7,c=0;i>=0;i=i-1,c=c+1)
          cipher[1+c*8]=plain[i];
 
      for(i=47,c=0;i>=40;i=i-1,c=c+1)
          cipher[2+c*8]=plain[i];
      
      for(i=15,c=0;i>=8;i=i-1,c=c+1)
          cipher[3+c*8]=plain[i];
      
      for(i=55,c=0;i>=48;i=i-1,c=c+1)
          cipher[4+c*8]=plain[i];
      
      for(i=24,c=0;i>=16;i=i-1,c=c+1)
          cipher[5+c*8]=plain[i];
      
      for(i=63,c=0;i>=56;i=i-1,c=c+1)
          cipher[6+c*8]=plain[i];
      
      for(i=31,c=0;i>=24;i=i-1,c=c+1)
          cipher[7+c*8]=plain[i];
     
    end
endmodule

我在初始语句后插入了一个延迟,它运行得很好,initalPermutation和finalPermutation看起来完全一样,但是没有delay...where就不能运行,有什么区别吗?我应该怎么做才能消除finalPermutation中的延迟呢?这里是参考的刺激块。

代码语言:javascript
复制
module stimulus;
  reg [63:0]plain;
  wire [63:0]out;
  reg [63:0]key;
  
  finalPermutation i(out,plain);
  initial
    begin
      plain=64'b110001111;
      #2 $display("%b ",out);
    end
endmodule

EN

回答 2

Stack Overflow用户

发布于 2017-09-28 20:43:07

你有一个竞态条件。所有module中的所有initial块同时执行。因此,如果您的刺激模块的初始块在另一个初始块之后执行,则其他块的输入不会发生变化。

但不能用初始块对硬件进行建模。因此,对于组合逻辑,它们需要模型对其输入敏感,对于时序逻辑,它们需要对时钟边缘敏感。

票数 1
EN

Stack Overflow用户

发布于 2017-09-29 00:34:09

initial语句和块在时间0上只运行一次。如果在模拟中有多个initial,则在评估它们时没有保证确定的顺序。IEEE1364 (Verilog)和IEEE1800 (SystemVerilog)有意允许这种不确定性。模拟器倾向于基于编译和实例化顺序的评估顺序。您需要以不受此调度顺序影响的方式编写代码。

对于initial块和语句,不应该依赖非常量。唯一的例外是阻塞语句之后的非合成器代码(如模拟组件的测试台和行为模型)。

当依赖于输入信号时,组合实时逻辑应使用always_comb (SystemVerilog)或always @* (Verilog)。如果你要在Verilog和SystemVerilog之间做出选择,那就走SystemVerilog路线。always @*不保证在时间-0进行评估(模拟器可选)。顺序RTL逻辑应使用always_ff @(...) (SystemVerilog)或always @(...) (Verilog),其中...位于后沿或负沿时钟信号中。

initialPermutationfinalPermutation中,将initial更改为always_comb,您应该会得到非X的结果。如果您使用Verilog always @*策略,那么在您的测试台中分配plain之前,您可能需要添加一个#1

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46465386

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档