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

Иерархия областей видимости в SV

Хотелось бы создать в модуле нечто, к чему можно было бы обратиться по имени top.middle.bottom?
Причем чтобы в модуле было возможно так же использовать другое нечто middle.enother_something, не имеющее никакого отношения к top.middle....
Типа того:

assign out_1 = top.middle.bottom;
assign out_2 = middle.enother_something;

Возможно ли такое? Если да, то при помощи каких механизмов?

Я попробовал создать классы внутри класса. И для каждого внутреннего класса - объявление плюс экземпляр. Моделсим синтаксически проглотил данную конструкцию ("vlog -sv -work" сообщил, что Errors: 0). Но потом vsim.exe нагенерил только половину out.vcd. Ровно до момента использования assign out_1 = top.middle.bottom. Падая vsim.exe отписался FATAL: (SIGSEGV) Bad handle or reference.

Я хотел бы упаковывать константы в иерархию. Что бы с одной стороны всякие IDLE-ы, READ-ы и WRITE-ы не конфликтовали друг с другом, но с другой - без километровых префиксов с underscore-ом, которые забивают автокомплиту весь обзор.

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

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


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

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

Не совсем понятно зачем такое нужно? Какова задача? Откуда и куда будут эти обращения?

Удачи! Rob. 

 

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


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

Формально такой код компилируется и работает без проблем, но только симуляция.

Падает скорее всего из-за памяти, и это совсем не нормально, трудно сказать конкретно без деталей.

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


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

5 minutes ago, lexx said:

Формально такой код компилируется и работает без проблем, но только симуляция.

Падает скорее всего из-за памяти, и это совсем не нормально, трудно сказать конкретно без деталей.

Попробую на выходных очистить код до десятка строчек и указать сопутствующие данные о ПО.
Но вопрос, а как же синтез? Располагает ли SV к иерархическому упорядочиванию сущностей (например, констант)?

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


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

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

8 hours ago, flammmable said:

Попробую на выходных очистить код до десятка строчек и указать сопутствующие данные о ПО.
Но вопрос, а как же синтез? Располагает ли SV к иерархическому упорядочиванию сущностей (например, констант)?

Так вам еще и для синтеза это нужно? :scratch_one-s_head: Увы при синтезе доступ через иерархию модулей не поддерживается.  Иерархию возможно использовать только в пределах одного модуля.

Ну а для упорядочивания можно использовать структуры и package.

Удачи! Rob.

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


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

On 2/15/2019 at 4:58 PM, RobFPGA said:

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

Так вам еще и для синтеза это нужно? :scratch_one-s_head: Увы при синтезе доступ через иерархию модулей не поддерживается.  Иерархию возможно использовать только в пределах одного модуля.

Ну а для упорядочивания можно использовать структуры и package.

Удачи! Rob.

Хотелось бы чего-то наподобие папок в файловой системе. Но только для констант. Структуры - такой себе инструмент. Не исключено, правда, что других инструментов попросту нет )

Грубо говоря, предположим, есть плата с ПЛИСом
1. На плате также могут быть периферийные микросхемы.
2. У каждой микросхемы могут быть настроечные регистры.
3. У каждого регистра может быть несколько отдельных частей.
4. И каждая часть может принимать определенные значения.

Причем (условно) на плате может быть какая-нибудь микросхема USB и какая-нибудь микросхема шагового двигателя. И у обоих будет регистр SPEED.
Только у МС USB там могут быть значения LOW HIGH и FULL.
А у МС шагового двигателя эти значения будут, к примеру, 1RPM, 10RPM, 100RPM.

Есть ли возможность получать значения этих констант как-нибудь так:
DEV.REG.PART.VAL (IC_USB.SPEED.FULL и IC_STEP.SPEED.10RPM), а не DEV_REG_PART_VAL?
Я сейчас стараюсь настроить подсветку и автодополнение кода наиболее оптимальным образом, но есть ощущение, что SV может быть не очень хорошо приспособлен для иерархического упорядочивания сущностей в принципе.

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


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

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

Иерархия определяется не языком а головой (выражающейся на этом языке) :wink2:

И если в голове "шумит" то можно такого наворотить  :wacko2:

Spoiler

package types_pq;

typedef bit [ 7:0]  u8_t;
typedef bit [15:0] u16_t;
typedef bit [31:0] u32_t;

typedef u8_t   usb_speed_t;
typedef u16_t step_speed_t;

typedef struct packed {
  usb_speed_t high;
  usb_speed_t full;
  usb_speed_t low ;
} st_USB_SPEED_t;

typedef struct packed {
  step_speed_t rpm_1  ;
  step_speed_t rpm_10 ;
  step_speed_t rpm_100;
} st_STEP_SPEED_t;

typedef struct  {
  st_USB_SPEED_t speed;
  u32_t          bbb  ;
} st_IC_USB_t;

typedef struct  {
  st_STEP_SPEED_t speed;
  u32_t           ccc  ;
} st_IC_STEP_t;


const st_IC_USB_t  ic_usb  = '{speed:'{high:1, full:2, low:3}, bbb:4}       ;
const st_IC_STEP_t ic_step = '{speed:'{rpm_1:5, rpm_10:6, rpm_100:7}, ccc:8};

endpackage


