|
|
  |
Документация на System Verilog, Сбор документации на SVerilog. И обсуждение тонких моментов синтаксиса |
|
|
|
Jun 4 2009, 16:06
|
Профессионал
    
Группа: Свой
Сообщений: 1 129
Регистрация: 19-07-08
Из: Санкт-Петербург
Пользователь №: 39 079

|
Цитата(CaPpuCcino @ Apr 30 2009, 21:16)  ... вариант с прекомпилятором использовать не хочется, хотчется языковыми средствами. спб Встала аналогичная задача, только коммутировать интерфейсы необходимо динамически во время работы(в железе). То есть вариант с прекомпилятором отпадает в принципе. Не могли бы Вы поделиться своими соображениями на данную тему: нашли ли вы какое-либо изящное решение или поняли, что его не существует? Заранее спасибо!
--------------------
|
|
|
|
|
Jul 15 2009, 06:32
|
Группа: Новичок
Сообщений: 3
Регистрация: 16-06-06
Пользователь №: 18 114

|
|
|
|
|
|
Oct 7 2009, 06:57
|
Вечный ламер
     
Группа: Модераторы
Сообщений: 7 248
Регистрация: 18-03-05
Из: Томск
Пользователь №: 3 453

|
господа проясните следующий момент, какой по вашему мнению должен быть результат в outb/outg CODE module test_bad (input logic zero, sign, input logic signed [15 : 0] idat, output logic signed [23 : 0] odat);
assign odat = zero ? '0 : (sign ? -idat : idat);
endmodule
module test_good (input logic zero, sign, input logic signed [15 : 0] idat, output logic signed [23 : 0] odat);
always_comb begin if (zero) odat = '0; else odat = (sign ? -idat : idat); end
endmodule
module tb ;
logic zero, sign; logic signed [15 : 0] idat; logic signed [23 : 0] odatb; logic signed [23 : 0] odatg;
test_bad uutb (.odat(odatb), .*); test_good uutg (.odat(odatg), .*);
initial begin : main #10ns; zero = 1'b0; sign = 1'b1; idat = 1; #10ns; zero = 1'b0; sign = 1'b1; idat = -1; #10ns; zero = 1'b0; sign = 1'b0; idat = 1; #10ns; zero = 1'b0; sign = 1'b0; idat = -1; #10ns; $stop; end endmodule
квеста 6.4с считает вот так (см аттач). Исходя из битов odatb вообще не понятно как она думает. А квартус считает что в test_bad при инверсии надо делать беззнаковое расширение, не смотря на то, что результат операции знаковый. Посмотрел стандарт вроде все должно быть наоборот. Т.е. по правилам приведения операндов в test_bad должно быть знаковое расширение. Или я ошибаюсь? PS. вопрос снимается, все по стандарту. сам дурак. Цитата SystemVerilog adds the ability to specify unsized literal single-bit values with a preceding apostrophe ( ’ ), but without the base specifier. All bits of the unsized value are set to the value of the specified bit. In a self-determined context, these literals have a width of 1 bit, and the value is treated as unsigned будте внимательны
Эскизы прикрепленных изображений
--------------------
|
|
|
|
|
Nov 16 2009, 06:07
|
Вечный ламер
     
Группа: Модераторы
Сообщений: 7 248
Регистрация: 18-03-05
Из: Томск
Пользователь №: 3 453

|
Цитата(Builder @ Nov 12 2009, 06:19)  Вот, наткнулся на упоминание SystemVerilog 2009, по ссылкам кратко некоторые нововведения: http://www.sunburst-design.com/papers/DAC2...burstDesign.pdfhttp://www.sunburst-design.com/papers/DAC2...therlandHDL.pdfДумаю будт интересно, кто на SV пишет. работа над ошибками ассертов понравилась, про перегрузку функций так и не заикаются %( Занятно у альдека использование $info/$warning/$error/$fatal было не привязано к ассертам (в отличии от ментора) как в воду глядели, а может быть и баг ставший реальностью %) PS. надо готовиться к валу вопросов на форуме типа "почему не собирается" %) Код always_ff @(edge clk, posedge rst) if (rst) pipa <= '0; else pipa <= popa; end
--------------------
|
|
|
|
|
Nov 21 2009, 19:19
|

тоже уже Гуру
     
Группа: Свой
Сообщений: 2 047
Регистрация: 13-06-05
Из: Кёлн - Санкт-Петербург
Пользователь №: 5 973

|
Цитата(Builder @ Nov 12 2009, 15:19)  Вот, наткнулся на упоминание SystemVerilog 2009, по ссылкам кратко некоторые нововведения: наткнулся в новом стандарте на интересную лазейку для параметризирования типов данных(если я, конечно, ничего не попутал): пользовательский тип можно определять через ссылку на тип объявленный в теле интерфейса при условии, что этот интерфейс воткнут в модуль. Если параметризировать интерфейс типом(ами), то получим параметризируемые структуры данных. по-моему забавно  Код interface #(parameter type templatization_type_pt = int, parameter int size_p=8 )type_templated_if; typedef templatization_type_pt templated_array_type_t[size]; endinterface
module my_m(type_templated_if my_if); typedef my_if.templated_array_type_t my_templated_array_t; my_templated_array_t my_typed_array; endmodule
--------------------
И снова на арене цирка - дрессированные клоуны!! Оказываем консультации по электронике за симпу круглосуточно.
|
|
|
|
|
Dec 9 2009, 19:06
|

Гуру
     
Группа: Свой
Сообщений: 2 113
Регистрация: 1-11-05
Пользователь №: 10 359

|
А у меня вот такой вот вопрос... Код reg global_prereset; //reset for PLL reg [27:0] global_prereset_reg; //reset delay reg initial begin global_prereset = 0; global_prereset_reg = 0; end always @(posedge CLK_50) begin : global_prereset_build if (global_prereset_reg < (global_def :: GLOBAL_RESET_DELAY)) begin global_prereset <= 1; global_prereset_reg++; end else global_prereset <= 0; end Тут по правилам Verilog, объявляю переменную типа reg. Она может иметь 4 состояния, поэтому моделсим показывает неопределенное состояние этих сигналов, если не сделать initial. Теперь вместо reg назовем переменную logic, результат такой же как и для reg, т.е. опять нужен initial. Если же назвать переменные bit, которые могут принимать лишь 2 значения - 0 и 1, то все прекрасно работает без initial. Необходима ли инициализация переменных типа bit, и какое значение она примет "по-умолчанию"? Дальше я что-то вообще запутался. В Verilog, можно написать Код assign a = 10; если а объявлена как wireи можно написать Код always @(posedge CLK) a <= 10; если а объявлена как regВроде бы, можно сказать, что wire - это просто соединение, а reg - комбинационная логика, на ней уже можно строить тригеры и прочее. Для SV переменные bit и logic можно использовать где угодно. Что это означает? Просто более абстрактный подход, типа компилятор сам решит во что превратить переменную? Прошу специалистов разъяснить... Цитата A 4-state variable can be explicitly declared using the keyword pair var logic. For example: Код var logic [63:0] addr; // a 64-bit wide variable A Verilog net type defaults to being a 4-state logic data type. A net can also be explicitly declared as a 4-state data type using the logic keyword. For example: Код wire logic [63:0] data; // a 64-bit wide net Ква ругается на вторую, а первая прокатывает  Простите за разговорчивость. Нашел ответ на первую часть вопроса: Цитата All 2-state date types begin simulation with a logic 0. Since 2-state types do not store an X value, they cannot represent an unitialized state. This is one of the reasons that it is preferable to use 4-state types to represent synthesizable RTL models.
--------------------
Быть. torizin-liteha@yandex.ru
|
|
|
|
|
Dec 9 2009, 23:38
|

тоже уже Гуру
     
Группа: Свой
Сообщений: 2 047
Регистрация: 13-06-05
Из: Кёлн - Санкт-Петербург
Пользователь №: 5 973

|
Цитата(torik @ Dec 9 2009, 23:06)  Теперь вместо reg назовем переменную logic, результат такой же как и для reg, т.е. опять нужен initial. Если же назвать переменные bit, которые могут принимать лишь 2 значения - 0 и 1, то все прекрасно работает без initial. вы ещё забываете о таком замечательном действии как инлайн инициализация Код reg x=1'b0; в этом случае переменная приобретает значение ещё до начала симуляционного времени (initial, если я не ошибаюсь, тоже присваивает значение до модельного времени//конечно если не стоит задержка #0) Цитата(torik @ Dec 9 2009, 23:06)  Вроде бы, можно сказать, что wire - это просто соединение, а reg - комбинационная логика, на ней уже можно строить тригеры и прочее. противопоставлять wire и reg/bit некорректно, корректно противопоставлять wire и var, т.е. есть типы данных(reg, int, string, my_type) и есть вид(или класс или тип) объекта(сигнал/переменная/параметр/макрос-переменная(genvar)) типам данных присущи множества/диапазоны значений и структура; классы объекта составляют парадигму языка. ну например, genvar - это переменная препроцессора, параметр - переменная времени компиляции, сигналу присущи свойства уровнем абстракции ниже логического(физические свойства) и у сигнала нет дискретного во времени состояния, т.е. действительно похож на провод: если его подключить к источнику, то по нему течёт ток, если изменить скачко образно силу тока, то по нему будет теч ток другой силы, но всё равно будет течь непрерывно, хотя уровень тока кака-будто бы дискретно изменился, а если его отключить от источника, то не будет течь никакой, т.е. у сигнала нет состояния в прошлом/настоящем/будущем у него есть только одно состояние "всегда", т.е. у сигнала нет памяти как у переменной; но говоря о памяти переменной ни в коем случае нельзя понимать её как память в модельном времени - т.е. как регистр/зачёлку, а только как память языковой парадигмы. лучше всего это показать на примере: Код (var) int a; always_comb begin a=b; a=a+1; a=a**2; a=a-1; end это не запоминающий элемент на практике, а комбинационная схема, что же помнит тогда a? а помнит своё предыдущее состояние (кстати, не только самое последнее, и даже не только прошлое). то что при помощи переменной можно описать физическую память, это только производная от её свойств как класса объекта. почему происходит постоянная путаница между этими понятиями? потому, что по умолчанию всё что явно не декларировано как сигнал, является переменной. т.е. int a; на самом деле это var int a;при этом необходимо помнить, что не корректно говорить об исключительном противопоставрении var - wire, так как по сути говоря, сигналы существуют 12 типов (по их "физическим" свойствам) т.е. корректное противопоставление было бы var - {wire,wor,wand,tri,,supply0 ...} чем отличается сигнал от переменной на практике: - сигнал может иметь несколько драйверов, переменная нет (т.е. синалу можно присваивать несколько значений одновременно, правило разрешения определит каким будет результирующее значение множественного присваивания), при этом переменной можно присваивать значения в нескольких блоках, однако это не будет считаться одновременным присваиванием, т.к. действует правило "кто прследний тот и папа" (но при этом если переменной присваивается значения оператором непрерывного присваивания, то это может быть только единственным присваиванием этой переменной); - т.к. сигнал не может хранить значение ему нельзя присваивать значения в процедурных блоках, а только в операторах непрерывного присваивания assign (присваивание при объявлении сигнала и соединение с портом для сигнала считаются непрерывными присваиваниями), в то же время переменной можно присваивать значение в любых типах блоков а также оператором непрерывного присваивания assign, но если существует непрерывное присваивание, то это может быть единственным присваиванием данной переменной; - переменная не может быть соединена с портом inout;
--------------------
И снова на арене цирка - дрессированные клоуны!! Оказываем консультации по электронике за симпу круглосуточно.
|
|
|
|
|
Dec 10 2009, 08:02
|

Гуру
     
Группа: Свой
Сообщений: 2 113
Регистрация: 1-11-05
Пользователь №: 10 359

|
Цитата вы ещё забываете о таком замечательном действии как инлайн инициализация Ага, периодически забываю, спасибо. Инлайн инициализация, насколько я понял, тождественна initial? В размере кода я разницы не заметил... Вот такая штука не катит, почему? Особенность ква? Код wire logic sdfgsdfg; Ну и насчет переменных bit с двумями состояниями. Вычитал, что такие переменные необходимы вобщем-то для тестбенчей. Если использовать их в тестбенче, а подключать к ним сигналы logic тестируемого модуля, не получится ли что можно упустить при моделировании некие моменты, связанные с начальной инициализацией?
--------------------
Быть. torizin-liteha@yandex.ru
|
|
|
|
|
Dec 10 2009, 09:16
|
Вечный ламер
     
Группа: Модераторы
Сообщений: 7 248
Регистрация: 18-03-05
Из: Томск
Пользователь №: 3 453

|
уважаемый CaPpuCcino сильно пошел в теорию, вот на пальцах Цитата(torik @ Dec 10 2009, 02:02)  Аот такая штука не катит, почему? Особенность ква? Код wire logic sdfgsdfg; потому что wire/wand/wor/wxor/tri/... это декларация сигнала-цепи, а bit/logic/reg/enum/class..... это декларация переменной. Вы пытаетесь их смешивать. К цепям можно использовать только длительные присвоение (assign), а переменным любые. Цитата(torik @ Dec 10 2009, 02:02)  Ага, периодически забываю, спасибо. Инлайн инициализация, насколько я понял, тождественна initial? В размере кода я разницы не заметил... вы про RTL ? там это монописуально, а вот в tb разница есть Цитата Если использовать их в тестбенче, а подключать к ним сигналы logic тестируемого модуля, не получится ли что можно упустить при моделировании некие моменты, связанные с начальной инициализацией? вы правы, тут надо смотреть как работает ваше железо и помнить что bit вектора/массивы весят как минимум в 2 раза меньше чем они же но на logic/reg. Имеется в виду память симулятора %)
--------------------
|
|
|
|
|
Dec 10 2009, 10:12
|

Гуру
     
Группа: Свой
Сообщений: 2 113
Регистрация: 1-11-05
Пользователь №: 10 359

|
Цитата потому что wire/wand/wor/wxor/tri/... это декларация сигнала-цепи, а bit/logic/reg/enum/class..... это декларация переменной. Вы пытаетесь их смешивать. К цепям можно использовать только длительные присвоение (assign), а переменным любые. В книжке "Springer - SystemVerilog for Design, 2nd Edition" говорится, что wire, var - это тип. А logic/bit - это тип данных. По-умолчанию, wire - 4 состояния, т.е. logic. Но можно и явно указать wire logic, так ниписано в книге. Верно? Т.к. wire может быть только 4 состояния и не иначе, то запись logic вроде излишняя, но дело принципа... Цитата вы про RTL ? там это монописуально, а вот в tb разница есть Расшифруйте неразумному, пожалуйста, что такое tb...
--------------------
Быть. torizin-liteha@yandex.ru
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|