Ваша проблема: stgout[0]
объявлен внутри неназванного блока begin/end
, и вы не можете получить к нему доступ снаружи блока. Это также проблема для соединений порта CKOR2
. Присвоение имен блокам не решит вашу проблему, поскольку вам придется переключаться между ссылками на ветку i==0
, когда i
равен 1, и другой веткой, когда i!=1
. Лучше перенести объявления за пределы if/else
веток. Я не проверял математику, но это должно приблизить вас:
module test ( A, o );
parameter WIDTH = 9 ;
input [WIDTH-1:0] A;
output o;
localparam NUM_OR_STAGES = $clog2(WIDTH) ;
genvar i;
for (i=0; i < NUM_OR_STAGES; i=i+1) begin: OR
localparam width = WIDTH*2/(i+1);
localparam width_div2 = width/2;
localparam offset = ( width % 2);
wire [width_div2+offset-1:0] stgout;
if ( i == 0 ) begin
assign stgout = A;
end else begin
wire [width_div2-1:0] stgo;
CKOR2 u_ckor[width_div2-1:0] ( .o(stgo), .i0(OR[i-1].stgout[width-1:width-width_div2]), .i1(OR[i-1].stgout[width-width_div2-1:width-2*width_div2]));
if ( offset )
assign stgout = { stgo,OR[i-1].stgout[0] };
else
assign stgout = stgo;
end
end
assign o = OR[NUM_OR_STAGES -1].stgout;
endmodule