Перейти к содержанию
    

Проблема с синтаксисов systemVerilog

Добрый день!

Я новичок в 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 (пакованный массив?) в блоках не могут использоваться, ибо в фильтрах на входе знаковые числа (какого-то хрена квартус не понимает знаковые числа в шине) ...

Изменено пользователем sundownhunter

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

в последнем блоке квартус ругается на строчку

 

.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 при получении знакового результата

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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])),, ошибка та же самая в этой же строке ... :(

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

и есть третий блок, который должен соединить 9 таких фильтров "каскадом" (т.е. с первого блока выходит матрица [12:0][4:0], и на первый фильтр должны быть поданы сигналы [4:0][4:0], на второй - [5:1][4:0] ... на последний - [12:8][4:0]):

 

Рисуй картинку своего SOC и сюда ее :rolleyes:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Первый и второй блок синтезируются без вопросов, все окей.

в последнем блоке квартус ругается на строчку

 

Очень прошу помочь.

 

Итак вот что я тебе скажу...

 

синтаксис в блоке, который не компилиться выглядит ОК. Я подозреваю, что тут проблема в 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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Бит-стрим не работает с такими "слайсами" ( 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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...