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

Вот у меня какой вопрос:

 

я делаю синтезируемые блоки шинных мультиплексоров для разных типов шин. Например, на входе 10 шин одного типа, на выходе 1 шина того же типа. Поможет SV?

вам помогут интерфейсы + модпорты + функции в интерфейсах и их использование в модпортах. ЕМНИП на форуме есть великолепный пример от dxp как красиво решить проблему создания интерконнекта в shared bus архитектуре

 

 

И кстаи, в этой теме вы были http://electronix.ru/forum/index.php?showtopic=112393 все ходы записаны ;)

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


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

Спасибо. Это не подходит конечно же. Такого добра я сам богато умею.

 

Такой вариант Вам подходит?

 

Да, был. и мед-пиво пил. Но как передать шину наперед неизвестного типа в модуль (без расплющивания в гомогенную шину), я все равно не понял.

 

вам помогут интерфейсы + модпорты + функции в интерфейсах и их использование в модпортах. ЕМНИП на форуме есть великолепный пример от dxp

И кстаи, в этой теме вы были

все ходы записаны ;)

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


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

Да, был. и мед-пиво пил. Но как передать шину наперед неизвестного типа в модуль (без расплющивания в гомогенную шину), я все равно не понял.

Хмм, может быть я не так понял задачу.

 

Вы писали "Например, на входе 10 шин одного типа, на выходе 1 шина того же типа." Т.е. тип известен. Тип == интерфейс, а логика мультиплексирования уже в интерфейсе. Т.е. задача разработки "синтезируемых блоков шинных мультиплексоров" сводиться к разработке "синтезируемой библиотеки разных типов шин". Мне видиться такое решение. Тип шины все равно требует декларации и описания.

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


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

Задача: сделать шинный мультиплексор для шины, тип которой наперед неизвестен. Он и не нужен для этой задачи.

 

Насчет интрефейса все тоже хорошо, конечно. Как изолировать мультиплексор в интерфейсе при синтезе?

 

Вопросы пока.

Хмм, может быть я не так понял задачу.

а логика мультиплексирования уже в интерфейсе.

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


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

Задача: сделать шинный мультиплексор для шины, тип которой наперед неизвестен. Он и не нужен для этой задачи.

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

либо это вопрос из раздела шашечки или ехать.

 

Насчет интрефейса все тоже хорошо, конечно. Как изолировать мультиплексор в интерфейсе при синтезе?

он там будет в виде функции, если ссылаться на код dxp

function automatic data_t qmux(q_bundle_t x, int n);
    return x[n];
endfunction

раскройте слово изолировать и самое главное цель изоляции?

 

 

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


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

Мозг у вас довольно взрывоопасный, ага. Отвечаю на ваши вопросы:

 

Тип должен быть известен на этапе синтеза. На этапе разработки я могу его не знать. В ооп есть такая штука, как виртуальные члены классов. Здесь та же аналогия.

 

Мне конечно и обязательно шашечки. Доехать я запросто могу и на обычном исконно-пасконном Verilog'e. С другой стороны сейчас стало жутко модно в резюме писать "Skills: System Verilog", вот я и пытаюсь понять, что стоит за этими надписями. Ну и, возможно, проследовать за модой.

 

"Изолировать" это значит выделить все ячейки, относящиеся к функционалу "мультиплексор". Например для задания ограничений или для оценки площади, или для размещения. В Verilog я создаю модуль, который занимается мультиплексированием, не разрешаю его разгруппировывать, а потом с этим модулем что-то делаю в скриптах синтеза.

 

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

 

либо это вопрос из раздела шашечки или ехать.

 

раскройте слово изолировать и самое главное цель изоляции?

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


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

"Изолировать" это значит выделить все ячейки, относящиеся к функционалу "мультиплексор". Например для задания ограничений или для оценки площади, или для размещения. В Verilog я создаю модуль, который занимается мультиплексированием, не разрешаю его разгруппировывать, а потом с этим модулем что-то делаю в скриптах синтеза.

Когда писал пост, на который вы дали такой ответ, как раз думал об этом. Мне сегодня везет. В случае с интерфейсом такая штука не пройдет, т.к. он не является модулем и скорее всего не будет парситься в нетлисте корректно, но его можно положить во враппер. Вы одновременно хотите ништяков высокоуровневого описания, которое скрывает всю кухню и контроля до люта руками. Такое бывает но дюже редко.

 

Тип должен быть известен на этапе синтеза. На этапе разработки я могу его не знать. В ооп есть такая штука, как виртуальные члены классов. Здесь та же аналогия.

