flammmable 0 15 февраля, 2019 Опубликовано 15 февраля, 2019 (изменено) · Жалоба Хотелось бы создать в модуле нечто, к чему можно было бы обратиться по имени 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-ом, которые забивают автокомплиту весь обзор. Изменено 15 февраля, 2019 пользователем flammmable Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
RobFPGA 27 15 февраля, 2019 Опубликовано 15 февраля, 2019 · Жалоба Приветствую! Не совсем понятно зачем такое нужно? Какова задача? Откуда и куда будут эти обращения? Удачи! Rob. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
lexx 0 15 февраля, 2019 Опубликовано 15 февраля, 2019 · Жалоба Формально такой код компилируется и работает без проблем, но только симуляция. Падает скорее всего из-за памяти, и это совсем не нормально, трудно сказать конкретно без деталей. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
flammmable 0 15 февраля, 2019 Опубликовано 15 февраля, 2019 · Жалоба 5 minutes ago, lexx said: Формально такой код компилируется и работает без проблем, но только симуляция. Падает скорее всего из-за памяти, и это совсем не нормально, трудно сказать конкретно без деталей. Попробую на выходных очистить код до десятка строчек и указать сопутствующие данные о ПО. Но вопрос, а как же синтез? Располагает ли SV к иерархическому упорядочиванию сущностей (например, констант)? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
lexx 0 15 февраля, 2019 Опубликовано 15 февраля, 2019 · Жалоба Нет порта - нет значений. Поправьте если а SV эта часть отличается от классики. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
RobFPGA 27 15 февраля, 2019 Опубликовано 15 февраля, 2019 · Жалоба Приветствую! 8 hours ago, flammmable said: Попробую на выходных очистить код до десятка строчек и указать сопутствующие данные о ПО. Но вопрос, а как же синтез? Располагает ли SV к иерархическому упорядочиванию сущностей (например, констант)? Так вам еще и для синтеза это нужно? Увы при синтезе доступ через иерархию модулей не поддерживается. Иерархию возможно использовать только в пределах одного модуля. Ну а для упорядочивания можно использовать структуры и package. Удачи! Rob. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
flammmable 0 19 февраля, 2019 Опубликовано 19 февраля, 2019 · Жалоба On 2/15/2019 at 4:58 PM, RobFPGA said: Приветствую! Так вам еще и для синтеза это нужно? Увы при синтезе доступ через иерархию модулей не поддерживается. Иерархию возможно использовать только в пределах одного модуля. Ну а для упорядочивания можно использовать структуры и 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 может быть не очень хорошо приспособлен для иерархического упорядочивания сущностей в принципе. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
RobFPGA 27 19 февраля, 2019 Опубликовано 19 февраля, 2019 · Жалоба Приветствую! Иерархия определяется не языком а головой (выражающейся на этом языке) И если в голове "шумит" то можно такого наворотить 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. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
flammmable 0 19 февраля, 2019 Опубликовано 19 февраля, 2019 (изменено) · Жалоба Спасибо за столь быстрый ответ. Однако, думаю, вы сами видите недостатки структур в данном контексте. 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} ; Во многих редакторах кода можно настроить "прыжок на объявление". А тут сразу два варианта: что мы хотим поменять, имя константы или значение константы? Но, как я уже сказал: лучшего варианта может вообще не быть. Изменено 19 февраля, 2019 пользователем flammmable Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
RobFPGA 27 19 февраля, 2019 Опубликовано 19 февраля, 2019 · Жалоба Приветствую! 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. Поэтому в нормальных редакторах проблем не будет куда прыгать - так как тип переменной и сама переменная это разные сущности. Опять же имея отдельно тип а отдельно котлеты переменные можно легко добавить "этажности" в иерархию 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. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
flammmable 0 20 февраля, 2019 Опубликовано 20 февраля, 2019 · Жалоба О! Большое спасибо! Я не могу поверить, что в 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; Но что поделаешь. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
RobFPGA 27 20 февраля, 2019 Опубликовано 20 февраля, 2019 · Жалоба Приветствую! 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. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
flammmable 0 20 февраля, 2019 Опубликовано 20 февраля, 2019 · Жалоба 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 поддерживает такую запись. С Квартусом - печаль. Спасибо еще раз! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться