Что касается уменьшения заголовка ИЛИ, который не работает должным образом при нарезке битов в цикле. Это выдержка из того, что у меня есть:
logic [3:0][1:0] quad_mask_dq_qq;
logic [1:0] dfifo_rrdy_qq;
always_comb begin
for (int qq = 0; qq < 2; qq++) begin
dfifo_rrdy_qq[qq] = (|quad_mask_dq_qq[2*qq +: 1]);
end
end
Пример quad_mask_dq_qq = {2,0,0,1}
Ожидание dfifo_rrdy_qq = {1,1} то, что я получил на самом деле = {0,1}
Я ожидаю, если написать более подробно, что нарезка будет такой же, как и:
dfifo_rrdy_qq[0] = (|quad_mask_dq_qq[1:0]);
dfifo_rrdy_qq[1] = (|quad_mask_dq_qq[3:2]);
Что-то с циклом, который я здесь не рассматриваю?
Чтобы это сработало, вам нужно уменьшить два элемента массива за раз.
Текущий дизайн сокращает один элемент.
module tb ();
logic [3:0][1:0] quad_mask_dq_qq = '{2'b10, 2'b00, 2'b00, 2'b01};
logic [1:0] dfifo_rrdy_qq;
localparam NUM_ELEM_TO_REDUCE = 2;
always_comb begin
for (int qq = 0; qq < 2; qq++) begin
// dfifo_rrdy_qq[qq] = ( | (quad_mask_dq_qq[2 * qq +: 1]));
// ----------------------------------------------------------------
// Reduce two elements at a time, not one
// ----------------------------------------------------------------
dfifo_rrdy_qq[qq] = ( | quad_mask_dq_qq[2 * qq +: NUM_ELEM_TO_REDUCE] );
$display("reduction = %0b", dfifo_rrdy_qq[qq]);
end
end
endmodule
Принты
reduction = 1
reduction = 1
В операции выбора части a +: b
термин b — это размер («возьмем b элементов, начиная с a»)
Код в посте сокращается более чем на один элемент.
См. стандарт IEEE 1800-2017 для SystemVerilog, раздел 7.4.6 Индексирование и нарезка массивов.
Мне всегда приходится замедляться и думать о том, как работает нарезка с помощью этого оператора.
Да, это проблема. Так просто, и все же я не мог этого увидеть. Спасибо @Mikef :)