항상 블록 내에서 다른 모듈의 출력을 사용하고 싶습니다. 현재이 코드를 작동시키는 유일한 방법은 pi_in 지정 뒤에 # 1을 추가하여 Pi가 완료 될 수있는 충분한 시간이 경과했는지 확인하는 것입니다. 모듈 pLayer.v에서Verilog : 항상 블록에서 모듈 논리 평가 대기
주요부 :
Pi pi(pi_in,pi_out);
always @(*)
begin
for(i=0; i<constants.nSBox; i++) begin
for(j=0; j<8; j++) begin
x = (state_value[(constants.nSBox-1)-i]>>j) & 1'b1;
pi_in = 8*i+j;#1; /* wait for pi to finish */
PermutedBitNo = pi_out;
y = PermutedBitNo>>3;
tmp[(constants.nSBox-1)-y] ^= x<<(PermutedBitNo-8*y);
end
end
state_out = tmp;
end
Modllue Pi.v
`include "constants.v"
module Pi(in, out);
input [31:0] in;
output [31:0] out;
reg [31:0] out;
always @* begin
if (in != constants.nBits-1) begin
out = (in*constants.nBits/4)%(constants.nBits-1);
end else begin
out = constants.nBits-1;
end
end
endmodule
지연 때문에 # 1을 사용하지 않고 다른 방법이 최종 구현에 사용되어서는 안된다 ?
사실상 PermittedBitNo = pi_out은 Pi 모듈이 pi_in (= 8 * i + j)을 입력으로 사용하여 작업을 마친 후에 만 평가되기를 원합니다. Pi가 완료 될 때까지 어떻게이 선을 차단할 수 있습니까?
시계를 사용해야합니까? 그렇다면 힌트를주세요.
업데이트 : 내 모듈을 수정 Krouitch 제안을 바탕으로
. pLayer.v에서
: Pi.v에서
Pi pi(.clk (clk),
.rst (rst),
.in (pi_in),
.out (pi_out));
counter c_i (clk, rst, stp_i, lmt_i, i);
counter c_j (clk, rst, stp_j, lmt_j, j);
always @(posedge clk)
begin
if (rst) begin
state_out = 0;
end else begin
if (c_j.count == lmt_j) begin
stp_i = 1;
end else begin
stp_i = 0;
end
// here, the logic starts
x = (state_value[(constants.nSBox-1)-i]>>j) & 1'b1;
pi_in = 8*i+j;
PermutedBitNo = pi_out;
y = PermutedBitNo>>3;
tmp[(constants.nSBox-1)-y] ^= x<<(PermutedBitNo-8*y);
// at end
if (i == lmt_i-1)
if (j == lmt_j) begin
state_out = tmp;
end
end
end
endmodule
module counter(
input wire clk,
input wire rst,
input wire stp,
input wire [32:0] lmt,
output reg [32:0] count
);
[email protected](posedge clk or posedge rst)
if(rst)
count <= 0;
else if (count >= lmt)
count <= 0;
else if (stp)
count <= count + 1;
endmodule
: 여기에 업데이트 된 버전 당신이 여기있는 소프트웨어의 좋은 조각의
always @* begin
if (rst == 1'b1) begin
out_comb = 0;
end
if (in != constants.nBits-1) begin
out_comb = (in*constants.nBits/4)%(constants.nBits-1);
end else begin
out_comb = constants.nBits-1;
end
end
[email protected](posedge clk) begin
if (rst)
out <= 0;
else
out <= out_comb;
end
감사합니다. 그러나 지금은 out_comb가 항상 하나가 아니지만 (어떤 이유로) 2 사이클 후에 문제가 발생합니다. 그래서 내가 tmp에서 PermuteBitNo를 사용할 때 잘못된 결과를 반환합니다. – cie
게시물을 추가 할 수 있습니까? – Krouitch
out_comb는 항상 블록에 할당되어 있기 때문에 reg 여야합니다. 또한 왜 네가 무효화 재설정을 사용했는지 모르겠습니다. 구체적인 이유가 있습니까? – cie