des00 26 May 11, 2009 Posted May 11, 2009 · Report post 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. Quote Share this post Link to post Share on other sites More sharing options...
SM 13 May 11, 2009 Posted May 11, 2009 · Report post В оригинале второго варианта получено следующее: 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" оказалось не нужно для успешного синтеза? Quote Share this post Link to post Share on other sites More sharing options...
atlantic 0 May 11, 2009 Posted May 11, 2009 · Report post ИМХО, пример выше не очень правильный с точки зрения блокирующего присваивания, а то заоптимизировалось в: 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 что скажет квартус? Quote Share this post Link to post Share on other sites More sharing options...
SM 13 May 11, 2009 Posted May 11, 2009 · Report post Извиняюсь, я был не прав. 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... Копия - строка в строку. Quote Share this post Link to post Share on other sites More sharing options...
atlantic 0 May 11, 2009 Posted May 11, 2009 · Report post >Хоть убейся, не пойму, в чем отличие от варианта des00... Копия - строка в строку. Не совсем. У меня есть явно reg - к которому делается блокирующее присваивание(как промежуточный результат), а у des00 получается голая логика( без регистров) в одном из присваиваний(неявно получается assign) Quote Share this post Link to post Share on other sites More sharing options...
SM 13 May 11, 2009 Posted May 11, 2009 · Report post у меня есть явно reg - к которому делается блокирующее присваивание(как промежуточный результат), а у des00 получается голая логика( без регистров) в одном из присваиваний Это обычная синтаксическая ошибка (читай - глюк) Все то, что присваивается внутри always - должно быть регистровым типом. Т.е. вариант в виде des00 - это просто глюкавый вариант, который не компилируется по определению, а Вы исправили этот глюк, добавив слово reg после output. Что касается tmp - тип logic это тоже регистровый тип, ничем не хуже reg. Quote Share this post Link to post Share on other sites More sharing options...
sazh 9 May 11, 2009 Posted May 11, 2009 · Report post да нормальное описание, корявое но нормальное. Если бы корявое - это не страшно. А как Вы относитесь к тому, что в результате синтеза сигнал reset поступает на входы ena триггеров? В перемежку с нормальным. А клок один. Quote Share this post Link to post Share on other sites More sharing options...
SM 13 May 11, 2009 Posted May 11, 2009 · Report post А как Вы относитесь к тому, что в результате синтеза сигнал reset поступает на входы ena триггеров? Ну я по крайней мере нормально. Так как изначально по описанию резет синхронный, то для того, чтобы резетнуть среднефпгашный триггер, нужно к приходу клока разрешить запись в него подачей единицы на ena и подать ноль на вход данных. А специальных вход sclr не везде есть, да и синтезаторы не всегда любят его юзать по прямому назначению. Quote Share this post Link to post Share on other sites More sharing options...
Des333 0 May 11, 2009 Posted May 11, 2009 (edited) · Report post 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 May 11, 2009 by des333 Quote Share this post Link to post Share on other sites More sharing options...
sazh 9 May 11, 2009 Posted May 11, 2009 · Report post Ну я по крайней мере нормально. Так как изначально по описанию резет синхронный, то для того, чтобы резетнуть среднефпгашный триггер, нужно к приходу клока разрешить запись в него подачей единицы на ena и подать ноль на вход данных. А специальных вход sclr не везде есть, да и синтезаторы не всегда любят его юзать по прямому назначению. В проекте группа триггеров, по одному фронту клока. На всех подан ресет. Но одна группа -на aclr, другая на ena Такое обычно бывает, кода не описаны сигналы в состояниях, когда это необходимо. При комбинаторике при описании автоматов лачи получаются. Следовательно вряд ли товарищ делал то, чего хотел на самом деле. Quote Share this post Link to post Share on other sites More sharing options...
SM 13 May 11, 2009 Posted May 11, 2009 · Report post Но одна группа -на aclr, другая на ena На aclr? Это действительно странно. Процесс синхронный по одному клоку, резета в списке чувствительности нет, не должно быть aclr-а, никак не должно... При комбинаторике Да, при комбинаторике (always_comb или always @*) согласен, во избежание латчей важно описать все пути, но к имеющемуся always @(posedge smclk) это отношения не имеет, это не комбинаторный always. Quote Share this post Link to post Share on other sites More sharing options...
sazh 9 May 11, 2009 Posted May 11, 2009 · Report post На aclr? Это действительно странно. Процесс синхронный по одному клоку, резета в списке чувствительности нет, не должно быть aclr-а, никак не должно... я не анализировал. (В одном процессе по фронту клока я все условия работы счетчика один раз описываю).Скачал и посмотрел rtl Quote Share this post Link to post Share on other sites More sharing options...
Des333 0 May 11, 2009 Posted May 11, 2009 (edited) · Report post А что - квартусу и слова "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 May 11, 2009 by des333 Quote Share this post Link to post Share on other sites More sharing options...
SM 13 May 11, 2009 Posted May 11, 2009 · Report post Насколько помню, в Quartus это даже на warning не тянет. :) Не, аж на жирный еррор. Ради интереса проверил. По крайней мере в Q8.0 Quote Share this post Link to post Share on other sites More sharing options...
Des333 0 May 11, 2009 Posted May 11, 2009 · Report post Учитывая следующие пункты: 1) Одновременное использование blocking and non-blocking assignments 2) Разное функциональное воздействие сигнала reset 3) Мелочи, вроде использования begin/end для обрамления одной строки кода в одном случае и не использования в другом Мне кажется, что либо автор действительно не понимал, что пишет, либо он был очень небрежен, либо просто это коду "тысяча лет" и, в любом случае, как Coding Style от Altera его в коем случае не стоит. Quote Share this post Link to post Share on other sites More sharing options...