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

Документация на System Verilog

...

вариант с прекомпилятором использовать не хочется, хотчется языковыми средствами.

спб

 

 

Встала аналогичная задача, только коммутировать интерфейсы необходимо динамически во время работы(в железе).

То есть вариант с прекомпилятором отпадает в принципе.

 

Не могли бы Вы поделиться своими соображениями на данную тему: нашли ли вы какое-либо изящное решение или поняли, что его не существует?

 

 

Заранее спасибо!

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


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

Встала аналогичная задача, только коммутировать интерфейсы необходимо динамически во время работы(в железе).

на мой взгляд подобное языковыми средствами не решается. динамическая коммутация в железе - это полноценный блок-коммутатор, т.е. отдельное устройство (поправте, плз., если я заблуждаюсь).

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


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

А не мог бы кто-нибудь выложить на рапидшару или подобный сервис "SystemVerilog For Design: A guide to using SystemVerilog for HW design and Modeling. Stuard Sutherland, Simon Davidmann // Kluwer Academic Publishers"?

 

Доступа к фтп не имею, а хотелось бы почитать..

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


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

господа проясните следующий момент, какой по вашему мнению должен быть результат в outb/outg

 

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

 

будте внимательны

post-3453-1254898087_thumb.jpg

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


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

Вот, наткнулся на упоминание SystemVerilog 2009, по ссылкам кратко некоторые нововведения:

http://www.sunburst-design.com/papers/DAC2...burstDesign.pdf

http://www.sunburst-design.com/papers/DAC2...therlandHDL.pdf

Думаю будт интересно, кто на SV пишет.

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


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

Вот, наткнулся на упоминание SystemVerilog 2009, по ссылкам кратко некоторые нововведения:

http://www.sunburst-design.com/papers/DAC2...burstDesign.pdf

http://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

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


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

PS. надо готовиться к валу вопросов на форуме типа "почему не собирается" %)

:biggrin:

можно успокоиться только тем, что ещё относительно не скоро

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


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

Вот, наткнулся на упоминание 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

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


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

А у меня вот такой вот вопрос...

 

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

 

Ква ругается на вторую, а первая прокатывает :blink:

 

Простите за разговорчивость. Нашел ответ на первую часть вопроса:

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.

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


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

Теперь вместо reg назовем переменную logic, результат такой же как и для reg, т.е. опять нужен initial.

Если же назвать переменные bit, которые могут принимать лишь 2 значения - 0 и 1, то все прекрасно работает без initial.

вы ещё забываете о таком замечательном действии как инлайн инициализация

reg x=1'b0;

в этом случае переменная приобретает значение ещё до начала симуляционного времени (initial, если я не ошибаюсь, тоже присваивает значение до модельного времени//конечно если не стоит задержка #0)

Вроде бы, можно сказать, что 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;

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


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

вы ещё забываете о таком замечательном действии как инлайн инициализация

 

Ага, периодически забываю, спасибо. Инлайн инициализация, насколько я понял, тождественна initial? В размере кода я разницы не заметил...

 

 

 

Вот такая штука не катит, почему? Особенность ква?

wire logic sdfgsdfg;

 

Ну и насчет переменных bit с двумями состояниями. Вычитал, что такие переменные необходимы вобщем-то для тестбенчей.

Если использовать их в тестбенче, а подключать к ним сигналы logic тестируемого модуля, не получится ли что можно упустить при моделировании некие моменты, связанные с начальной инициализацией?

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


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

уважаемый CaPpuCcino сильно пошел в теорию, вот на пальцах

 

Аот такая штука не катит, почему? Особенность ква?

wire logic sdfgsdfg;

 

потому что wire/wand/wor/wxor/tri/... это декларация сигнала-цепи, а bit/logic/reg/enum/class..... это декларация переменной. Вы пытаетесь их смешивать. К цепям можно использовать только длительные присвоение (assign), а переменным любые.

 

Ага, периодически забываю, спасибо. Инлайн инициализация, насколько я понял, тождественна initial? В размере кода я разницы не заметил...

 

вы про RTL ? там это монописуально, а вот в tb разница есть

 

Если использовать их в тестбенче, а подключать к ним сигналы logic тестируемого модуля, не получится ли что можно упустить при моделировании некие моменты, связанные с начальной инициализацией?

 

вы правы, тут надо смотреть как работает ваше железо и помнить что bit вектора/массивы весят как минимум в 2 раза меньше чем они же но на logic/reg. Имеется в виду память симулятора %)

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


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

потому что 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...

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


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

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

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

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

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

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

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

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

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

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