Как передать имя сигнала через $ value $ plusargs в системном verilog - PullRequest
0 голосов
/ 04 ноября 2019

Я пишу утверждения в системном verilog. Эта проверка утверждения для сигнала «lock», который передается в качестве тестового аргумента через переключатель $ value $ plusargs как GPIO_SEL = «test_bench.gpio»

Итак, мой код:

module ab 
string abc;
$value$plusargs("GPIO_SEL=%s" , abc);
reg lock;
always @* 
begin
lock = abc;
end

endmodule

Проблема здесь в том, что блокировка сигнала не получает значение как test_bench.gpio. Есть ли способ передать это значение сигнала из testplaus args

Ответы [ 2 ]

1 голос
/ 04 ноября 2019

SystemVerilog - это скомпилированный язык , не интерпретируемый . Вы не можете получить доступ к идентификаторам напрямую, используя строку. Вы можете использовать директивы компилятора в командной строке

module ab;

  bit  lock;
  always_comb
      begin
   lock = `GPIO_SEL;
  end

endmodule

Затем при компиляции кода используйте переключатель +define

vlog your_file.sv +define+GPIO_SEL=test_bench.gpio

Если вы думаете, что перекомпилируете ваш testbench /dut является значительным бременем (большинство инструментов предлагают опции инкрементальной компиляции), и у вас есть фиксированное количество путей доступа, тогда вы можете использовать оператор case

module ab 
string abc;
initial $value$plusargs("GPIO_SEL=%s" , abc);
reg lock;
always_comb
    case (abc)
      "test_bench.gpio": lock = test_bench.gpio;
      "test_bench.gpio1": lock = test_bench.gpio1;
    endcase

end

И вы можете просто использовать вместо него простое числостроки для выбора.

0 голосов
/ 04 ноября 2019

Похоже, вам нужно преобразовать строку в целочисленный тип. Посмотрите на функции преобразования строк: atoi, atobin, ...

например

 module parg;
   string abc;
   bit [3:0] sig;
   initial begin
      $value$plusargs("GPIO_SEL=%s" , abc);
      sig = abc.atoi();
      $display("sig = %b", sig);
   end
endmodule // parg
...