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

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

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

Сомневаюсь, это что-то, о чем сам автор поста говорил, что раньше что-то там считал.... Я так понимаю, что речь о третьем процессе, где смесь блокирующих и неблокирующих присваиваний...

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


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

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

Может я что не то проверяю, но данный кусок кода проходит без warning в 9.0 и 8.1

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 стоит - вроде без проблем такие вещи синтезирует.

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


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

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

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

Мне кажется, что либо автор действительно не понимал

Да там, блин, три вырезки из трех разных источников... Один, третий - альтерский, первый и второй вообще неизвестного происхождения... Как их можно друг с другом-то сравнивать и объединять?

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


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

Сомневаюсь, это что-то, о чем сам автор поста говорил, что раньше что-то там считал.... Я так понимаю, что речь о третьем процессе, где смесь блокирующих и неблокирующих присваиваний...

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

 

 

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

 

 

 

Да там, блин, три вырезки из трех разных источников... Один, третий - альтерский, первый и второй вообще неизвестного происхождения... Как их можно друг с другом-то сравнивать и объединять?

Все пункты я писал по поводу данного куска кода:

 

module statem_dyn_phase(smclk, reset, dyn_phase, counter, phasecounterselect, phaseupdown, phasestep, next_state, phasedone);

input smclk;
input reset;
input [2:0] counter;
input phasedone;
input [1:0] dyn_phase;

output [2:0] phasecounterselect;
output phaseupdown;
output phasestep;
output [1:0] next_state;

reg [2:0] phasecounterselect;
reg phaseupdown;
reg phasestep;
reg [1:0] state;
reg [1:0] next_state;
reg [2:0] count;
reg step;

parameter phase_up=2'b01, phase_down=2'b10, do_nothing=2'b00, up=1'b1, down=1'b0;

always @ (posedge smclk) 
 begin
     if (reset) 
         begin
         count <= 0;
         phasestep <= 1'b0;
         phaseupdown = 1'b0;
         end
     else
     begin
         if (state == phase_up) step = up;
         if (state == phase_down) step = down;
  
         if (state !=  do_nothing && count == 0 && phasedone) 
         begin
             phasestep <= 1'b1;
             count <= count + 1;
         end
         if (count == 1) 
         begin
             phaseupdown <= step;
             phasecounterselect = counter;
             count <= count + 1;
         end
         if (count == 2) 
         begin
             phasestep <= 1'b0;
             count <= count + 1;
         end
         if (count == 3) 
         begin
             phaseupdown <= 1'b0;
             phasecounterselect = counter;
             count <= count + 1;
         end
         if (count == 4) 
             count <= 0;
     end
 end 



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


always @(posedge smclk)
 begin
 case (dyn_phase)
     2'b01:
         next_state = phase_up;
     2'b10:
         next_state = phase_down;
     default:
         next_state = do_nothing;
 endcase
 end
endmodule

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


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

Да и на работе 8.0 стоит - вроде без проблем такие вещи синтезирует.

Значит Вы ему чего-то лишнего наотломали, кроме лицензии :) :)

 

код:

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

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

endmodule

 

лог:

Info: *******************************************************************
Info: Running Quartus II Analysis & Synthesis
    Info: Version 8.0 Build 231 07/10/2008 Service Pack 1 SJ Full Version
    Info: Processing started: Mon May 11 18:10:13 2009
Info: Command: quartus_map --read_settings_files=on --write_settings_files=off test2 -c test2
Info: Found 1 design units, including 1 entities, in source file test2.v
    Info: Found entity 1: test2
Error (10137): Verilog HDL Procedural Assignment error at test2.v(4): object "c" on left-hand side of assignment must have a variable data type File: /home/s-markov/work2/temp/test2.v Line: 4
Error (10137): Verilog HDL Procedural Assignment error at test2.v(5): object "c" on left-hand side of assignment must have a variable data type File: /home/s-markov/work2/temp/test2.v Line: 5
Error: Quartus II Analysis & Synthesis was unsuccessful. 2 errors, 0 warnings
    Error: Processing ended: Mon May 11 18:10:14 2009
    Error: Elapsed time: 00:00:01
    Error: Total CPU time (on all processors): 00:00:01

 

ну разумеется добавление слова "reg" после output решает все проблемы.

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


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

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

 

На жирный error, это если в Settings -> Analysis & Synthesis Settings -> Verilog HDL Input -> Verilog version стоит Verilog-2001, а если SystemVerilog-2005, то и без warning.

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


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

Все пункты я писал по поводу данного куска кода:

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

 

а если SystemVerilog-2005, то и без warning.

Да, в натуре. Я то 2001 ставлю, чтобы оно отсеивало случайные SV-шные штучки... А что, в стандарте это стало разрешено? Т.е. типа любой output по умолчанию reg/logic ?

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


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

Ну я и говорю, что перемешали три куска в кучу. Я все свои посты говорил про код, приведенный автором первого сообщения ниже его слов "Но периодически в примерах встречаю вот такое описание"...

 