Вам все равно спускаться до известных типов. Предлагаемое мной решение, позволит вам вообще убрать этап разработки мультиплексора. Точнее он будет, но на этапе разработки самого интерфейса. Если ваша цель, борьба с безработицей, то решение с вашими требованиями для SV будет такое же как для V.

 

С другой стороны сейчас стало жутко модно в резюме писать "Skills: System Verilog", вот я и пытаюсь понять, что стоит за этими надписями. Ну и, возможно, проследовать за модой.

За этими надписями стоит владение SV ООП для моделирования + Constraint based random verification c AVM/OVM/UVM технологиями + SVA. RTLные ништяки SV это так, паравозиком идут.

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


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

Я прежде всего хочу понять (читая литературу и задавая дурацкие вопросы), насколько SV, как инструмент, применим для моих задач. Какой выигрыш он даст при использовании. Пока я вижу, что для меня пользы не слишком много:

 

Моделирование на SV для ЦОС - это юмор особого рода, конечно.

 

А "RTL-ништяки", если уж переходить в плоскость молодежного жаргона, они стрёмные какие-то на первый взгляд. Возможно, что есть внятное руководство от производителей синтезаторов по тому, во что преобразуются те или иные веселые конструкции SV.

 

В общем, пока мотивы использовать мне до конца не ясны.

 

Спасибо за ответы.

 

Вы одновременно хотите ништяков ... и контроля ....

 

За этими надписями стоит владение SV ООП для моделирования + Constraint based random verification c AVM/OVM/UVM технологиями + SVA. RTLные ништяки SV это так, паравозиком идут.

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


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

Моделирование на 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 можно сделать тоже самое, но количество гемороя будет несколько больше.

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


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

Обязательно попробую. Вот как только доделаю блок управления елочной гирляндой, так сразу приступлю к эквалайзеру.

 

Да ИМХО достаточно описать ну положим адаптивный FSE эквалайзер на 32 коэффициента, отдельно FIR, отдельно модуль адаптации коэффициентов и соединить их веревками

 

Я бы в функциях умножения в GF попробовал в явном виде обрабатывть более 1 бита в одном слое комбинаторной логики.

На первый взгляд LUT4 может обработать 2 бита, а LUT6 - 4 бита.

 

Все остальное хорошо, да. А местами даже прекрасно.

 

Не сочтите за рекламу, если интересно можете посмотерть файлы модулей отсюда http://electronix.ru/forum/index.php?showt...5%F0+%E1%F7%F5* там декодер БЧХ и РС. нужно таскать массивы данных между модулями, на SV красиво, элегантно и без всяких лишних сущностей. На V можно сделать тоже самое, но количество гемороя будет несколько больше.

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


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

Обязательно попробую. Вот как только доделаю блок управления елочной гирляндой, так сразу приступлю к эквалайзеру.

Гирлянда это вещь, никогда не делал. Надо реализовать и с помощью UVM верифицировать.

Я бы в функциях умножения в GF попробовал в явном виде обрабатывть более 1 бита в одном слое комбинаторной логики.

На первый взгляд LUT4 может обработать 2 бита, а LUT6 - 4 бита.

Делать руками не имеет практического смысла. Современные синтезаторы сами укладыют оптимально, изучал этот вопрос в technology mapper

 

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


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

Еще вопрос по 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 не меняется.

 

 

 

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


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

Еще вопрос по 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

и все меняется

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


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

Не понял в чем разница? В том что объявили структуру и функцию внутри модуля? Согласен, код я написал неправильно, на самом деле, вне модуля объеялен пакет, в нем структура и задача, которые импортируются в модуле.

 

А что дает слово automatic что-то мне не очень понятно? И зачем блокирующее присваивание?

 

Проверил, все работает. Идем дальше, меняем задачу:

 

 

task automatic t1
(
   ref obj object1,
   input  wr
);
   if (wr)
     object1.addr = object1.saddr;
   if (!wr)
     object.sss = aaa;
endtask

 

 

Ну само собой допиливаем остальной код, чтобы были sss, aaa.

Так вот я заметил, что выполняется только первый if, второй не выполняется. Это че так?

 

 

 

 

 

 

 

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


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

Не понял в чем разница? В том что объявили структуру и функцию внутри модуля? Согласен, код я написал неправильно, на самом деле, вне модуля объеялен пакет, в нем структура и задача, которые импортируются в модуле.

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

все прекрасно работает

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


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

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

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

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

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

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

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

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

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

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