Nano Hash - криптовалюты, майнинг, программирование

Verilog несколько одновременных независимых назначений сигналов в тестовой среде

В VHDL я могу написать это в своем тестовом стенде:

    signal clk      : std_logic := '0';
    signal count_in     : std_logic_vector(3 downto 0) := "0000";
    signal load     : std_logic := '0';
    signal reset        : std_logic := '0';
    signal count_out    : std_logic_vector(3 downto 0)  := "0000";
    ...

    clk <= not clk after 50 ns;
    reset <= '1' after 1400 ns, '0' after 1900 ns;
    count_in <= "1010" after 2500 ns;
    load <= '1' after 2700 ns, '0' after 3000 ns;

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

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

Теперь мой вопрос: как мне перевести приведенный выше код для стимула DUT в Verilog? Я ожидаю, что буду использовать оператор assign с несколькими значениями #delay. Это правильно? Как это сделать?

02.06.2014

Ответы:


1

В Verilog 2001 и выше вы можете инициализировать переменные после объявления, например VHDL. Другой интересный, но, возможно, менее распространенный способ сделать это - использовать блок fork-join с блокирующими назначениями. В следующем коде каждая строка в блоке fork-join выполняется независимо и одновременно.

module test;
    reg clk, load, reset;
  reg [3:0] count_in, count_out;
    initial 
    begin
        fork 
            begin clk   = 0;        while (1) #50 clk = ~clk;               end 
            begin count_in  = 0;    #2500 ; count_in = 4'b1010;             end
            begin load      = 0;    #2700 ; load = 1 ; #3000; load = 0;     end
            begin reset = 0;        #1400 ; reset = 1; #1900; reset = 1;    end
            count_out   = 0;
        join
    end
endmodule

Рабочий пример на edaplayground.

Также обратите внимание, что сигнал clk в вашем коде переключается только один раз. Немного доработал, чтобы часы шли бесконечно.

02.06.2014
  • хм .. Ничего похожего на fork-join в VHDL не вижу. Я думал, что это что-то особенное для systemverilog. 02.06.2014
  • Насколько мне известно, в VHDL нет fork-join, но он существовал в Verilog со времен Verilog-95. SystemVerilog расширил его, добавив join_any и join_none. Обратите внимание, что fork-join - очень мощная конструкция, но она не синтезируется и может усложнить отладку. 02.06.2014

  • 2

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

    Эквивалент Verilog будет выглядеть примерно так:

    reg clk = 1'b0;
    reg [3:0] count_in = 4'b0000;
    reg load = 1'b0;
    reg reset = 1'b0;
    wire [3:0] count_out; // test bench is not driving this
    ...
    
    initial begin
      clk <= #50 !clk;
      reset <= #1400 1'b1;
      reset <= #1900 1'b0;
      count_in <= #2500 4'b1010;
      load <= #2700 1'b1;
      load <= #3000 1'b0;
    end
    

    При этом будет сгенерирована такая же форма сигнала, за исключением того, что count_out будет плавающим вместо всех нулей. Согласно соглашению об именах, я считаю, что count_out должен управляться тестируемым устройством, которое должно быть проводным.

    SystemVerilog может выглядеть примерно так:

    /* Note: bit cannot be X or Z
     * initializes equivalent to 'logic clk = 1'b0;' or 'reg clk = 1'b0;'
     */
    bit clk; 
    bit [3:0] count_in;
    bit load;
    bit reset;
    wire [3:0] count_out; // logic type is also okay
    ...
    
    initial begin
      clk <= #50ns !clk;
      reset <= #1400ns 1'b1;
      reset <= #1900ns 1'b0;
      count_in <= #2500ns 4'b1010;
      load <= #2700ns 1'b1;
      load <= #3000ns 1'b0;
    end
    

    Рабочий пример Verilog и System Verilog здесь

    02.06.2014
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

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

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..