что означает «виртуальный» применительно к интерфейсу SystemVerilog? - PullRequest
0 голосов
/ 26 февраля 2020

Что означает «виртуальный tinyalu_bfm» в приведенном ниже коде SystemVerilog? пример:

        uvm_config_db #(virtual tinyalu_bfm)::set(null, "*", "bfm", bfm);

будет ли иметь значение, если я опущу виртуальное ключевое слово? Просто любопытно, потому что обычно oop значение виртуального применяется только к классам или членам класса, и вот пример, где его применяют к интерфейсу, передаваемому в функцию stati c, которая является частью пакета UVM ... просто хотел знаю, почему мне нужно назвать его вирулентным в этом случае и какова его цель сделать его виртуальным.

    module top;

        // UVM Framework
        import uvm_pkg::*;
        `include "uvm_macros.svh"

        import   tinyalu_pkg::*;       //import all tb classes and types

        tinyalu_bfm       bfm();

        // invoke APIs from uvm_pkg to start test...
        initial begin
            uvm_config_db #(virtual tinyalu_bfm)::set(null, "*", "bfm", bfm);

            run_test();  
        end

    endmodule : top
    interface tinyalu_bfm;

       byte         unsigned        A;
       byte         unsigned        B;
       bit          clk;
       bit          reset_n;

       initial begin
          clk = 0;
          forever begin
             #10;
             clk = ~clk;
          end
       end

       task reset_alu();
          reset_n = 1'b0;
          @(negedge clk);
          @(negedge clk);
          reset_n = 1'b1;
          start = 1'b0;
       endtask : reset_alu

      task send_op(input byte iA, input byte iB, input operation_t iop, output shortint alu_result);
           // ...       
       endtask : send_op

    endinterface : tinyalu_bfm

еще раз посмотрите ... объект интерфейса также объявлен виртуальным ... почему?

 // FILE: random_test.svh
    class random_test extends uvm_test;
        // ... 
        virtual tinyalu_bfm bfm;

        function new (string name, uvm_component parent);
            super.new(name,parent);
            if(!uvm_config_db #(virtual tinyalu_bfm)::get(null, "*","bfm", bfm))
                $fatal("Failed to get BFM");
        endfunction : new

        task run_phase(uvm_phase phase);
            //...
        endtask : run_phase

    endclass

Ответы [ 3 ]

2 голосов
/ 26 февраля 2020

SystemVerilog был создан для полной обратной совместимости с Verilog, за исключением того, что были зарезервированы новые ключевые слова. Таким образом, SystemVerilog повторно использует или максимально перегружает существующие ключевые слова, чтобы уменьшить раздувание ключевых слов. Ключевое слово virtual перед именем интерфейса означает, что вы объявляете тип переменной, который содержит дескриптор фактического экземпляра интерфейса, а не фактический экземпляр интерфейса,

1 голос
/ 26 февраля 2020

Аналогом virtual interface в обычных языках программирования является указатель или ссылка (на объект интерфейса). Он используется в качестве ссылки в компонентах тестового стенда системы verilog, передавая его в качестве аргументов функции или задачи или сохраняя его в классах или других местах.

Система verilog - это огромный язык, в котором много уродства. Ключевое слово virtual определенно используется слишком часто, как в этом случае. Там мог быть лучший выбор.

|

0 голосов
/ 27 февраля 2020

Я предлагаю следующий определяющий макрос, чтобы компенсировать плохой язык, выбранный разработчиками SystemVerilog для перегрузки виртуального ключевого слова, странным образом:

    `define REFERENCE virtual

    module top;

        // UVM Framework
        import uvm_pkg::*;
        `include "uvm_macros.svh"

        import   tinyalu_pkg::*;       //import all tb classes and types

        tinyalu_bfm       bfm();

        // invoke APIs from uvm_pkg to start test...
        initial begin
            uvm_config_db #(`REFERENCE tinyalu_bfm)::set(null, "*", "bfm", bfm);

            run_test();  
        end

    endmodule : top
    interface tinyalu_bfm;
    // ...

    endinterface : tinyalu_bfm

см. Здесь снова ... интерфейс объект также объявлен виртуальным ... почему?

 // FILE: random_test.svh
    class random_test extends uvm_test;
        // ... 
        `REFERENCE tinyalu_bfm bfm;

        function new (string name, uvm_component parent);
            super.new(name,parent);
            if(!uvm_config_db #(`REFERENCE tinyalu_bfm)::get(null, "*","bfm", bfm))
                $fatal("Failed to get BFM");
        endfunction : new

        task run_phase(uvm_phase phase);
            //...
        endtask : run_phase

    endclass

...