Я разрабатываю модуль, который принимает несколько каналов и выводит один канал.
Каждый канал состоит из сигнала valid
и ширины data
.
Если канал имеет действительные данные, модуль должен вывести этот канал. Если у нескольких каналов есть действительные данные, модуль должен вывести один из них (в моем случае это канал с наивысшим индексом), а остальные отбрасываются.
Моя простая реализация выглядит так:
module test1 #(
parameter NUM_CHANNEL = 8,
parameter DATA_WIDTH = 512
) (
input logic [DATA_WIDTH - 1 : 0] data_in [NUM_CHANNEL],
input logic valid_in [NUM_CHANNEL],
output logic [DATA_WIDTH - 1 : 0] data_out,
output logic valid_out
);
always_comb begin
valid_out = 0;
for (int i = 0; i < NUM_CHANNEL; ++i) begin
if (valid_in[i]) begin
valid_out = 1;
data_out = data_in[i];
end
end
end
endmodule
Отлично работает как в симуляции, так и в реальной схеме (FPGA).
Однако канал может быть сложного типа, поэтому я использовал такой интерфейс:
interface channel #(
parameter DATA_WIDTH = 512
);
logic valid;
logic [DATA_WIDTH - 1 : 0] data;
modport in (
input valid,
input data
);
modport out (
output valid,
output data
);
endinterface // sub_csr_if
module test #(
parameter NUM_CHANNEL = 8,
parameter DATA_WIDTH = 512
) (
channel.in in[NUM_CHANNEL],
channel.out out
);
always_comb begin
out.valid = 0;
for (int i = 0; i < NUM_CHANNEL; ++i) begin
if (in[i].valid) begin
out.valid = 1;
out.data = in[i].data;
end
end
end
endmodule
Затем этот код получает ошибку Nonconstant index into instance array 'sub_port'.
в ModelSim и ошибку i is not a constant
в Quartus.
Если я разверну цикл, он будет работать, но станет непараметрическим кодом. (работает только для фиксированной NUM_CHANNEL)
Почему последний не работает, а первый работает безупречно?