所以我正在为DES.But写一段代码,现在我遇到了一个我无法通过的障碍。
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。
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如果我这样写的话...
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中的延迟呢?这里是参考的刺激块。
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
发布于 2017-09-28 20:43:07
你有一个竞态条件。所有module中的所有initial块同时执行。因此,如果您的刺激模块的初始块在另一个初始块之后执行,则其他块的输入不会发生变化。
但不能用初始块对硬件进行建模。因此,对于组合逻辑,它们需要模型对其输入敏感,对于时序逻辑,它们需要对时钟边缘敏感。
发布于 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),其中...位于后沿或负沿时钟信号中。
在initialPermutation和finalPermutation中,将initial更改为always_comb,您应该会得到非X的结果。如果您使用Verilog always @*策略,那么在您的测试台中分配plain之前,您可能需要添加一个#1。
https://stackoverflow.com/questions/46465386
复制相似问题