Jump to content

    

Вопрос по инициализации 2х-мерного массива

Доюрый день!
Столкнулся с необходимостью работы с массивом констант в виде упакованно-неупакованных конструкций.
вот пример того, что мне необходимо:

localparam int N = 5;
localparam int W = 18;    
const logic [ADDR_W-1 : 0] hard_point [N] = '{16, 17, 18, 19, 20};

на такую запись Квартус вываливает предупреждения:

Warning (10030): Net "hard_point.data_a" at mem_reader.sv(61) has no driver or initial value, using a default initial value '0'
Warning (10030): Net "hard_point.waddr_a" at mem_reader.sv(61) has no driver or initial value, using a default initial value '0'
Warning (10030): Net "hard_point.we_a" at mem_reader.sv(61) has no driver or initial value, using a default initial value '0'

Код работает исправно, но эти варнинги мне непонятны и хотелось бы с ними разобраться, но не совсем понятно, что от меня требует Квартус.

Я понимаю, что необходимо указывать конкретную размерность данных, но затрудняюсь с синтаксисом. Прошу помощи.

Share this post


Link to post
Share on other sites
1 minute ago, TamRazZ said:

...Код работает исправно, но эти варнинги мне непонятны и хотелось бы с ними разобраться, но не совсем понятно, что от меня требует Квартус....

Я понимаю, что необходимо указывать конкретную размерность данных, но...

Разрядности здесь ни при чем.

Quartus развел 2мерный массив констант как модуль памяти. Соответственно, варнинги говорят о том, что некоторые порты железного блока памяти (data_a - данные на запись, waddr_a - адрес на запись, we_a - разрешение на запись) никуда не подключены.

Если нет тяги к прекасному - можно смело забить на них)

Share this post


Link to post
Share on other sites

а меня больше удивило что квартус квалификатор const прожевал))) локал парам вроде всегда он требовал

Share this post


Link to post
Share on other sites
23 minutes ago, TamRazZ said:

Доюрый день!
Код работает исправно, но эти варнинги мне непонятны и хотелось бы с ними разобраться, но не совсем понятно, что от меня требует Квартус.

Видимо, Quartus требует значения параметра ADDR_W.

Попробуйте так:

localparam int N = 5;
localparam int W = 18;    
const logic [W-1 : 0] hard_point [N] = '{16, 17, 18, 19, 20};

 

Share this post


Link to post
Share on other sites
1 hour ago, des00 said:

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

Действительно так не ругается... не помню, почему через конст писал %

 

Можно тогда еще вопрос не по теме... Как вы избавляетесь от варнингов такого рода:

Warning (10230): Verilog HDL assignment warning at mem_reader.sv(215): truncated value with size 32 to match size of target (12)

в коде типа:

cnt <= (cnt == size-1) ? 0 : cnt + 1;

Настраиваете компилятор или указываете размеры всех слагаемых?

Share this post


Link to post
Share on other sites
1 hour ago, TamRazZ said:

Можно тогда еще вопрос не по теме... Как вы избавляетесь от варнингов такого рода:


Warning (10230): Verilog HDL assignment warning at mem_reader.sv(215): truncated value with size 32 to match size of target (12)

в коде типа:


cnt <= (cnt == size-1) ? 0 : cnt + 1;

Настраиваете компилятор или указываете размеры всех слагаемых?

0 по умолчанию 32-разрядный. поэтому можно '0 либо {WIDTH_CNT{1'b0}} либо 'd0

Edited by Darky777

Share this post


Link to post
Share on other sites

Да не только ноль, но и единица. Счётчик надо писать

cnt <= cnt + 1'b1;

И не только из-за этой лишней писанины я не люблю Верилог.

Share this post


Link to post
Share on other sites
16 hours ago, TamRazZ said:

Действительно так не ругается... не помню, почему через конст писал %

Буду знать)

Quote

Можно тогда еще вопрос не по теме... Как вы избавляетесь от варнингов такого рода:


Warning (10230): Verilog HDL assignment warning at mem_reader.sv(215): truncated value with size 32 to match size of target (12)

в коде типа:


cnt <= (cnt == size-1) ? 0 : cnt + 1;

Настраиваете компилятор или указываете размеры всех слагаемых?

размеры, в арифметике, не пишу уже лет 15, после того как разобрался с приведением разрядностей операндов(всего пару страниц стандарта). А счетчики писать как

