Я новичок здесь и пока не могу комментировать вопросы, но в ответ на Марти: большинство инструментов синтеза FPGA преобразуют внутренние многоисточниковые сигналы со значениями трех состояний в MUX-подобную логику, где это возможно. См., Например: описание старого трехстороннего логического поведения, которое звучит точно для меня .
В качестве рекомендации для Адама вам, вероятно, лучше сделать это явным в своем коде, выполнив маскировку самостоятельно, а не используя тристаты. Это улучшит переносимость, даст вам более предсказуемые результаты и послужит самодокументированием, если кто-нибудь когда-нибудь будет пересматривать ваш код.
Однако, делая некоторые предположения на основе вашего решения, вероятно, имеет смысл просто замаскировать разрешение синхронизации на порте записи и преобразовать выходной сигнал порта чтения. Например:
reg [WIDTH-1:0] do_a,do_b;
always @(*) do_a = do_a_int[head];
always @(*) do_b = do_b_int[tail];
generate
genvar i;
for (i = 0; i < regnum; i=i+1) begin: regs
rfram_generic rf (clk,rst,
ce_a,addr_a,do_a_int[i],
ce_b,addr_b,do_b_int[i],
ce_w,head==i?we_w:1'b0,addr_w,di_w);
end
endgenerate
Это, вероятно, приведет к менее сложной логике (, т.е. , лучшая площадь и задержка), чем ваше решение.