des00 25 22 апреля, 2014 Опубликовано 22 апреля, 2014 · Жалоба Вот у меня какой вопрос: я делаю синтезируемые блоки шинных мультиплексоров для разных типов шин. Например, на входе 10 шин одного типа, на выходе 1 шина того же типа. Поможет SV? вам помогут интерфейсы + модпорты + функции в интерфейсах и их использование в модпортах. ЕМНИП на форуме есть великолепный пример от dxp как красиво решить проблему создания интерконнекта в shared bus архитектуре И кстаи, в этой теме вы были http://electronix.ru/forum/index.php?showtopic=112393 все ходы записаны ;) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
FatRobot 0 22 апреля, 2014 Опубликовано 22 апреля, 2014 · Жалоба Спасибо. Это не подходит конечно же. Такого добра я сам богато умею. Такой вариант Вам подходит? Да, был. и мед-пиво пил. Но как передать шину наперед неизвестного типа в модуль (без расплющивания в гомогенную шину), я все равно не понял. вам помогут интерфейсы + модпорты + функции в интерфейсах и их использование в модпортах. ЕМНИП на форуме есть великолепный пример от dxp И кстаи, в этой теме вы были все ходы записаны ;) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 22 апреля, 2014 Опубликовано 22 апреля, 2014 · Жалоба Да, был. и мед-пиво пил. Но как передать шину наперед неизвестного типа в модуль (без расплющивания в гомогенную шину), я все равно не понял. Хмм, может быть я не так понял задачу. Вы писали "Например, на входе 10 шин одного типа, на выходе 1 шина того же типа." Т.е. тип известен. Тип == интерфейс, а логика мультиплексирования уже в интерфейсе. Т.е. задача разработки "синтезируемых блоков шинных мультиплексоров" сводиться к разработке "синтезируемой библиотеки разных типов шин". Мне видиться такое решение. Тип шины все равно требует декларации и описания. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
FatRobot 0 22 апреля, 2014 Опубликовано 22 апреля, 2014 · Жалоба Задача: сделать шинный мультиплексор для шины, тип которой наперед неизвестен. Он и не нужен для этой задачи. Насчет интрефейса все тоже хорошо, конечно. Как изолировать мультиплексор в интерфейсе при синтезе? Вопросы пока. Хмм, может быть я не так понял задачу. а логика мультиплексирования уже в интерфейсе. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 22 апреля, 2014 Опубликовано 22 апреля, 2014 · Жалоба Задача: сделать шинный мультиплексор для шины, тип которой наперед неизвестен. Он и не нужен для этой задачи. вы взрываете мне мозг. если мультиплексор синтезируемый, то тип не может быть неизвестен. если для моделирования то через иерархию классов. либо это вопрос из раздела шашечки или ехать. Насчет интрефейса все тоже хорошо, конечно. Как изолировать мультиплексор в интерфейсе при синтезе? он там будет в виде функции, если ссылаться на код dxp function automatic data_t qmux(q_bundle_t x, int n); return x[n]; endfunction раскройте слово изолировать и самое главное цель изоляции? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
FatRobot 0 22 апреля, 2014 Опубликовано 22 апреля, 2014 · Жалоба Мозг у вас довольно взрывоопасный, ага. Отвечаю на ваши вопросы: Тип должен быть известен на этапе синтеза. На этапе разработки я могу его не знать. В ооп есть такая штука, как виртуальные члены классов. Здесь та же аналогия. Мне конечно и обязательно шашечки. Доехать я запросто могу и на обычном исконно-пасконном Verilog'e. С другой стороны сейчас стало жутко модно в резюме писать "Skills: System Verilog", вот я и пытаюсь понять, что стоит за этими надписями. Ну и, возможно, проследовать за модой. "Изолировать" это значит выделить все ячейки, относящиеся к функционалу "мультиплексор". Например для задания ограничений или для оценки площади, или для размещения. В Verilog я создаю модуль, который занимается мультиплексированием, не разрешаю его разгруппировывать, а потом с этим модулем что-то делаю в скриптах синтеза. вы взрываете мне мозг. если мультиплексор синтезируемый, то тип не может быть неизвестен. либо это вопрос из раздела шашечки или ехать. раскройте слово изолировать и самое главное цель изоляции? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 22 апреля, 2014 Опубликовано 22 апреля, 2014 · Жалоба "Изолировать" это значит выделить все ячейки, относящиеся к функционалу "мультиплексор". Например для задания ограничений или для оценки площади, или для размещения. В Verilog я создаю модуль, который занимается мультиплексированием, не разрешаю его разгруппировывать, а потом с этим модулем что-то делаю в скриптах синтеза. Когда писал пост, на который вы дали такой ответ, как раз думал об этом. Мне сегодня везет. В случае с интерфейсом такая штука не пройдет, т.к. он не является модулем и скорее всего не будет парситься в нетлисте корректно, но его можно положить во враппер. Вы одновременно хотите ништяков высокоуровневого описания, которое скрывает всю кухню и контроля до люта руками. Такое бывает но дюже редко. Тип должен быть известен на этапе синтеза. На этапе разработки я могу его не знать. В ооп есть такая штука, как виртуальные члены классов. Здесь та же аналогия. Вам все равно спускаться до известных типов. Предлагаемое мной решение, позволит вам вообще убрать этап разработки мультиплексора. Точнее он будет, но на этапе разработки самого интерфейса. Если ваша цель, борьба с безработицей, то решение с вашими требованиями для SV будет такое же как для V. С другой стороны сейчас стало жутко модно в резюме писать "Skills: System Verilog", вот я и пытаюсь понять, что стоит за этими надписями. Ну и, возможно, проследовать за модой. За этими надписями стоит владение SV ООП для моделирования + Constraint based random verification c AVM/OVM/UVM технологиями + SVA. RTLные ништяки SV это так, паравозиком идут. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
FatRobot 0 22 апреля, 2014 Опубликовано 22 апреля, 2014 · Жалоба Я прежде всего хочу понять (читая литературу и задавая дурацкие вопросы), насколько SV, как инструмент, применим для моих задач. Какой выигрыш он даст при использовании. Пока я вижу, что для меня пользы не слишком много: Моделирование на SV для ЦОС - это юмор особого рода, конечно. А "RTL-ништяки", если уж переходить в плоскость молодежного жаргона, они стрёмные какие-то на первый взгляд. Возможно, что есть внятное руководство от производителей синтезаторов по тому, во что преобразуются те или иные веселые конструкции SV. В общем, пока мотивы использовать мне до конца не ясны. Спасибо за ответы. Вы одновременно хотите ништяков ... и контроля .... За этими надписями стоит владение SV ООП для моделирования + Constraint based random verification c AVM/OVM/UVM технологиями + SVA. RTLные ништяки SV это так, паравозиком идут. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 22 апреля, 2014 Опубликовано 22 апреля, 2014 · Жалоба Моделирование на SV для ЦОС - это юмор особого рода, конечно. Именно моделировать тут SciLab,Matlab и прочие вне конкуренции, но для отладки ДСП модулей по эталонной модели, если не использовать мосты из средств к симуляторам, Direct-C интерфейс вполне подойдет. Мне проще поднять мосты, но тут уж кому как. А "RTL-ништяки", если уж переходить в плоскость молодежного жаргона, они стрёмные какие-то на первый взгляд. Возможно, что есть внятное руководство от производителей синтезаторов по тому, во что преобразуются те или иные веселые конструкции SV. Именно таких руководств нет, по той причине что SV в области разработки RTL это работа над ошибками V, устранняя то что пользователям не нравилось. На вскидку : введение типа logic/bit, функции индексации массивов и векторов, передача массивов через порты, enum, структуры, упакованные и не упакованные массивы, неявные присвоения при инстансе модулей, интерфейсы и т.д. по мелочи. Ничего кардинального в RTL части измененно не было. В общем, пока мотивы использовать мне до конца не ясны. Да ИМХО достаточно описать ну положим адаптивный FSE эквалайзер на 32 коэффициента, отдельно FIR, отдельно модуль адаптации коэффициентов и соединить их веревками :) Не сочтите за рекламу, если интересно можете посмотерть файлы модулей отсюда http://electronix.ru/forum/index.php?showt...5%F0+%E1%F7%F5* там декодер БЧХ и РС. нужно таскать массивы данных между модулями, на SV красиво, элегантно и без всяких лишних сущностей. На V можно сделать тоже самое, но количество гемороя будет несколько больше. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
FatRobot 0 22 апреля, 2014 Опубликовано 22 апреля, 2014 · Жалоба Обязательно попробую. Вот как только доделаю блок управления елочной гирляндой, так сразу приступлю к эквалайзеру. Да ИМХО достаточно описать ну положим адаптивный FSE эквалайзер на 32 коэффициента, отдельно FIR, отдельно модуль адаптации коэффициентов и соединить их веревками Я бы в функциях умножения в GF попробовал в явном виде обрабатывть более 1 бита в одном слое комбинаторной логики. На первый взгляд LUT4 может обработать 2 бита, а LUT6 - 4 бита. Все остальное хорошо, да. А местами даже прекрасно. Не сочтите за рекламу, если интересно можете посмотерть файлы модулей отсюда http://electronix.ru/forum/index.php?showt...5%F0+%E1%F7%F5* там декодер БЧХ и РС. нужно таскать массивы данных между модулями, на SV красиво, элегантно и без всяких лишних сущностей. На V можно сделать тоже самое, но количество гемороя будет несколько больше. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 23 апреля, 2014 Опубликовано 23 апреля, 2014 · Жалоба Обязательно попробую. Вот как только доделаю блок управления елочной гирляндой, так сразу приступлю к эквалайзеру. Гирлянда это вещь, никогда не делал. Надо реализовать и с помощью UVM верифицировать. Я бы в функциях умножения в GF попробовал в явном виде обрабатывть более 1 бита в одном слое комбинаторной логики. На первый взгляд LUT4 может обработать 2 бита, а LUT6 - 4 бита. Делать руками не имеет практического смысла. Современные синтезаторы сами укладыют оптимально, изучал этот вопрос в technology mapper Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
torik 0 23 апреля, 2014 Опубликовано 23 апреля, 2014 · Жалоба Еще вопрос по task. пишем typedef struct { reg [10:0] addr; reg [10:0] saddr; } obj; task t1 ( ref obj object1; input wr; ; if (wr) addr <= saddr; endtask module g1 ( input clk, input wr, input addr ); obj object1; always @(posedge clk) object1.saddr <= addr; always @(posedge clk) t1 (object1, wr); endmodule Где здесь ошибка? В результате object1.addr не меняется. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 23 апреля, 2014 Опубликовано 23 апреля, 2014 · Жалоба Еще вопрос по task. Где здесь ошибка? В результате object1.addr не меняется. ну как бы весь приведенный код ошибка должно быть что-то вроде module g1 ( input clk, input wr, input [10:0] addr ); typedef struct { reg [10:0] addr; reg [10:0] saddr; } obj; obj object1; always @(posedge clk) object1.saddr <= addr; always @(posedge clk) t1 (object1, wr); task automatic t1 ( ref obj object1, input wr ); if (wr) object1.addr = object1.saddr; endtask endmodule module tb; bit clk, wr; bit [10:0] addr; g1 g1( .*); initial begin clk <= 1'b0; #5ns forever #5ns clk = ~clk; end initial begin wr = 0; addr = 0; @(posedge clk); forever begin wr <= 1; addr <= addr + 1; @(posedge clk); wr <= 0; repeat (5) @(posedge clk); end end endmodule и все меняется Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
torik 0 23 апреля, 2014 Опубликовано 23 апреля, 2014 · Жалоба Не понял в чем разница? В том что объявили структуру и функцию внутри модуля? Согласен, код я написал неправильно, на самом деле, вне модуля объеялен пакет, в нем структура и задача, которые импортируются в модуле. А что дает слово automatic что-то мне не очень понятно? И зачем блокирующее присваивание? Проверил, все работает. Идем дальше, меняем задачу: task automatic t1 ( ref obj object1, input wr ); if (wr) object1.addr = object1.saddr; if (!wr) object.sss = aaa; endtask Ну само собой допиливаем остальной код, чтобы были sss, aaa. Так вот я заметил, что выполняется только первый if, второй не выполняется. Это че так? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 23 апреля, 2014 Опубликовано 23 апреля, 2014 · Жалоба Не понял в чем разница? В том что объявили структуру и функцию внутри модуля? Согласен, код я написал неправильно, на самом деле, вне модуля объеялен пакет, в нем структура и задача, которые импортируются в модуле. 1. ** Error:The task or function 't1' with ref arguments must be automatic. IEEE Standard for SystemVerilog 1800 - 2012 13.5.2 Pass by reference Arguments passed by reference are not copied into the subroutine area, rather, a reference to the original argument is passed to the subroutine. The subroutine can then access the argument data via the reference. Arguments passed by reference shall be matched with equivalent data types (see 6.22.2 ). No casting shall be permitted. To indicate argument passing by reference, the argument declaration is preceded by the ref keyword. It shall be illegal to use argument passing by reference for subroutines with a lifetime of static . А что дает слово automatic что-то мне не очень понятно? И зачем блокирующее присваивание?2. ** Error: An automatic var. or elem. of a dynamic var. (object1) may not be the LHS of a non-blocking assignment. IEEE Standard for SystemVerilog 1800 - 2012 6.21 Scope and lifetime Tasks and functions may be declared as automatic. Variables declared in an automatic task, function, or block are local in scope, default to the lifetime of the call or block, and are initialized on each entry to the call or block (also see 6.8 on variable initialization). An automatic block is one in which declarations are automatic by default. ..... Automatic variables and elements of dynamically sized array variables shall not be written with nonblocking, continuous, or procedural continuous assi gnments. Non-static class properties shall not be written with continuous or procedural continuous a ssignments. References to automatic variables and elements or members of dynamic variables shall be limited to procedural blocks. не знаю в чем вы собираете свой пример, но он явно забивает на требования стандарта Так вот я заметил, что выполняется только первый if, второй не выполняется. Это че так? не знаю как у вас, но module g1 ( input clk, input wr, input [10:0] addr, input [10:0] aaa ); typedef struct { reg [10:0] addr; reg [10:0] saddr; reg [10:0] sss; reg [10:0] aaa; } obj; obj object1; always @(posedge clk) begin object1.saddr <= addr; object1.aaa <= aaa; end always @(posedge clk) t1 (object1, wr); task automatic t1 ( ref obj object1, input wr ); if (wr) object1.addr = object1.saddr; if (!wr) object1.sss = aaa; endtask endmodule module tb; bit clk, wr; bit [10:0] addr; bit [10:0] aaa; g1 g1( .*); initial begin clk <= 1'b0; #5ns forever #5ns clk = ~clk; end initial begin wr = 0; addr = 0; aaa = 100; @(posedge clk); fork forever begin wr <= 1; addr <= addr + 1; @(posedge clk); wr <= 0; repeat (5) @(posedge clk); end forever begin aaa <= aaa + 1; @(posedge clk); end join end endmodule все прекрасно работает Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться