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

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 есть что то подобное?

 

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


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

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. Никаких первых и вторых фронтов.

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


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

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

 

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

 

 

P.S.

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

 

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

 

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

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

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


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

С чего вы взяли? Приходит фронт клока. Проверили 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

Изменено пользователем Грендайзер

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


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

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

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


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

Хм, быть может я что то перепутал. Как только появится время проэксперементирую.

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


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

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

Что получится при синтезе 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

 

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


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

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

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

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

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

 

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

 

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


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

В 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;

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

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


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

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

 

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

 

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

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

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

 

 

Еще немного поигрался с 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;

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

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


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

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

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

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


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

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

 

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

 

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

 

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

 

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


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

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

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

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

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

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


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

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

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

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

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

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

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


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

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

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

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

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

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


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

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

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

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

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

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

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

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

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

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