所以我正在为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
答案 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时钟信号中。
在initialPermutation
和finalPermutation
将initial
更改为always_comb
,您应该获得非X结果。如果您使用Verilog always @*
策略,则可能需要在测试平台中分配#1
之前添加plain
。