延迟for循环

时间:2017-09-28 09:15:47

标签: verilog system-verilog

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

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  

这是最初的排列,它运行得非常好......但是对于最终的排列......

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

这是代码.....它不运行并只提供“xxxx ....”......但是如果我这样写的话......

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看起来完全相同但是没有延迟运行...其中有差别???我该怎么做才能消除finalPermutation的延迟? 这是参考的刺激块...

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

2 个答案:

答案 0 :(得分:1)

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

但是,人们不会使用初始块对硬件进行建模。它们需要对组合逻辑的输入敏感的模型,或者对时序逻辑的时钟边缘敏感。

答案 1 :(得分:0)

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

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

当依赖于输入信号时,组合RTL逻辑应使用always_comb(SystemVerilog)或always @*(Verilog)。如果您在Verilog和SystemVerilog之间进行选择,请转到SystemVerilog路线。 always @*无法保证在时间0进行评估(模拟器可选)。顺序RTL逻辑应使用always_ff @(...)(SystemVerilog)或always @(...)(Verilog),其中...位于posedge或negedge时钟信号中。

initialPermutationfinalPermutationinitial更改为always_comb,您应该获得非X结果。如果您使用Verilog always @*策略,则可能需要在测试平台中分配#1之前添加plain