Альтернативные сигналы для тестового стенда без ручного ввода всех значений времени в iverilog

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

module TestExample;
reg a, b, c;

initial begin
    $dumpfile("test.vcd");
    $dumpvars(0, TestExample);

    # 0 a=0; b=0; c=0;
    # 10 a=1; b=0; c=0;
    # 20 a=0; b=1; c=0;
    # 30 a=1; b=1; c=0;
    # 40 a=0; b=0; c=1;
    # 50 a=1; b=0; c=1;
    # 60 a=0; b=1; c=1;
    # 70 a=1; b=1; c=1;
    # 80 a=0; b=0; c=0;

    # 90 $stop;
end
endmodule

Проблема с этим заключается в том, что когда я получаю больше сигналов (скажем, az вместо ab), потребуется очень много времени, чтобы вручную вводить каждый раз и связанное значение. Из-за этого мне интересно, есть ли способ автоматизировать сигналы. Например, если бы я мог сказать переключать свое состояние каждые 10 u-секунд для a, каждые 20 u-секунд для b и каждые 30 u-секунд для c?


person Tyler H    schedule 05.07.2017    source источник
comment
Рассматривали ли вы использование цикла for?   -  person Greg    schedule 05.07.2017


Ответы (2)


Как говорит Грег...

module TestExample;
wire a, b, c, d ...
integer i;

initial begin
    $dumpfile("test.vcd");
    $dumpvars(0, TestExample);
    for (i = 0; i < 1<<26; i=i+1)
        #10;
    $stop;
end

assign a = i[0], b = i[1], c = i[2], d = i[3] ... 

endmodule
person Matthew Taylor    schedule 05.07.2017
comment
Что делает 1<<26? и что такое a = i[0], b = i[1], c = i[2], d = i[3] - person Tyler H; 05.07.2017
comment
1 << 26 - это сдвиг влево на 26 позиций, то есть 2 в степени 26. Оператор assign присваивает элементы вектор i в wires a, b, c, d и т. д., как казалось требованием. - person Matthew Taylor; 05.07.2017
comment
Я лично предпочитаю подход конкатенации { ... , d, c, b, a} = i;, который может быть выполнен как оператор assign или внутри цикла for. - person Greg; 05.07.2017
comment
Хорошо, я написал следующий код: gist.github.com/Tyler-Hilbert/296e3576653836b8ac6fbc5afdf232c4 и запустил его, но получил следующую ошибку: TestExample.v:27: error: reg a; не может управляться примитивами или непрерывным присваиванием. TestExample.v:27: ошибка: reg b; не может управляться примитивами или непрерывным присваиванием. TestExample.v:27: ошибка: reg c; не может управляться примитивами или непрерывным присваиванием. 3 ошибки при разработке. Когда я пошел и поменял регистры на провода, все заработало. Что вызывает это? - person Tyler H; 05.07.2017
comment
@ user2417339 Операторы assign работают с wire, а не с reg. Измените a,b,c,... на тип wire или переместите присваивание внутрь цикла for. - person Greg; 05.07.2017

для общих шаблонов вы можете использовать несколько начальных блоков, скажем, по одному на переменную:

initial begin
   a = 0;
   forever begin
      #10 a = 1;
      #10 a = 0;
   end
end
initial
   b = 1;
   forever begin
      #30 b = 0;
      #30 b = 1;
   end
end
...
initial begin
    $dumpfile("test.vcd");
    $dumpvars(0, TestExample);

    #1000 $finish;
end
person Serge    schedule 05.07.2017