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

Вопрос по обращению к массивам в Verilog.

Собственно ворос, как обратиться к i-тому бита j-того вектора массива.

 

Такой вариант работает, но выглядит странновато:

reg [n:0] x[m:0];

wire y;

wire [n:0] tmp;

assign tmp = x[j];

assign y = tmp;

 

А такой не работает, естественно:

reg [n:0] x[m:0];

wire y;

assign y = x[j];

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


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

А такой не работает, естественно:

reg [n:0] x[m:0];

wire y;

assign y = x[j];

 

У меня в ModelSim прокатывает такой вариант, надо было в цикле побайтно читать из массива:

 

reg  [63:0] prog_line [0:99];
<...>
A = prog_line [i] [63:56];

 

А вот NCSim под Линуксом такое уже не переварил, пришлось написать так:

 

reg  [63:0] prog_line [0:99];
reg  [63:0] prog_line_0;
<...>
prog_line_0 = prog_line [i];
A = prog_line_0 [63:56];

 

По крайней мере хоть это и странно выглядит, но такой вариант имеет больше шансов работать на понимающих верилог компиляторах. Только у меня без assign, это reg, а не wire.

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


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

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

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


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

assign y = x[j];

 

а разве верилог позволяет указывать переменные границы массива в правой части оператора присваивания?..

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


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

а разве верилог позволяет указывать переменные границы массива в правой части оператора присваивания?..

 

могу сказать про верилоги "до 2000" -

там с массивом нужно либо через

assign

либо в цикле присваивать регистру "строку" из массива и работать с ней

 

в обоих случаях никакой дополнительной логики не синтезируется.

 

а в верилогах 2000-2003 вроде есть какие-то манипуляции с массивами

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


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

А такой вариант не пробовали?

 

reg [n:0] x[m:0];

wire y;

 

assign y = x[j*(m+1)+i];

 

при желании [j*(m+1)+i] можно в функцию вынести

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


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

Это не то - x[] в данном случае будет иметь тип вектора размероности n:0, т.е. присвоение будет брать только младший бит каждого вектора массива.

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


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

Пардон! Поспешил! Тогда с использованием сдвига:

 

reg [n:0] x[m:0];

wire y;

 

assign y = (x[j*(m+1)])>> i;

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


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

Это и имелось в виду :) :) :) , а что за варнинги и кто их выдает (программа?)

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


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

Такой вариант работает, но выглядит странновато:

reg [n:0] x[m:0];

wire y;

wire [n:0] tmp;

assign tmp = x[j];

assign y = tmp;

 

И ничего странного в этом нет. Это единственный на данный момент вариант, который будет работать везде. Объяснение этому - стандарт Verilog. Нельзя присвоить часть бит одного элемента массива. Только элемент в целом. Это касается и регистров и шин.

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


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

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

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

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

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

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

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

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

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

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