Jump to content
    

Перенос кода с языка C

2 hours ago, RobFPGA said:

Чем  же эта концепция (блокирующие/неблокирующие присвоения) так неудачна с вашей точки зрения? 

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

	wire [7:0] a,b,c;
	reg [7:0] q;
	always_comb begin
	  …
	  c=a+b;
	  ...
	end
	...
	...
	always@(posedge clk) begin
	  …
	  q<=q+c;
	  ...
	end
	...
	

 

2 hours ago, RobFPGA said:

И что бы вы изменили в ней?

Уже изменил - тип присвоения определяется не типом операции, а типом данных. Могу так писать:

	wire [7:0] a,b,c;
	reg [7:0] q;
	…
	begin
	  …
	  c=a+b;
	  q=q+c;
	  ...
	end
	...
	

- никаких логических противоречий, и все правильно синтезируется. 

 

Share this post


Link to post
Share on other sites

Приветствую!

1 hour ago, Leka said:

Уже изменил - тип присвоения определяется не типом операции, а типом данных. Могу так писать:

:shok: вообще  то  типу wire коме  assign (явно или неявно) ничего и не присвоишь. Как вы его в always_comb  засунуть  смогли ?

 

56 minutes ago, Leka said:

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

C чего бы это? Не хотите - не разносите.  Кто мешает  вам сделать :

  always @(posedge clk) begin
    logic [7:0] v_c;
    v_c = a+b;

    q <= q + v_c;
  end
    
  // или даже так 
  ...
    if (a>N) begin
      struct packed {
        logic [4:0] c;
        logic [1:0] b;
        logic       a;
      } v_st;

      v_st = b[7:0];

      if (v_st.a) begin
        v_st.b = ...
        ...
      end
      ...
        
     q <= v_st;   
    end
  ...

 Причем  все однозначно  и понятно (и понятно всем знающим V/SV).   А вот в вашем случает  придется  гадать какое c будет прибавлено к q, то что есть результат блокирующего или неблокирующего присвоения?     

Удачи Rob.

Share this post


Link to post
Share on other sites

37 minutes ago, RobFPGA said:

C чего бы это? Не хотите - не разносите.  Кто мешает  вам сделать :

Так только с локальными переменными можно, с глобальными (чтобы можно было в инстансы и порты передавать) не получится. 

42 minutes ago, RobFPGA said:

вообще  то  типу wire коме  assign (явно или неявно) ничего и не присвоишь. Как вы его в always_comb  засунуть  смогли ?

Код после препроцессора совсем не похож на исходный, создаются новые переменные нужных типов, и always-блоки (в исходном их вообще нет).

 

Share this post


Link to post
Share on other sites

Для переменной типа "reg" подразумевается неблокирующее присваивание, для "wire" - блокирующее.

"reg" всегда подразумевает регистр, "wire" - провод (комбинационную логику). 

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

Share this post


Link to post
Share on other sites

Приветствую!

47 minutes ago, Leka said:

Для переменной типа "reg" подразумевается неблокирующее присваивание, для "wire" - блокирующее.

"reg" всегда подразумевает регистр, "wire" - провод (комбинационную логику). 

Портянка  последовательных  операций  по которой нужно догадываться  какой будет тип присвоения в когда переменна получит новое значение  (помня типы переменных).  
Да  уж -  та еще  концепция. :cray:  IMHO  чем так лучше  уж  на VHDL писать.

Хотя как говорится  любовь зла .. на вкус и цвет  фломастеры все разные    :biggrin:

 

Удачи Rob.

Share this post


Link to post
Share on other sites

 

 

Leka

Для переменной типа "reg" подразумевается неблокирующее присваивание, для "wire" - блокирующее.

"reg" всегда подразумевает регистр, "wire" - провод (комбинационную логику). 

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

 

Был такой язык AHDL, там так и было сделано, не нужны никакие процессы, always @(posedge clk), блокирующие присваивания, там нельзя было написать неправильно, как это происходит в Verilog, VHDL, просто описание соединений, собственно как это и происходит в FPGA.

 

 

RobFPGA

Причем  все однозначно  и понятно (и понятно всем знающим V/SV).

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

 

Share this post


Link to post
Share on other sites

Приветствую!

4 hours ago, petrov said:

Был такой язык AHDL, там так и было сделано, не нужны никакие процессы, always @(posedge clk), блокирующие присваивания, там нельзя было написать неправильно, как это происходит в Verilog, VHDL, просто описание соединений, собственно как это и происходит в FPGA.

