Почему симулятор застрял в Vivado - PullRequest
0 голосов
/ 29 апреля 2020

Я пытался разработать запасной код памяти, но симуляция застряла в vivado. Я не могу точно сказать, застрял он или нет, но симуляция не запущена. Я приложил изображение для проблемы, которую я не могу четко express. Тестовый стенд кода идет здесь. При попытке получить смоделированную форму волны, vivado не дает симуляции, в то время как он полностью работает в Icarus Verilog, и формы волны симуляции ясны в волне GTK.

module trial_tb;

      reg clk;
      reg rst_n;
      reg bist_enable;
      reg we;
      reg \[5:0\] wraddr;
      reg data_in;
      reg re;
      reg \[5:0\] rdaddr;

      wire data_out; 
      wire repair_fail;
      wire repair_finish;

      integer m;
      integer idx;

      SRAM_repair uut (clk, rst_n, bist_enable, we, wraddr, data_in, re, rdaddr, data_out, repair_fail, repair_finish);

      initial
      begin
        clk = 0;  
        rst_n <= 0;
        bist_enable <= 0;
        rdaddr <= 'b0;
        wraddr <= 'b0;
        we <= 1'b0;
        re <= 1'b0;
        data_in <= 1'b0;

        #5.0 rst_n <= 1;
        #5.0 bist_enable <= 1;
        #52.9 bist_enable <= 1'b0;


        we <= 1'b1; 
        data_in <= 1'b0;

        for ( m=0 ; m<=32; m=m+1) begin
        wraddr <= m;
        #0.2;
        end

        data_in <= 1'b1;

        for ( m=33 ; m<=63; m=m+1) begin
        wraddr <= m;
        #0.2;
        end

        #0.2;
        we <= 1'b0;
        re <= 1'b1;

        for ( m=0 ; m<64; m= m+1) begin
        rdaddr <= m;
        #0.2;
        end

      end

      initial 
      begin
        $dumpfile ("SRAM_repair.vcd");
        $dumpvars( 0, trial_tb);
       // $dumpvars( 0, trial_tb.uut.i_bisr_controller.fcr\[0\]);
       // $dumpvars( 0, trial_tb.uut.i_bisr_controller.fcr\[1\]);
      //  $dumpvars( 0, trial_tb.uut.i_bisr_controller.fcr\[2\]);
      //  $dumpvars( 0, trial_tb.uut.i_bisr_controller.fcr\[3\]);
      //  $dumpvars( 0, trial_tb.uut.i_bisr_controller.fcr\[4\]);
     //   $dumpvars( 0, trial_tb.uut.i_bisr_controller.fcr\[5\]);
        #90 $finish;
      end

      always #0.1 clk = ~clk;
    endmodule

vivado gui

1 Ответ

4 голосов
/ 29 апреля 2020

Я подозреваю, что вы не использовали правильные временные рамки для задержек в вашем тестовом стенде. Из стандарта IEEE 1800-2017, раздел 22.7 `timescale :

Если не указан` timescale или он был сброшен с помощью директивы `resetall, единицы времени по умолчанию и точность указана для инструмента c.

Если не указано, мой симулятор по умолчанию:

`timescale 1ns/1ns

Я вижу зависание симуляции в момент времени 0, как я думаю, что вы делаете , Поскольку точность по времени равна единице времени (для меня оба 1ns), задержка 0,1 для clk округляется до 0, что приводит к бесконечному l oop в блоке clk always .

Я исправил это, добавив эту явную шкалу времени перед модулем:

`timescale 1ns/100ps

Это устанавливает точность меньше единицы, позволяя clk правильно переключаться.

Расхождение, которое вы видите между Vivado и Icarus, вероятно, является результатом использования разных временных шкал. Чтобы узнать, какая временная шкала действует, добавьте этот код в свой стенд:

initial $printtimescale;
...