Я использую Xilinx, который использует XST для синтеза моего дизайна. У меня проблемы, когда я пишу что-то вроде someReg[offest*index+:constant] <= someOtherReg;
. Приведена ошибка: «Индекс переменной не поддерживается в сигнале». После поиска в Интернете я понял, что индексирование сигнала, расположенного слева, не поддерживается инструментом синтеза XST.
Мне интересно, как реализовать эту логику индексации сигнала без использования этого синтаксиса. В приведенном ниже примере я создаю множитель Matrix, который повторно использует множитель rowByColumn.
Обычно при каждом нарастающем фронте тактового сигнала я загружаю новые значения на вход множителя rowByColumn, а при следующем нарастающем фронте тактового сигнала я сохраняю результат в новом регистре. Сохранение результата в новом регистре - основная моя проблема.
Вот код, который дает ошибку. Не могли бы вы предложить способы решения или обхода проблемы.
module MatrixSeq(clk,A,B,C);
// param
parameter WIDTH = 32;
parameter ROW_A = 2;
parameter COL_A = 2;
parameter ROW_B = 2;
parameter COL_B = 2;
//ports
input clk;
input [WIDTH*COL_A*ROW_A-1:0] A;
input [WIDTH*COL_B*ROW_B-1:0] B;
output [WIDTH*ROW_A*COL_B-1:0] C;
// inputs to rowBycol
reg signed [WIDTH*COL_A-1:0] currentRowA;
reg signed [WIDTH*ROW_B-1:0] currentColB;
reg signed [WIDTH-1:0] rowByColOut;
wire signed [WIDTH-1:0] rowByColOutWire; // wire to connet to rowByColOut
// A,B matrix holders
reg signed [WIDTH*COL_A*ROW_A-1:0] AsigHolder;
reg signed [WIDTH*COL_B*ROW_B-1:0] BsigHolder;
reg signed [WIDTH*ROW_A*ROW_B-1:0] CsigHolder; // C = A*B
// reg signed [WIDTH-1:0] count;
integer idxA = 0; // iterates through the rows of A
integer idxB = 0; // iterates through the 'rows' of B
// Indexing Syntax:
// signalAdd[some_expression +: some_range];
// Resolves to
// signalAdd[some_expression + (some_range - 1) : some_expression];
always @(posedge clk) begin // assume we have the transpose of matrix B
currentRowA <= AsigHolder[WIDTH*COL_A*idxA+:WIDTH*COL_A];
currentColB <= BsigHolder[WIDTH*COL_B+idxB+:WIDTH*COL_B];
CsigHolder[WIDTH*(idxA*ROW_A+idxB)+:WIDTH] <= rowByColOut; // Error: 'Variable index is not supported in signal.'
idxB <= idxB +1;
if(idxB == ROW_B) begin // multiply each row of A with every 'row' B
idxA <= idxA + 1;
idxB <= 0;
end else if(idxA == ROW_A) begin
idxA <= 0;
idxB <= 0;
end
end
assign rowByColOutWire = rowByColOut;
rowBycol rowMultColumn (.CLK(clk), .a(currentRowA), .b(currentColB), .y(rowByColOutWire)); // row by column multiplier
assign C = CsigHolder;
endmodule
Чтобы прояснить ситуацию, проблема заключается в третьей строке внутри блока always, которая выдает ошибку «Индекс переменной не поддерживается в сигнале».