Я тоже.  :)

 

 

Именно этот кусок и представляет интерес, так как является примеров Altera, и так как имеет "дефекты", которые я указывал выше.

 

Да и sazh, опять же, насчет reset писал про этот же кусок(если я правильно его понял)

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


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

Я тоже.  :)

Именно этот кусок и представляет интерес, так как является примеров Altera, и так как имеет "дефекты", которые я указывал выше.

Ну и какого же черта тогда там aclr? Если именно в том куске ОДИН блок always, а не три, и в нем только posedge smclk ?

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


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

Да, в натуре. Я то 2001 ставлю, чтобы оно отсеивало случайные SV-шные штучки... А что, в стандарте это стало разрешено? Т.е. типа любой output по умолчанию reg/logic ?

 

Я, к сожалению, пока так и не нашел страндарт на SV. Имеется только LRM, но на память, к сожалению, не скажу.

 

Ну и какого же черта тогда там aclr? Если именно в том куске ОДИН блок always, а не три, и в нем только posedge smclk ?

 

Как же один?

 

 

Я же приводил модуль целиком выше

 

1) always @ (posedge smclk) 
 begin
     if (reset) 
         begin
         count <= 0;
         phasestep <= 1'b0;
         phaseupdown = 1'b0;
         end
     else
 ...
...
...



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


3)
always @(posedge smclk)
 begin
 case (dyn_phase)
     2'b01:
         next_state = phase_up;
     2'b10:
         next_state = phase_down;
     default:
         next_state = do_nothing;
 endcase
 end

 

Кстати, у автора темы-то в первом посте все три куска из одного модуля-примера Altera :lol:

Изменено пользователем des333

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


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

но на память, к сожалению, не скажу.

Ну синопсис и в SV-режиме давится без "reg" :

Loading sverilog file '/home/s-markov/work2/temp/test2.v'
Detecting input file type automatically (-rtl or -netlist).
Reading with Presto HDL Compiler (equivalent to -rtl option).
Running PRESTO HDLC
Compiling source file /home/s-markov/work2/temp/test2.v
Error:  /home/s-markov/work2/temp/test2.v:4: Assigment to 'c' requires that it be a register. (VER-952)
Error:  /home/s-markov/work2/temp/test2.v:5: Assigment to 'c' requires that it be a register. (VER-952)
*** Presto compilation terminated with 2 errors. ***

 

Мда. Чем дальше в лес, тем больше вольностей. Квартус по ходу делает implicit объявления аутпутов типом reg (logic?).... А синопсис наверное как wire (как это было в классическом верилоге).

 

Как же один?

Я же приводил модуль целиком выше

....

Кстати, у автора темы-то в первом посте все три куска из одного модуля-примера Altera :lol:

 

Вот именно, что это Вы приводили модуль (который я первый раз увидел именно в вашем посте) :) А у автора после указанных слов был всего лишь один always...

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


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

Вот именно, что это Вы приводили модуль :) А у автора после указанных слов был всего лишь один always...

 

Просто я именно поэтому у автора и просил ссылку на документ.

 

 

Мне просто больше интересно, что из себя представляет модуль Altera целиком, а не разбитый по кускам.  :)

 

И именно в этом модуле куча неточностей. 

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


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

Если рассматривать код приведенного Вами модуля, то да, state имеет (наверное по ошибке) асинхронный резет... Но вряд-ли это заботило альтерского индуса, писавшего код :) Ведь работает же!

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


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

Если рассматривать код приведенного Вами модуля, то да, state имеет (наверное по ошибке) асинхронный резет... Но вряд-ли это заботило альтерского индуса, писавшего код :) Ведь работает же!

 

Просто автор может использовать данный код как пример. Надо предостеречь его от этого.  :)

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


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

Просто автор может использовать данный код как пример. Надо предостеречь его от этого.  :)

Это да. Но только не в части его основного вопроса - описывать в блоках always, описывающих регистры, надо только те пути, которые могут приводить к смене состояния описываемого регистра. Остальные же - только лишняя писанина, приводящая к запутанности, увеличению размера текста и ухудшению читаемости. Тоже касается описания в одном блоке always одновременно нескольких регистров. ИМХО идеально - один регистр один блок. А тут в целях, чтобы "враг не догадался", целых три (или 4) сущности в один always запиндюрили - счетчик и регистры его управления.

 

А вот касаемо резетов - то да, надо следить, чтобы резетовалось только то, что нужно резетовать, и именно так, как нужно (синхронно/асинхронно), причем выбор синхронного или асинхронного должен быть обоснованным. В этом примере тут явный необъяснимый ляп. И то же касается блокирующих/неблокирующих (на мой взгляд - всегда неблокирующие, за тем исключением, когда его применение приводит к неразумному разрастанию кода, но это уже чисто IMHO)

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


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

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

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

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

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

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

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

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

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

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