Jump to content

    
Sign in to follow this  
TamRazZ

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

Recommended Posts

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

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
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
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

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this