Jump to content
    

Verilog, кошерный использование if ?

module test (input clk, a, b, output c); 

logic tmp; 

always @(posedge clk) begin 
  tmp = a ^ b; 
  c <= tmp; 
end 

endmodule

 

точнее не так

 

module test (input clk, a, b, output c); 

logic tmp; 

always @(posedge clk) begin 
  c <= pipa(a,b); 
end 


function automatic logic pipa (input logic data, datb);
  logic tmp;
begin  
  tmp = data ^ datb; 
  return tmp;
end  
endfunction 

endmodule

 

Ква 8.0 sp1.

post-3453-1242033125_thumb.jpg

Share this post


Link to post
Share on other sites

В оригинале второго варианта получено следующее:

Loading verilog file '/home/s-markov/work2/temp/test.v'
Detecting input file type automatically (-rtl or -netlist).
Running DC verilog reader
Reading with Presto HDL Compiler (equivalent to -rtl option).
Running PRESTO HDLC
Compiling source file /home/s-markov/work2/temp/test.v
Error:  /home/s-markov/work2/temp/test.v:3: Syntax error at or near token ';'. (VER-294)
Error:  /home/s-markov/work2/temp/test.v:10: Syntax error at or near token 'pipa'. (VER-294)
Error:  /home/s-markov/work2/temp/test.v:11: Syntax error at or near token ';'. (VER-294)
Error:  /home/s-markov/work2/temp/test.v:14: Syntax error at or near token ';'. (VER-294)
*** Presto compilation terminated with 4 errors. ***
Error: Can't read 'verilog' file '/home/s-markov/work2/temp/test.v'. (UID-59)
No designs were read

 

после переделки в привычный вид

 

module test (input clk, a, b, output reg c); 

always @(posedge clk) begin 
  c <= pipa(a,b); 
end 

function pipa;
  input data, datb;
  reg tmp;
  begin  
    pipa = data ^ datb; 
  end  
endfunction 

endmodule

 

чтение файла удалось:

 

Loading verilog file '/home/s-markov/work2/temp/test.v'
Detecting input file type automatically (-rtl or -netlist).
Running DC verilog reader
Reading with Presto HDL Compiler (equivalent to -rtl option).
Running PRESTO HDLC
Compiling source file /home/s-markov/work2/temp/test.v

statistics for FSM inference:

  dcfpga-flow: off

  no finite state machine inferred.

Inferred memory devices in process
    in routine test line 3 in file
        '/home/s-markov/work2/temp/test.v'.
===============================================================================
|    Register Name    |   Type    | Width | Bus | MB | AR | AS | SR | SS | ST |
===============================================================================
|        c_reg        | Flip-flop |   1   |  N  | N  | N  | N  | N  | N  | N  |
===============================================================================
Presto compilation completed successfully.

 

Ну синтез, собственно, т.е. команду compile, я не запускал, ибо и так без синтеза ясно, что съедено, и схема, описанная тут, "всосана" правильно.

 

 

так, это я торможу.

 

После замены read_verilog на read_sverilog и первый проект в DC считался. Но, не без глюка - вместо "output c" все таки с меня стребовали "output reg c", ничего тут не сделать. А что - квартусу и слова "reg" оказалось не нужно для успешного синтеза?

post-2881-1242035274_thumb.png

Share this post


Link to post
Share on other sites

ИМХО, пример выше не очень правильный с точки зрения блокирующего присваивания, а то заоптимизировалось в:

always @(posedge clk)
c<=a^b;

 

Так наверно будет более интересно : )

module test ( input clk, a, b,  output reg c ); 

reg tmp; 

always @(posedge clk) begin 
  tmp = a ^ b; 
  c <= tmp; 
end 

endmodule

 

что скажет квартус?

Share this post


Link to post
Share on other sites

Извиняюсь, я был не прав. DC не позволяет применять блокирующее и неблокирующее присваивание одной и той же переменной внутри одного блока always, а не просто мешать те и иные виды присваиваний. Т.е. ошибка звучит вот так :

Variable 'c' is the target of both blocking and nonblocking assignments in the same always block. (VER-134)

то есть речь вот о таком примере, перевариваемом ква без вопросов, но не перевариваемом DC:

module test (input clk, a, b, output reg c); 

always @(posedge clk) begin 
  c  = b ^ c; 
  c <= a ^ c; 
end 

endmodule

 

ЗЫ. Я сам не вижу причин ругать это еррором, но вот факт. квартус поддерживает, синопсис - нет.

 

Так наверно будет более интересно : )

Хоть убейся, не пойму, в чем отличие от варианта des00... Копия - строка в строку.

Share this post


Link to post
Share on other sites

>Хоть убейся, не пойму, в чем отличие от варианта des00... Копия - строка в строку.

Не совсем.

