Как мне написать этот тестовый стенд Verilog? - PullRequest
0 голосов
/ 27 сентября 2018

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

Оригинальный FSM

module testbench();
     reg X_tb, clk_tb, rstn_tb;
     wire S_tb, V_tb;

     statemachine statemachine_tb(X_tb, clk_tb, rstn_tb, S_tb, V_tb);

     initial begin
          #10 X_tb = 0;
     end
endmodule

Если X_tb и clk_tb являются входами, а S_tb и V_tb являются выходамиКак мне включить синхронизацию для S_tb и V_tb?Я продолжаю получать сообщение о том, что не могу использовать wire переменные.Любая помощь будет принята с благодарностью!

Ответы [ 2 ]

0 голосов
/ 02 октября 2018

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

@ (negedge clk_tb) 

Затем вы можете захватить выходные данные или напрямую выполнить сравнение с ожидаемыми значениями.Затем измените входной стимул и дождитесь следующего фронта тактового сигнала и повторите следующее сравнение.

0 голосов
/ 28 сентября 2018

S_tb и V_tb - это ожидаемые выходные данные, которые определяются модулем проектирования, который в данном случае является "машиной состояний".Испытательный стенд охватывает дизайн, он служит стимулом для вашего дизайна.В этом случае вы будете применять входные данные, такие как

initial
begin
 rstn_tb = 0; //assuming an active low reset
 clk_tb  = 0;
 #10 X_tb = 0;
end
always  
#5 clk_tb = ~clk_tb; //generates a clock having a frequency of 100MHz

. Вышеуказанные входные данные передаются на модуль состояния машины, и в ответ на это модуль состояния машины генерирует некоторый результат, который принимается в портах S_tb & V_tb.

Кроме того, при создании экземпляра модуля лучше использовать соглашение об именах точек, например

module half_add(a,b,sum,carry); //half adder, partially written
 input a,b;
 output sum,carry;
 //logic
 endmodule

module full_add(a,b,cin,sum,carry)
 input a,b,cin;
 output sum,carry;
 //wires are not declared
 //instantiating half_add
 half_add h1(.a(w1),
        .b(w2),
        .sum(sum1),
        .carry(carry1)
    );

half_add h2(
 //similar call as h1 instance
   );
endmodule

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

half_add h1(w1,
        w2,
        sum1,
        carry1
);

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

half_add h1(w1,
        w2,
        carry1,
        sum1
);

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

...