Как запустить несколько тестовых случаев в Verilog?

Я написал свои тестовые примеры в «tc1.v» и «tc2.v». Тестовые случаи представлены в виде задач. Например:

//tc1.v

task tc1(input reg [31:0] j,input reg Reset,output reg dataValidIn);

 //logic
endtask

//tc2.v

task tc2(input reg [31:0] counter,input reg Reset,output reg dataValidIn);

//logic

endtask


module top_test;

  //inputs and outputs
  //logic

   `ifdef testcase1
      `include "tc1.v";
   `else 
     `include "tc2.v"
   `endif


endmodule

Проблема в том, что я хочу запускать тестовые наборы для каждых часов posege. Если я включу часть ifdef в блок always, modelsim выдаст ошибку. Могу ли я в любом случае добиться этого?


person ssgr    schedule 18.09.2015    source источник


Ответы (2)


Из приведенного выше кода все, что включает в себя `include, - это объявление задачи, а не фактический вызов задачи. Где-то еще в вашем коде у вас должно быть что-то вроде tc1(x, y, z);, вызываемого в блоке initial или always. Кроме того, чтобы сделать это более расширяемым, я рекомендую не включать условно объявления задач и оставлять вызов для определения того, какую задачу запускать. Таким образом, вы можете просто добавить нужный код при вызове задачи, а не при включении задачи:

// Have a macro for your test case, you can also declare this in the commandline
`define TESTCASE 1

module top_test;
  ...
  `include "tc1.v"
  `include "tc2.v"
  ...
  always @(posedge clk) begin
    // Switch on the test case to determine which to use
    // NOTE THAT IF THE TASK TAKES LONGER THAN 1 CLOCK CYCLE TO COMPLETE, THIS WILL NOT WORK FOR A TASK PER CLOCK
    case (`TESTCASE)
     1: tc1(...);
     2: tc2(...);
     default: begin
       $display("ERROR: Bad Testcase supplied %d", `TESTCASE);
       $finish;
     end
   endcase
 end
 ...
endmodule
person Unn    schedule 18.09.2015
comment
Спасибо, Унн :) Ты всегда спасаешь! Если я использую макрос `define, modelsim говорит, что TESTCASE не определен. Итак, я определил его как параметр, и это сработало. - person ssgr; 18.09.2015
comment
Вы правы, я сделал кучу опечаток; теперь они исправлены, если вы хотите использовать макрос (макросы легче определить в командной строке). Но параметр - еще один хороший вариант :) - person Unn; 18.09.2015

Другое решение, которое я использую, — использовать переключатель времени выполнения, чтобы указать тестовый пример для симулятора. Это избавляет вас от необходимости перекомпилировать ваш тест/дизайн для каждого теста, и вы можете запускать все свои тесты в пакетном режиме без перекомпиляции.

В Verilog есть системный вызов $value$plusargs (string, variable), который может извлекать любую переменную из аргументов симулятора. Вы можете использовать это для извлечения имени теста и использовать оператор if или case для выбора между различными источниками, как в приведенных выше ответах.

Запустить симулятор можно так <simulator> +TESTNAME=tc1

В вашем тестовом коде вы должны извлечь аргумент TESTNAME

if ($value$plusargs("TESTNAME=%s", testname)) begin
  $display("Running test %0s.", testname);
  if (testname == "tc1")
    `include "tc1.v"
  else if (testname == "tc2)
    `include "tc2.v"
end
person Jason Yu    schedule 18.09.2015