module test (
  input  wire                   clk , // Clock
  output types_pq::usb_speed_t  usb ,
  output types_pq::step_speed_t step
);

import types_pq::ic_usb;

assign usb  =            ic_usb.speed.high;
assign step = types_pq::ic_step.speed.rpm_10;

endmodule

 

Успехов! Rob.

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


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

Спасибо за столь быстрый ответ.

Однако, думаю, вы сами видите недостатки структур в данном контексте.

1. В названии структур для регистров всё равно присутствуют названия самих микросхем:
st_USB_SPEED_t и st_STEP_SPEED_t.
Это как если бы вы не могли хранить на одном диске в разных каталогах две папки с именами "Новая папка". Только уникальный имена, только хардкор.

2. Объявление (условно) констант делается в одном месте

typedef struct packed {
  usb_speed_t high;
  usb_speed_t full;
  usb_speed_t low ;
} st_USB_SPEED_t;

А присвоение значений - в другом.

const st_IC_USB_t  ic_usb  = '{speed:'{high:1, full:2, low:3}, bbb:4}       ;

Во многих редакторах кода можно настроить "прыжок на объявление". А тут сразу два варианта: что мы хотим поменять, имя константы или значение константы?

Но, как я уже сказал: лучшего варианта может вообще не быть.





 

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

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


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

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

1 hour ago, flammmable said:

Однако, думаю, вы сами видите недостатки структур в данном контексте.

1. В названии структур для регистров всё равно присутствуют названия самих микросхем:
st_USB_SPEED_t и st_STEP_SPEED_t.

Странно - мне наоборот это кажется  достоинством - сразу видно к чему структура относится.  Думаете так будет понятнее?

const struct  {
  struct {
    step_speed_t rpm_1  ;
    step_speed_t rpm_10 ;
    step_speed_t rpm_100;
  } speed;
  u32_t          ddd;
} ic_step = '{speed:'{rpm_1:5, rpm_10:6, rpm_100:7}, ddd:8};

 

1 hour ago, flammmable said:

2. Объявление (условно) констант делается в одном месте ... typedef struct  {

Это объявление не константы а типа структуры коей будет соответствовать константа (или еще что). 

1 hour ago, flammmable said:

А присвоение значений - в другом. ...  const st_IC_USB_t  ic_usb  = '{speed:'{ ...

А тут как раз объявляется и заодно инитится константа ic_usb. Поэтому в нормальных редакторах проблем не будет куда прыгать - так как тип переменной и сама переменная это разные сущности.

Опять же имея отдельно тип а отдельно котлеты переменные можно легко добавить "этажности" в иерархию :dance4:

const st_STEP_SPEED_t c_spped_a  =  '{rpm_1:5, rpm_10:6, rpm_100:7};
const st_STEP_SPEED_t c_spped_b  =  '{rpm_1:8, rpm_10:9, rpm_100:10};

const st_IC_STEP_t ic_step_a = '{speed:c_spped_a, ccc:8};
const st_IC_STEP_t ic_step_b = '{speed:c_spped_b, ccc:12};

Да и как без типа например передать такую структуру в функцию? А если тип задан то проблем нет.

    

Удачи! Rob.

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


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

О! Большое спасибо! Я не могу поверить, что в SV можно создавать структуру внутри структуры. Это - то, что нужно!
Единственное, что кажется странным и неудобным, что присвоение нельзя делать внутри структуры

struct {
    struct {
        struct {
            logic VAL1;
            logic VAL2;
            logic VAL3;
        } PART;
    } REG;
} DEV;
assign DEV.REG.PART.VAL1 = 1'b1;
assign DEV.REG.PART.VAL2 = 1'b1;
assign DEV.REG.PART.VAL3 = 1'b1;

Но что поделаешь.
 

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


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

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

1 hour ago, flammmable said:

О! Большое спасибо! Я не могу поверить, что в SV можно создавать структуру внутри структуры. Это - то, что нужно!
Единственное, что кажется странным и неудобным, что присвоение нельзя делать внутри структуры


...

Почему это нельзя - все можно (почти)! Но осторожно - так как часто результат зависит от того как поддерживается этот функционал в конкретном симуляторе/синтезаторе 

const struct {
  struct {
    struct {
      u8_t VAL1 = 1;
      u8_t VAL2 = 2;
      u8_t VAL3 = 3;
    } PART;
    u8_t VAL4 = 4;
  } REG;
} DEV;

Удачи! Rob.

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


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

41 minutes ago, RobFPGA said:

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

Почему это нельзя - все можно (почти)! Но осторожно - так как часто результат зависит от того как поддерживается этот функционал в конкретном симуляторе/синтезаторе 


const struct {
  struct {
    struct {
      u8_t VAL1 = 1;
      u8_t VAL2 = 2;
      u8_t VAL3 = 3;
    } PART;
    u8_t VAL4 = 4;
  } REG;
} DEV;

Удачи! Rob.

Попробовал в Quartus Lite 17.1 - НЕ работает.
Попробовал в ModelSim 18.1 - работает.
Попробовал в Lattice Diamond 3.10 (Synplify 2017.03) - работает.
Ну. Хорошо, что стандарт SV поддерживает такую запись. С Квартусом - печаль.
Спасибо еще раз!
 

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


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

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

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

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

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

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

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

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

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

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