Есть  еще и чистый схематик - там еще  сложнее ошибиться c присвоениями  :wink2:   Но  вот  и с "удобствами"  в схематике не очень.

Я  на AHDL в свое время много чего делал в MaxPlusII. И хоть  AHDL  был прогрессивен  по сравнению  с тем же схематиком  но почему же он не выжил в конкуренции с тем же verilog? (даже образца 1995 года).  IMHO потому  что был чересчур "прямолинеен".  Описывать всю логику  работы дизайна в стиле  "... этот провод воткни туда, тут счетчик,  а  тут влепи элемент 2Ине..."  утомительно, даже  с учетом возможности автоматизации части рутины. И это даже для относительно небольших FPGA тех годов. 
Но если скучаете по такому стилю то можете и на V/SV  так  поразвлекаться -  нужно лишь  пару десятков модулей примитивов (а они уже  есть в библиотеках)  и  никаких always... и непонятных  присвоений в вашем коде больше не будет :yes3:   Сможете  объяснить  как пользоваться виртуальным  паяльником  даже  школьнику  :biggrin:   
 

4 hours ago, petrov said:

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

 Сложно, по себе знаю. :cray:

Но учить ведь надо если хотите полноценно  работать  в профессии.  Или схемотехники не читают доки на чипы на английском? А так их в платы и лепят - вдруг срастется,  ведь "... в прошлом проекте тоже был похожий корпус  о 48  ногах,  значит и  в этом те же ноги питания.  Ну и что что тип чипа другой ..."      :wacko2: 

 

Удачи! Rob.

 

P.S.  Ну  и не надо забывать что  V/SV это еще и язык для  сима/верификации. И концепция языка  должна  одинаково способствовать написанию кода  для всех применений.   

Share this post


Link to post
Share on other sites

58 minutes ago, RobFPGA said:

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

Это ерунда по сравнению с тем, например, что нужно помнить и учитывать латентность данных, передаваемых между модулями.

Число глобальных переменных надо минимизировать, и больше использовать локальные переменные в небольших begin-end блоках. Логически связанные куски кода я заключаю в begin-end (иногда предваряемый кратким комментарием), с локальными переменными при необходимости (и "регистры", и "провода"). Такие блоки м/б вложенными, получается наглядное логическое выделение кусков кода без лишних сущностей. 

Share this post


Link to post
Share on other sites

Вопрос так можно ставить, являются ли отдельные концепции языка математической необходимостью, или неким компромиссом, или просто исторической глупостью. Базовая концепция всех(?) HDL - принцип однократного присваивания, конкретная реализация м/б разной. Процедурные блоки, блокирующие/неблокирующие присваивания, всякие ограничения и запреты (например, запрет на смешанные присваивания одной переменной, или в разных блоках) - это все конкретная реализация принципа однократного присваивания. А вот определение типа присваивания типом операции, разделение процедурных блоков на комбинационные и регистровые - _имхо_, является не необходимостью, а просто исторической глупостью. Которая выливается в непрерывное изобретение новых костылей в виде новых типов данных, и конструкций языка. Например, ключевое слово "automatic" - только для того, чтобы можно было не синтезировать регистры в регистровых блоках. Или "logic" - только для того, чтобы не объявлять "reg" для комбинационной логики.   

Share this post


Link to post
Share on other sites

Приветствую!

3 hours ago, Leka said:

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

Ну  вот опять  всплыл  это непонятный "принцип однократного присвоения". В классических  функциональных  языках  это вроде как значит что переменная может быть присвоено значение лишь  однажды. Как то это не вяжется  с тем  что что можно делать с переменной в V/SV.   

HDL языки  типа V/SV  и др.  в первую очередь  разрабатывались чтобы решать   практические задачи. Естественно они содержат в себе как концепции так и  компромиссы чтобы  эти концепции можно было реализовать.  И IMHO в  первую очередь что решается в таких языках это как однозначно описывать одновременные параллельные процессы.  И  многие ограничения (и приведенные вами) связанны именно с тем что понятие параллельные события на нулевом интервале времени генерирует неопределённость/UB  и надо их как то разруливать.   И разруливать  не в ущерб выразительным возможностям  языка.  
Ну а запрет на смешанные  присваивания  в разных блоках работает лишь для синтеза.  И понятно почему - ведь физически цепи вы можете назначит лишь один результат.  При симуляции такого ограничения нет и вы можете рулить переменной  из  разных блоков.   

 

