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

Реализация (моделирование) счётчика на VHDL или (System)Verilog со (или без) сбросом

Всем добра.

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

Берём модуль на VHDL
 

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

entity n_f0 is
    Port ( clk     : in  std_logic;
           n       : in  integer range 0 to 2 ** 24 - 1;
           clk_out : out std_logic
); end n_f0;

architecture Behavioral of n_f0 is

    signal count : unsigned (23 downto 0) := (others => '0');
    signal c_out : std_logic := '0';
    
begin

    report_proc: process begin
        report "Invoked n_f0.vhd";
        wait;
    end process report_proc; 
    
	clk_proc : process (clk) begin
        if rising_edge(clk) then
            count <= count + to_unsigned(n,24);
            c_out <= count(23);
            clk_out <= '1' when count(23) = '1' and c_out = '0' else '0';
        end if;
	end process clk_proc;
    
end Behavioral;

и его реинкарнацию на Verilog

module n_f0 (
 
    input           clk,    // input clk
    input [23 : 0]  n,      // divider
    output reg      clk_out // output
    
);

    initial $display("Invoked n_f0.v");

    reg    [23 : 0] count_v;
    reg    c_out_v;
    wire   count_v_msb;
    assign count_v_msb = count_v [23];
    
    always @ ( posedge clk ) begin
        count_v <= count_v + n; 
        c_out_v <= count_v_msb;
        clk_out <= count_v_msb && !c_out_v;    
    end

endmodule

С testnbench

module n_f0_tb;

    logic            clk;
    logic [23 : 0]   n;
    wire             clk_out;

    n_f0 n_f0_inst (
   
        .clk     ( clk     ),
        .n       ( n       ),
        .clk_out ( clk_out )
        
    );
    
    initial $display("Invoked n_f0_tb.sv");
    initial n = 2 ** 22;
    
    initial begin
        clk = 1'b0;
        forever # 8ns clk = ~clk; // 125MHz
    end    
        
endmodule : n_f0_tb

Моделирование VHDL варианта даёт
image.thumb.png.8ea107d1280375af620f3d07f6af0b3a.png

Т.е. всё работает (clk_out), а, вот, verilog вариант

image.png

молчит. Уверен на 100%, что дело в сбросе, но почему, скажите, VHDL вариант катит?

Установки симулятора, стандарт или что-то иное?

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


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

37 minutes ago, AnatolySh said:
    signal count : unsigned (23 downto 0) := (others => '0');
    signal c_out : std_logic := '0';
   

и его реинкарнацию на Verilog

    reg    [23 : 0] count_v;
    reg    c_out_v;

молчит. Уверен на 100%, что дело в сбросе, но почему, скажите, VHDL вариант катит?

что-то иное?

ну как бы не вооруженным глазом видно что код не эквивалентный

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


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

26 minutes ago, des00 said:

ну как бы не вооруженным глазом видно что код не эквивалентный

Да, спасибо:

    reg    [23 : 0] count_v = 0;
    reg    c_out_v = 0;

привело в соответствие. Откуда тогда я мог помнить о необходимости сброса всего и вся в начале работы?

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


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

3 minutes ago, AnatolySh said:

Откуда тогда я мог помнить о необходимости сброса всего и вся в начале работы?

да кто его знает, для моделирования своя кучка тонкостей, для ртл кода своя. по ртл Кен Чапмен в свое время хорошо написал статью  Get Smart About Reset: Think Local, Not Global 

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


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

3 часа назад, AnatolySh сказал:

Да, спасибо:

    reg    [23 : 0] count_v = 0;
    reg    c_out_v = 0;

привело в соответствие. Откуда тогда я мог помнить о необходимости сброса всего и вся в начале работы?

Можно найти документ, что без ресета триггеру не жить.

По мне, так этим надо пользоваться аккуратно. Если только синтезатор поддерживает начальную инициализацию регистра. И это обычно прописывается в документации. Если FPGA  (xilinx, altera) на базе статической ячейки памяти. Так и внутренний сброс по включению питания можно организовать.

Тогда ваша времянка моделирования будет соответствовать реальной.

А если структура флешь. Не будет соответствия. так что состояние 'x - это благо. 

7 минут назад, sazh сказал:

 

По мне, так этим надо пользоваться аккуратно. Если только синтезатор поддерживает начальную инициализацию регистра. И это обычно прописывается в документации. Если FPGA  (xilinx, altera) на базе статической ячейки памяти. Так и внутренний сброс по включению питания можно организовать.

Тогда ваша времянка моделирования будет соответствовать реальной.

А если структура флешь. Не будет соответствия. так что состояние 'x - это благо. 

 

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


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

рекомендую всегда заводить сброс. Хоть синхронный хоть асинхронный. Это часто дает более ожидаемый результат.

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


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

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

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

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

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

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

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

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

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

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