sundownhunter 0 24 февраля, 2012 Опубликовано 24 февраля, 2012 (изменено) · Жалоба Добрый день! Я новичок в SystemVerilog, и я столкнулся с проблемой, которую не могу решить самостоятельно. Прошу помочь. Проблема следующая. Есть блок, который задерживает некий сигнал, и формирует из него матрицу: module matrix_gen #( parameter MATRIX_X = 5, parameter MATRIX_Y = 13, parameter DATA_WIDTH = 16 ) ( input logic clk, input logic [DATA_WIDTH-1:0] DataIN [MATRIX_Y-1:0], output logic [DATA_WIDTH-1:0] MatrixOUT [MATRIX_X*MATRIX_Y-1:0] ); typedef logic [DATA_WIDTH-1:0] matrix_data [MATRIX_X*MATRIX_Y-1:0]; logic [DATA_WIDTH-1:0] data_latch [MATRIX_X-1:0][MATRIX_Y-1:0]; assign MatrixOUT = matrix_data'(data_latch); always_ff @(posedge clk) begin data_latch [MATRIX_X-1:1] <= data_latch [MATRIX_X-2:0]; data_latch [0] <= DataIN; end endmodule Получаем на выходе блока 65 проводов. Есть следующий блок, который представляет собой фильтр: module filter_5x5_pred #( parameter int DATA_WIDTH = 16 ) ( input logic clk, input logic rst, input logic [DATA_WIDTH-1:0] MatrixIN [24:0], output logic [DATA_WIDTH:0] DataOUT ); typedef logic [DATA_WIDTH-1:0] matrix_data [4:0][4:0]; localparam MAXVAL = (1 << DATA_WIDTH)-1; logic [DATA_WIDTH-1:0] data_col_latch [4:0][4:0]; assign data_col_latch = matrix_data'(MatrixIN); logic [DATA_WIDTH+1:0] tmp_1_1, tmp_1_2, tmp_1_3, tmp_1_4, tmp_1_5, tmp_1_6, tmp_1_7; logic [DATA_WIDTH+3:0] tmp2_1; logic [DATA_WIDTH+5:0] tmp2_2; logic signed [DATA_WIDTH+6:0] out; always_ff @(posedge clk, posedge rst) begin tmp_1_1 <= data_col_latch [0][0] + data_col_latch [0][1] + data_col_latch [0][2] + data_col_latch [0][3]; ... end always_ff @(posedge clk, posedge rst) begin if(rst) begin DataOUT <= 'd0; end else begin if (out < -MAXVAL) DataOUT <= -MAXVAL; else if (out > MAXVAL) DataOUT <= MAXVAL; else DataOUT <= out; end end endmodule и есть третий блок, который должен соединить 9 таких фильтров "каскадом" (т.е. с первого блока выходит матрица [12:0][4:0], и на первый фильтр должны быть поданы сигналы [4:0][4:0], на второй - [5:1][4:0] ... на последний - [12:8][4:0]): module filter_5x5_pred_x9 #( parameter int DATA_WIDTH = 8'd16 )( input logic clk, input logic rst, input logic [DATA_WIDTH-1:0] INPUT [64:0], output logic [8:0][DATA_WIDTH:0] OUTPUT ); typedef logic [DATA_WIDTH-1:0] matrix_data_in [4:0][12:0]; typedef logic [DATA_WIDTH-1:0] matrix [24:0]; wire [DATA_WIDTH-1:0] MatrixIN [4:0][12:0]; wire [DATA_WIDTH-1:0] matrix_wire [4:0][4:0]; assign MatrixIN = matrix_data_in'(INPUT); genvar i; generate for (i=0; i<9; i=i+1) begin: inner_filter_5x5 filter_5x5_pred filter ( .clk (clk), .rst (rst), .MatrixIN (matrix'(MatrixIN[4:0][i+4:i])), .DataOUT (OUTPUT) ); defparam filter.DATA_WIDTH = DATA_WIDTH; end endgenerate endmodule Первый и второй блок синтезируются без вопросов, все окей. в последнем блоке квартус ругается на строчку .MatrixIN (matrix'(MatrixIN[4:0][i+4:i])), вот такой ошибкой: Error (10768): Verilog HDL error at filter_5x5_pred_x9.sv(108): range must be the final index in the indexed namemust be the final index in the indexed name Очень прошу помочь. P.S. Конструкции вида input logic [DATA_WIDTH-1:0] [24:0] MatrixIN (пакованный массив?) в блоках не могут использоваться, ибо в фильтрах на входе знаковые числа (какого-то хрена квартус не понимает знаковые числа в шине) ... Изменено 24 февраля, 2012 пользователем sundownhunter Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Andy-P 0 24 февраля, 2012 Опубликовано 24 февраля, 2012 · Жалоба в последнем блоке квартус ругается на строчку .MatrixIN (matrix'(MatrixIN[4:0][i+4:i])), P.S. Конструкции вида input logic [DATA_WIDTH-1:0] [24:0] MatrixIN (пакованный массив?) в блоках не могут использоваться, ибо в фильтрах на входе знаковые числа (какого-то хрена квартус не понимает знаковые числа в шине) ... 1. Размер part-select or slice должен быть константой, но положением возможно варьировать. Например, Matrix[4:0][i+:4] (! это не точная замена Вашего MatrixIN[4:0][i+4:i]) 2. input signed logic [DATA_WIDTH-1:0] [24:0] MatrixIN и проследите, чтобы все (!) операнды также были signed при получении знакового результата Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sundownhunter 0 24 февраля, 2012 Опубликовано 24 февраля, 2012 · Жалоба 1. Размер part-select or slice должен быть константой, но положением возможно варьировать. Например, Matrix[4:0][i+:4] (! это не точная замена Вашего MatrixIN[4:0][i+4:i]) 2. input signed logic [DATA_WIDTH-1:0] [24:0] MatrixIN и проследите, чтобы все (!) операнды также были signed при получении знакового результата поставил .MatrixIN (matrix'(MatrixIN[4:0][i+:4])),, ошибка та же самая в этой же строке ... :( Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mttphreak 0 24 февраля, 2012 Опубликовано 24 февраля, 2012 · Жалоба и есть третий блок, который должен соединить 9 таких фильтров "каскадом" (т.е. с первого блока выходит матрица [12:0][4:0], и на первый фильтр должны быть поданы сигналы [4:0][4:0], на второй - [5:1][4:0] ... на последний - [12:8][4:0]): Рисуй картинку своего SOC и сюда ее :rolleyes: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mttphreak 0 25 февраля, 2012 Опубликовано 25 февраля, 2012 · Жалоба Первый и второй блок синтезируются без вопросов, все окей. в последнем блоке квартус ругается на строчку Очень прошу помочь. Итак вот что я тебе скажу... синтаксис в блоке, который не компилиться выглядит ОК. Я подозреваю, что тут проблема в System Verilog Tool Support для многомерных массивов :laughing: Ты наверное уже в курсе, что на данный момент ни одна тулза на 100% не поддерживает все фичи, которые ты можешь найти в System Verilog Language Reference Manual. :1111493779: Лично на моем любимом симуляторе не компилиться даже первый блок - компилятор ссылается на "Current limited implementation of System Verilog Features". Так что самое время упростить работу тулзам и попробовать сделать что-то менее элегантное, но рабочее... Я же лично рекомендую сделать Wrapper/Hub, куда завести весь интерфейс, а внутри все твои фильтровые герлядны инстанциировать ручками, подключая нужные провода в нужные блоки. Не элегантно да, зато будет работать наверняка... Небольшой примерчик inside :rolleyes: PS: Когда будешь его компилить, попробуй раскомментить разные строки - мой синтезатор синтезит разные вещи в зависимости от endianness и типа подключения... Тоже следи за этим в своей implementation Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Andy-P 0 27 февраля, 2012 Опубликовано 27 февраля, 2012 · Жалоба Бит-стрим не работает с такими "слайсами" ( matrix'(MatrixIN[4:0][i+4:i]) ) :laughing: The term slice refers to a selection of one or more contiguous elements of an array (IEEE 1800-2009 p.106) MatrixIN[4:0][i+4:i] – это не непрерывный фрагмент массива, т.е. не slice Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sundownhunter 0 29 февраля, 2012 Опубликовано 29 февраля, 2012 · Жалоба Всем спасибо, разобрался ) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться