Verilog testbench (с циклом for) для 3-8 значение сигнала декодера не обновляется

Я новичок в верилоге. Пишу декодер 3-8 и тестбенч для него. Это 38_decoder_tb.v:

module decoder_38(input [2:0] in, output reg [7:0] out);
always @* begin
  case (in) //Switch based on concatenation of control signals
    3'b000 : out = 8'b00000001;
    3'b001 : out = 8'b00000010;
    3'b010 : out = 8'b00000100;
    3'b011 : out = 8'b00001000;
    3'b100 : out = 8'b00010000;
    3'b101 : out = 8'b00100000;
    3'b110 : out = 8'b01000000;
    3'b111 : out = 8'b10000000;
  endcase
end
endmodule

Это 38_decoder_tb.v:

`timescale  1ns / 1ns

module tb_decoder_38;

// decoder_38 Parameters
parameter PERIOD  = 20;

// decoder_38 Inputs
reg   [2:0]  in                           ;

// decoder_38 Outputs
wire  [7:0]  out                           ;  
reg clk;
integer i;


initial
begin
    clk = 0;
    forever #(PERIOD/2)  clk=~clk;
end

decoder_38  u_decoder_38 (
    .in                      ( in   [2:0] ),

    .out                     ( out  [7:0] )
);

initial
begin
in = 0;
#(PERIOD*2);
    for (i = 3'd0; i < 3'd8; i=i+1) begin
    in = i;
   #PERIOD;     
    end
end

endmodule

Я стимулирую модуль тестового стенда с помощью ModelSim 10.5. Как видите, сигнал просто не обновляется. В чем проблема? Это как-то связано с циклом for?

3'd8 превышает 3 бита. Это будет рассматриваться как 0. Вы можете изменить это на 8.

sharvian 12.02.2023 03:23

@sharvian Спасибо. После того, как я исправил эту ошибку, он все еще не работает.

Tokubara 12.02.2023 03:49

@sharvian Извините, я ошибся. Я только перекомпилировал файл тестбенча, так что волна не изменилась. Но если я скомпилирую все, все работает нормально.

Tokubara 13.02.2023 14:47
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
3
71
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Опубликованный тестовый стенд имеет бесконечный цикл из-за вечного цикла, который ничто не может остановить.
Я добавил задержку #30, чтобы увидеть последние часы данных, и $finish, чтобы остановить их. После этого код ведет себя так, как ожидалось.
Все 4 симулятора на EDA Playground показывают одно и то же.

initial
begin
in = 0;
#(PERIOD*2);
  for (i = 3'd0; i <= 3'd7; i=i+1) begin
    in = i;
    #PERIOD;     
  end
  //
  #30;
  $finish;
end    

Вот ссылка на игровую площадку, которую я собрал https://www.edaplayground.com/x/aZYL

Спасибо. Ваш код работает нормально. Но если я добавлю $finish, modelsim просто выйдет. Я предполагаю, что modelsim отличается от iverilog.

Tokubara 13.02.2023 14:49
Ответ принят как подходящий

Да, проблема в шлейфе.

Ваша проблема в определении 3'd8. 8 совпадает с 1000 в двоичном представлении и требует 4 бита. Следовательно, 3 бита (как вы просили) дают 000. В результате ваш цикл вообще не запускается и выглядит следующим образом: for (i = 3'd0; i < 0; i++).

Переменная i определяется как integer. Тип integer — это тип данных с 4 состояниями, 32-битное целое число со знаком. Итак, переписывание цикла как for(i = 0; i < 8; i++) решит ваши проблемы. Нет абсолютно никакой необходимости определять размеры констант в этом цикле.

И, чтобы избежать бесконечного цикла, вам нужно использовать $finish, когда это уместно, как это предлагается в другом ответе.

Спасибо. for(i = 0; i < 8; i++) это решение. Но если я добавлю $finish, modelsim просто выйдет.

Tokubara 13.02.2023 14:46

Другие вопросы по теме