Jump to content
    

VERILOG, тест бенч и не только

Простите, что мешаю защёлками мерится, но вот такой вот вопросик проясните пожалуйста.

...Подскажите ещё. Вот возьмём такую конструкцию в VHDL:

process(clk)
begin 
if clk'event and clk = '1' then
if en = '1' then 
a <= b;
end if;
end if;
end process;

Если a - сигнал, то на первом фронте тактового сигнала произойдёт проверка if en = '1'. А присвоение a <= b произойдёт на следующем фронте. Если же a- переменная, и выражение переписать как a:=b, то проверка и присвоение произойдёт на одном и том же фронте. А в verilog есть что то подобное?

 

Share this post


Link to post
Share on other sites

process(clk)
begin 
if clk'event and clk = '1' then
if en = '1' then 
a <= b;
end if;
end if;
end process;

Если a - сигнал, то на первом фронте тактового сигнала произойдёт проверка if en = '1'. А присвоение a <= b произойдёт на следующем фронте.

С чего вы взяли? Приходит фронт клока. Проверили en. Если да, то a <= b. Никаких первых и вторых фронтов.

Share this post


Link to post
Share on other sites

Вот это как раз пример кода "как делать не стОит". В данном примере получится латч. Почему - догадайтесь сами...

 

Теперь Вам вопрос -- на сколько процентов Вы уверены в том, что получится латч?

 

 

P.S.

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

 

И, самое главное, хочу понять, что ими движет.

 

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

Либо они понимают, что не специалисты, но это не останавливает их от советов.

Share this post


Link to post
Share on other sites

С чего вы взяли? Приходит фронт клока. Проверили en. Если да, то a <= b. Никаких первых и вторых фронтов.

Я не правильно выразился... Я имел в виду момент изменения сигнала en. Как на картинке, то, что описано кодом:

elsif CLK'event and CLK = '1' then
  if clk_div_en = '1' then
    if rise_flag = '1' then
      SCLK <= '1';
........................................

Если бы SCLK был бы переменной, то он перешёл бы в высокое состояние в момент, на котором установлена метка. Т.е. в момент изменения сигнала rise_flag.

post-64451-1480332499_thumb.jpg

Edited by Грендайзер

Share this post


Link to post
Share on other sites

Если бы SCLK был бы переменной, то он перешёл бы в высокое состояние в момент, на котором установлена метка. Т.е. в момент изменения сигнала rise_flag.
Да в общем-то нет. В данном коде неважно, что такое SCLK -- сигнал или переменная.

Share this post


Link to post
Share on other sites

На всякий случай.

Что получится при синтезе always-блока, не зависит от синтаксиса always_comb/always_ff, а только от содержимого блока.

Например, синтез классического регистрового счетчика с always_comb - в Квартусе даже варнингов не будет:

module top(clk,cnt);
input clk;
output [3:0] cnt;
always_comb begin
    cnt++;
    @(posedge clk)$display("hello");
end
endmodule

 

Share this post


Link to post
Share on other sites

Этот вопрос меня насторожил - неужели в VHDL нет аналога Верилоговского блокирующего и неблокирующего присваивания?

VHDL не знаю, сейчас посмотрел поверхностно - вроде как <= для сигналов, и := для переменных и являются аналогами неблокирующего и блокирующего присваиваний.

Так это, или нет?

Был бы благодарен, если кто-то даст сравнение VHDL и Verilog по блокирующим/неблокирующим присваиваниям - в плане принципиальных отличий.

 

В VHDL любой сигнал можно использовать, как для последовательной логики, так и для комбинаторной. При этом для присвоения всегда будет использоваться один и тот же символ - "<=". Но, если мы хотим в описании процесса использовать для удобства промежуточный сигнал или добавить дополнительную комбинаторную логику между двумя регистрами, то используем variable и ":=" для присвоения.

 

Share this post


Link to post
Share on other sites

В VHDL любой сигнал можно использовать, как для последовательной логики, так и для комбинаторной. При этом для присвоения всегда будет использоваться один и тот же символ - "<=". Но, если мы хотим в описании процесса использовать для удобства промежуточный сигнал или добавить дополнительную комбинаторную логику между двумя регистрами, то используем variable и ":=" для присвоения.

Понятно, спасибо.

Попробовал еще синтез простых схем в VHDL, сложилось такое впечатление:

 

1) В VHDL отсутствует деление последовательных блоков на комбинационные и регистровые, как в SV. В VHDL в одном последовательном блоке можно смешивать комбинационные и регистровые присваивания, в SV такое невозможно даже для разных цепей.

 

2) В VHDL сигналы(внешние цепи) допускают только отложенные присваивания, переменные(внутренние цепи) - только немедленные. В SV все цепи допускают или отложенные, или немедленные присваивания (те без смешивания для одной цепи).

 

3) В VHDL в одном последовательном блоке можно смешивать комбинационные и регистровые присваивания одним и тем-же переменным, в SV такое невозможно.

 

