Я хочу использовать вывод другого модуля внутри всегда блока. В настоящее время единственным способом сделать этот код является добавление # 1 после назначения pi_in, чтобы прошло достаточно времени, чтобы позволить Pi завершить.Verilog: ждать модульной логической оценки всегда в блоке
Соответствующая часть из модуля pLayer.v:
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?
В сущности, я хочу PermutedBitNo = pi_out для оценки только после того, как модуль Pi завершил свою работу с помощью pi_in (= 8 * i + j) в качестве входных данных. Как я могу заблокировать эту строку до завершения Pi?
Должен ли я использовать часы? Если это так, пожалуйста, дайте мне подсказку.
обновление:
На основе предложений Krouitch я модифицированными мои модули. Вот обновленная версия:
От pLayer.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
От Pi.v:
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 всегда не один, но (по какой-то причине) два цикла позже. поэтому, когда я хочу использовать PermuteBitNo в tmp, он возвращает неверные результаты. – cie
Можете ли вы добавить свой пост с тем, что вы сделали? – Krouitch
Обратите внимание, что out_comb должен быть регистром, потому что он назначается в всегда блоке. Также я не уверен, почему вы использовали сбрасываемые сбрасывания. Есть ли конкретная причина? – cie