struct packed {
  logic           done;
  logic [W-1 : 0] val; 
} cnt;

cnt.val  <= cnt.done ? '0 : (cnt.val + 1'b1);
cnt.done <= (cnt.val == size-2);

уже вошло в привычку, можно даже шаблон редактора сделать)

Share this post


Link to post
Share on other sites
10 часов назад, andrew_b сказал:

И не только из-за этой лишней писанины я не люблю Верилог.

Это конкретно фича квартуса. Придирчивый синплифай (когда я с ним ещё работал) не вопил на a <= a + 1, да и нынешняя вивада тоже, они молча приводят размеры к типам, как и положено по стандарту. 

 

В квартусе я просто этот тип предупреждений отправлял молча в игнор (через механизм suppress, он неплохо в ква сделан, в отличие от вивады, где его можно сказать нет), т.к. вопли не по делу.

Share this post


Link to post
Share on other sites

Есть ли рациональное зерно в приведении типов после арифметических операций?

logic [W-1:0] a, b;
b <= (a + 10)[W-1:0]; 

Только я не знаю как это в синтаксисе SV описать, подскажите, пожалуйста..

Share this post


Link to post
Share on other sites
9 minutes ago, TamRazZ said:

Есть ли рациональное зерно в приведении типов после арифметических операций?


logic [W-1:0] a, b;
b <= (a + 10)[W-1:0]; 

Только я не знаю как это в синтаксисе SV описать, подскажите, пожалуйста..

1. рационального зерна нет

2. только через дополнительную переменную. В новых ревизиях стандарта хотели ввести нечто похожее, но чем дело кончилось не знаю. в редакции 2012 года, ЕМНИП этого нет.

3. Изучите все же главу о привидении типов в верилоге, всего несколько страниц и вопросы все снимет.

Share this post


Link to post
Share on other sites

Приветствую!

53 minutes ago, des00 said:

Только я не знаю как это в синтаксисе SV описать, подскажите, пожалуйста..

logic [A_WH-1  :0] var_a;
logic [B_WH-1  :0] var_b;
logic [A_WH+2-1:0] var_c;
...
  
var_b <= (B_WH)'(var_a + 1);
var_c <= (A_WH+2)'(var_a + 3);

Удачи! Rob.

Share this post


Link to post
Share on other sites
40 минут назад, RobFPGA сказал:

Приветствую!


logic [A_WH-1  :0] var_a;
logic [B_WH-1  :0] var_b;
logic [A_WH+2-1:0] var_c;
...
  
var_b <= (B_WH)'(var_a + 1);
var_c <= (A_WH+2)'(var_a + 3);

Удачи! Rob.

Или так. :smile:

 

typedef logic [A_WH-1  :0] var_a_t;
typedef logic [B_WH-1  :0] var_b_t;
typedef logic [A_WH+2-1:0] var_c_t;

var_a_t var_a;
var_b_t var_b;
var_c_t var_c;
...

var_b <= var_b_t'(var_a + 1);
var_c <= var_c_t'(var_a + 3);

 

Share this post


Link to post
Share on other sites
1 hour ago, RobFPGA said:

Приветствую!


logic [A_WH-1  :0] var_a;
logic [B_WH-1  :0] var_b;
logic [A_WH+2-1:0] var_c;
...
  
var_b <= (B_WH)'(var_a + 1);
var_c <= (A_WH+2)'(var_a + 3);

Удачи! Rob.

это не совсем то))) я про slice selection результата операции/вызова функции, без введения промежуточной переменной, ведь именно про это был вопрос, а не про приведение разрядности всего результата)

А так, рационального зерна что в вашем варианте что в @dxp все же нет.

Share this post


Link to post
Share on other sites

Приветствую!

17 minutes ago, des00 said:

А так, рационального зерна что в вашем варианте что в @dxp все же нет.

У каждого своя рациональность - кому-то может поможет показать как он убрал миллион варнингов в Qu :biggrin:;

19 minutes ago, des00 said:

это не совсем то))) я про slice selection результата

Ну а для slice можно еще добавить сдвиг :unknw: 

`define SLICE_MSB_LSB(exp, msb, lsb) (1+MSB-LSB)'((exp)>>LSB)

b <= `SLICE_MSB_LSB((a+10), WH-1, 0);

Удачи! Rob.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this