Получается, отличия принципиальные (те не только синтаксические), и в целом у VHDL гораздо больше гибкости, чем у SV.

 

 

В SV ничего похожего нет, только разносить комбинационные и регистровые присваивания по разным always-блокам

(взял template из Квартуса, и поменял код):

library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;

entity top is
    generic (
        MIN_COUNT : natural := 0;
        MAX_COUNT : natural := 15
    );
    port (
        clk          : in std_logic;
        a,b,c,d      : in integer range MIN_COUNT to MAX_COUNT;
        qwire      : out integer range MIN_COUNT to MAX_COUNT;    
        qreg      : out integer range MIN_COUNT to MAX_COUNT
    );
end entity;

architecture rtl of top is
begin
    process (clk,a,b,c,d) 
        variable cnt : integer range MIN_COUNT to MAX_COUNT;    
    begin
        if rising_edge(clk) then 
            cnt := a+b; 
        end if;        
        qreg <= cnt;
        cnt := c+d;
        qwire <= cnt; 
    end process;
end;

Edited by Leka

Share this post


Link to post
Share on other sites

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

 

И, самое главное, хочу понять, что ими движет.

 

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

Либо они понимают, что не специалисты, но это не останавливает их от советов.

Чтобы разобраться. Выкладывая свое видение предмета, проще обнаружить изъяны.

 

 

Еще немного поигрался с VHDL (писать на нем не собираюсь, просто решил расширить кругозор по разным методикам описания схем).

Мультиплексор, задерживающий сигнал на 0/1/2 такта - все в одном process:

library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;

entity top is
    port (
        clk,d,s1,s2    : in std_logic;
        q        : out std_logic
    );
end entity;

architecture rtl of top is
begin
    process (all) 
        variable q1,q2 : std_logic;    
    begin
        if rising_edge(clk) then q1 := d; end if;        
        if rising_edge(clk) then q2 := q1; end if;
        q <= d;        
        if s1 then q <= q1; end if;
        if s2 then q <= q2; end if;
    end process;
end;

 

Другая запись - с сигналами. Получается, что если не обращать внимания на синтаксис, VHDL == Verilog без always.

library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;

entity top is
    port (
        clk,d,s1,s2    : in std_logic;
        q        : out std_logic
    );
end entity;

architecture rtl of top is
    signal  q1,q2 : std_logic;
begin
    process (all) 
    begin
        if rising_edge(clk) then q1 <= d; end if;        
        if rising_edge(clk) then q2 <= q1; end if;
        q <= d;        
        if s1 then q <= q1; end if;
        if s2 then q <= q2; end if;
    end process;
end;

Edited by Leka

Share this post


Link to post
Share on other sites

Другая запись - с сигналами. Получается, что если не обращать внимания на синтаксис, VHDL == Verilog без always.

Аналогом always является process. Аналогом @(posedge clk) является wait until rising_edge(clk). А вот аналога if rising_edge(clk) в Верилоге нет и не может быть из-за отсутствия концепции сигналов, хранящих состояние, бывшее в предыдущем дельта-цикле. Зато Верилог симулируется в 10 раз быстрее:).

Share this post


Link to post
Share on other sites

Чтобы разобраться. Выкладывая свое видение предмета, проще обнаружить изъяны.

 

Если хочется разобраться нужно спрашивать, а не утверждать.

 

Хотя бы предупреждать, что в своем видении на 100% не уверены.

 

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

 

Share this post


Link to post
Share on other sites

    if rising_edge(clk) then q1 := d; end if;        
    if rising_edge(clk) then q2 := q1; end if;

Квартус и с переменными синтезирует цепочку триггеров (полный код давал в предыдущем посте).

Ошибок при симуляции сложного проекта не будет в VHDL с таким кодом с переменными?

Edited by Leka

Share this post


Link to post
Share on other sites

    if rising_edge(clk) then q1 := d; end if;        
    if rising_edge(clk) then q2 := q1; end if;

Квартус и с переменными синтезирует цепочку триггеров (полный код давал в предыдущем посте).

Ошибок при симуляции сложного проекта не будет в VHDL с таким кодом с переменными?

При симуляции будет ошибка, так как значение d одновременно присвоится переменным q1 и q2 в одном дельта-цикле. Надо строчки поменять местами, тогда никаких проблем с симуляцией не будет.

Также это может создать ошибки при синтезе, так как использован нестандартный способ описания регистров, который может "удивить" синтезатор:).

Share this post


Link to post
Share on other sites

При симуляции будет ошибка, так как значение d одновременно присвоится переменным q1 и q2 в одном дельта-цикле. Надо строчки поменять местами, тогда никаких проблем с симуляцией не будет.

Также это может создать ошибки при синтезе, так как использован нестандартный способ описания регистров, который может "удивить" синтезатор:).

Спасибо, ответы очень помогли.

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

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