2015-09-18 3 views
0

Я написал свои тестовые файлы в «tc1.v» и «tc2.v». Испытательные случаи выполняются в виде задач. например:Как запустить несколько тестовых файлов в verilog?

//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 

Проблема заключается в том, что я хочу запускать контрольные образцы для каждого постажежного времени. Если я включу «ifdef part in always block», modelsim выдаст ошибку. В любом случае, я могу это достичь?

ответ

0

Из вашего кода выше, все `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 
+0

Благодаря ННГ :) Вы спаситель все время! Если я использую 'define macro, modelsim говорит, что TESTCASE не определен. Итак, я определил его как параметр, и он сработал. – ssgr

+0

Ты прав, я сделал кучу опечаток; они теперь исправлены, если вы хотите использовать макрос (макросы легче определить в командной строке). Но параметр - еще один хороший вариант :) – Unn

1

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

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

Вы можете запустить симулятор, как этот <simulator> +TESTNAME=tc1

В коде TestBench вы извлечете АСМАП аргумент

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