3 hours ago, Leka said:

А вот определение типа присваивания типом операции, разделение процедурных блоков на комбинационные и регистровые - _имхо_, является не необходимостью, а просто исторической глупостью. Которая выливается в непрерывное изобретение новых костылей в виде новых типов данных, и конструкций языка. Например, ключевое слово "automatic" - только для того, чтобы можно было не синтезировать регистры в регистровых блоках. Или "logic" - только для того, чтобы не объявлять "reg" для комбинационной логики.   

Странно  слышать о глупости  наличия различных типов данных и конструкций  для описания реализаций различных физических и логических конструкций.  А тем более странно  если не понимать назначение этих милых "глупостей".  Automatic служит  лишь для указания симулятору где будет выделятся память для переменной - в общей куче или в стеке. И соответственно  будет ли эта переменная видна как глобально-статическая и локальная.  В синтезе automatic игнорируется. и уж тем более запретить что-то не может. В синтезе  все переменные статические.

logic  ввели лишь для  того чтобы разрулить неоднозначность  в названии типа данных reg.  А то молодые неокрепшие умы разработчиков прочно ассоциируют название типа с результатом синтеза и потом  недоумевают что бывает не так.  И  если уж полно описывать переменную в SV то надо писать или wire logic ...  или  var logic ... .  То есть в действительности слово logic используется для описания типа значений которые могут присутствовать в переменной/цепи. Если logic значит 4 значения  0,1,x,z.  Если bit значит только 0 и 1; Ну а краткие описания wire, logic, ... используют для удобства и совместимости с V.    

 

Удачи! Rob.

Share this post


Link to post
Share on other sites

1 hour ago, RobFPGA said:

непонятный "принцип однократного присвоения"

Практически это означает, что одному логическому регистру соответствует один физический регистр, которому можно присвоить только одно значение в текущий такт. 

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

Share this post


Link to post
Share on other sites

Приветствую!

3 minutes ago, Leka said:

Практически это означает, что одному логическому регистру соответствует один физический регистр, которому можно присвоить только одно значение в текущий такт. 

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

Это  какая то игра слов  -  в V/SV нет понятие регистр  - есть понятие переменная. Один из  типов таких переменных может "помнить" свое состояние между присвоениями в нее.  И я могу в такую переменную  присваивать сколь угодно много раз в текущем такте (и использовать результат такого присвоения). Как раз блокирующее  присвоение в процедурном блоке это и позволяет делать.  


А вот во что будет синтезироваться такая переменная зависит как от контекста так и от типа данных этой переменной. И естественно при синтезе физически сохраняется лишь результат последнего присвоения в такую переменную (если та синтезировалась как регистр/память). Каким боком тут примазан "принцип однократного присвоения" ни как не могу понять :scratch_one-s_head:
  

Удачи! Rob.

Share this post


Link to post
Share on other sites

27 minutes ago, RobFPGA said:

при синтезе физически сохраняется лишь результат последнего присвоения в такую переменную (если та синтезировалась как регистр/память)

Это и есть "принцип однократного присвоения", тк все предыдущие существовали только на промокашке (в памяти синтезатора). 

 

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

Share this post


Link to post
Share on other sites

Приветствую!

6 minutes ago, Leka said:

Это и есть "принцип однократного присвоения", тк все предыдущие существовали только на промокашке (в памяти синтезатора). 

IMHO С какой это стати? Это не принцип языка - это результат физичности результата синтеза. (хотя когда сделают квантовую FPGA может и это ограничение  пропадет).
Сам по себе V/SV язык ни какими такими принципами не определяется и не руководствуется. 

Да  и даже сейчас например  одновременное присвоение двух значение в одну переменную которая синтезируется как dual-port  память  вас не смущает? 

Что ж это за принцип такой  непринципиальный  :unknw:

 

Удачи!   

Share this post


Link to post
Share on other sites

37 minutes ago, RobFPGA said:

одновременное присвоение двух значение в одну переменную которая синтезируется как dual-port  память  вас не смущает?

Нет, тк это физические копии одного значения, а не разные значения.
В конвейере, например, надо хранить разные значения одной переменной.

Уточнение по dual-port - имеется в виду ячейки по одному адресу, а не по разным адресам (если иное имелось в виду, можно проще пример привести - в n-разрядный регистр n бит одновременно пишутся).

 

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...