20 / 37 · Conceito
generate: construir circuitos estáticos com laços
Use genvar e generate-if para hierarquias nomeadas e confira a distribuição dos lanes.
As aulas podem ser lidas gratuitamente. Inscreva-se para salvar o progresso.
O laço cria instâncias, não ciclos
genvar/generate repetem estrutura estática antes da execução. Um laço em always_comb descreve cálculo procedural, com hardware determinado na síntese. Nenhum significa automaticamente uma iteração por clock; processamento serial exige estado e controlador. Aqui o barramento packed é dividido em LANES palavras de W bits, calculando uma paridade por palavra. Ambos parâmetros são positivos.
module lane_parity #(
parameter integer W = 8,
parameter integer LANES = 3
) (
input logic [W*LANES-1:0] data,
output logic [LANES-1:0] parity
);
genvar lane;
generate
for (lane = 0; lane < LANES; lane = lane + 1) begin : g_lane
wire [W-1:0] word_data;
assign word_data = data[lane*W +: W];
assign parity[lane] = ^word_data;
end
endgenerate
endmoduledata[base +: W] seleciona W bits desde base em direção a índices maiores; W é constante. W=8, LANES=3 liga 7:0 ao lane 0,15:8 ao 1,23:16 ao 2. g_lane cria hierarquia estável, como g_lane[1].word_data.
Leia a ordem dos lanes
data=24'h03_01_80 tem 80,01,03 do lane 0 em diante. Paridades 1,1,0 dão parity[2:0]=011. O byte mais à esquerda é lane 2. Separe índice, exibição e transmissão. Todos calculam simultaneamente, sem latência registrada. Mais LANES aumenta lógica, não ciclos; fanout, roteamento e temporização física são verificações adicionais.
generate-if escolhe estrutura fixa
Sua condição é constante, como parâmetro para incluir registro. Sinal dinâmico pertence a bloco combinacional ou com clock. Incluir registro muda validade, exigindo atualização do contrato e checker. Não desative barramento usando zero: [−1:0] não é objeto de largura zero seguro. Rejeite configuração ou mantenha interface bem definida numa ramificação estática.
Prática: detecte troca de lanes
Teste o exemplo e acenda um bit em cada lane: só a paridade correspondente muda. Dois bits ativos dão paridade par 0. Dados iguais em todos lanes ocultam slices trocados. Extraia lanes numericamente na referência e conte bits 1. Teste W=1,8 e LANES=1,3, cobrindo byte, hierarquia e mínimos. Registre depois a paridade e defina reset, enable e comparação com barramento atual ou capturado na borda anterior.