У меня есть явно reg - к которому делается блокирующее присваивание(как промежуточный результат), а у des00 получается голая логика( без регистров) в одном из присваиваний(неявно получается assign)

Share this post


Link to post
Share on other sites

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

Это обычная синтаксическая ошибка (читай - глюк) Все то, что присваивается внутри always - должно быть регистровым типом. Т.е. вариант в виде des00 - это просто глюкавый вариант, который не компилируется по определению, а Вы исправили этот глюк, добавив слово reg после output. Что касается tmp - тип logic это тоже регистровый тип, ничем не хуже reg.

Share this post


Link to post
Share on other sites

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

 

Если бы корявое - это не страшно.

А как Вы относитесь к тому, что в результате синтеза сигнал reset поступает на входы ena триггеров?

В перемежку с нормальным.

А клок один.

Share this post


Link to post
Share on other sites

А как Вы относитесь к тому, что в результате синтеза сигнал reset поступает на входы ena триггеров?

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

Share this post


Link to post
Share on other sites

2 des333

 

 

это же элементарно, если вы работали c VHDL там есть сигналы и переменные, в данном контексте использование

Спасибо за разъяснение, но я, наверное, неправильно выразился.  :)

 

 

У меня нет вопросов насчет того, что в итоге будет синтезировано и как работают блокирующее и неблокирующее присваивания.

 

Мне стало интересно почему Altera приводит данный код в своем примере, хотя одновременное использование обоих типов присваивания в одном блоке always является объектом для warning'a в Quartus:

 

In an always construct in a Verilog Design File (.v), you mixed blocking and non-blocking assignments. Although Verilog HDL permits you to mix both types of assignments, doing so can introduce subtle bugs into your HDL source; it can also introduce differences between the simulated behavior of the design and the synthesized netlist. In general, you should use blocking assignments in always constructs that model combinational logic and non-blocking assignments in always construct that model sequential logic.
 

 

 

 

 

 

Лично на мой взгляд такое описание затрудняет понимание кода, хотя иногда и сокращает его.

 

 

 

P.S. Хотя нет, вру: непонятно, зачем использовано блокирующее присваивание в этой строчке

if (count == 1) 

  begin

  phaseupdown <= step;

  phasecounterselect = counter;

  count <= count + 1;

  end

Edited by des333

Share this post


Link to post
Share on other sites

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

 

В проекте группа триггеров, по одному фронту клока. На всех подан ресет. Но одна группа -на aclr, другая на ena

Такое обычно бывает, кода не описаны сигналы в состояниях, когда это необходимо. При комбинаторике при описании автоматов лачи получаются.

Следовательно вряд ли товарищ делал то, чего хотел на самом деле.

Share this post


Link to post
Share on other sites

Но одна группа -на aclr, другая на ena

На aclr? Это действительно странно. Процесс синхронный по одному клоку, резета в списке чувствительности нет, не должно быть aclr-а, никак не должно...

 

При комбинаторике

Да, при комбинаторике (always_comb или always @*) согласен, во избежание латчей важно описать все пути, но к имеющемуся always @(posedge smclk) это отношения не имеет, это не комбинаторный always.

Share this post


Link to post
Share on other sites

На aclr? Это действительно странно. Процесс синхронный по одному клоку, резета в списке чувствительности нет, не должно быть aclr-а, никак не должно...

 

я не анализировал. (В одном процессе по фронту клока я все условия работы счетчика один раз описываю).Скачал и посмотрел rtl

Share this post


Link to post
Share on other sites

 А что - квартусу и слова "reg" оказалось не нужно для успешного синтеза?

Насколько помню, в Quartus это даже на warning не тянет.  :)

 

На aclr? Это действительно странно. Процесс синхронный по одному клоку, резета в списке чувствительности нет, не должно быть aclr-а, никак не должно...

 

Почему нет в списке чувствительности?

 

 

Если я правильно понял, sazh имеет в виду:

 

always @(posedge smclk or posedge reset)
begin
  if (reset) 
    begin
      state <= do_nothing;
    end
  else
    state <= next_state;
end

Edited by des333

Share this post


Link to post
Share on other sites

Насколько помню, в Quartus это даже на warning не тянет.  :)

Не, аж на жирный еррор. Ради интереса проверил. По крайней мере в Q8.0

Share this post


Link to post
Share on other sites

Учитывая следующие пункты:

1) Одновременное использование blocking and non-blocking assignments

2) Разное функциональное воздействие сигнала reset

3) Мелочи, вроде использования begin/end для обрамления одной строки кода в одном случае и не использования в другом

 

Мне кажется, что либо автор действительно не понимал, что пишет, либо он был очень небрежен, либо просто это коду "тысяча лет" и, в любом случае, как Coding Style от Altera его в коем случае не стоит.

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...