SystemVerilog: виртуальные модули против виртуальных интерфейсов - PullRequest
0 голосов
/ 29 февраля 2020

Я знаю, что SystemVerilog позволяет сохранить ссылку на интерфейс в классе SystemVerilog, объявив его «виртуальным». Шина, возможно ли также объявить модуль как "виртуальный", чтобы сохранить ссылку на модуль в классе SystemVerilog? Пример:

    `timescale 1 ns / 10 ps

    // Verilog-95 style BFM (with verilog 2001 style ports)
    module BFM1(
        input  wire        clk,
        output reg [15:0]  data
    );

        task write(input [15:0] data1);
            data = data1;
            @(posedge clk); 
            #1;
        endtask;

    endmodule
    class MyClass

        //"Virtual module" (instead of a "virtual interface")
        virtual BFM1 vBFM1;

        function new(virtual BFM1 vvBFM1);
            // save virtual module reference
            vBFM1 = vvBFM1;
        endfunction

        function write(input [15:0] data);
            vBFM.write(data);
        endfunction
    endclass
    // Testbench top-level
    module top;
        reg        clk;
        reg [15:0] data;

        initial begin
            clk = 0;
            forever #5 !clk = clk; 
        end

        BFM1 BFM1(
            .clk  (clk),
            .data (data)
        );

        DUT DUT(
            .clk  (clk), 
            .data (data)
        );

        initial begin

            //Verilog-95 Style BFM call
            BFM1.write(16'h12340);

            // SystemVerilog Class style
            MyClass MyClass1 = new(BFM1);

            MyClass.write(16'hDEAD);
            MyClass.write(16'hBEEF);

            $finish;
        end
    endmodule
    // Design under Test
    module DUT(
        input wire        clk,
        input wire [15:0] data
    );
        //insert design under test logic
    endmodule

Мне было просто любопытно, если бы я мог обойтись без формальности использования интерфейсов SystemVerilog и просто использовать старую BFM в стиле verilog-95 из Класс SystemVerilog?

Я просто думаю, что BFM старого стиля будет работать лучше в тестовом стенде SystemVerilog, если ваш DUT находится в VHDL, поскольку VHDL не имеет интерфейсов SystemVerilog. Это своего рода избыточность для создания ненужных интерфейсов и пакетов только для подключения тестового стенда SystemVerilog к VHDL DUT, который их не использует.

Ответы [ 2 ]

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

Прямой ответ на ваш вопрос - нет, SystemVerilog имеет ограниченные конструкции, к которым вы можете получить дескрипторы (интерфейсы, классы и события). Самая большая проблема заключается в том, что модули не похожи на типы данных, которые должны быть определены до обращения к ним. Очень сложно и неоптимально создать ссылку на идентификатор, когда вы не знаете его тип.

Оригинальная спецификация SystemVerilog interface была намного проще, чем сегодня. Его функции стали больше походить на модуль, но все еще более ограничены.

Однако альтернативы виртуальным интерфейсам, особенно при обмене данными с устаревшими BFM Verilog, часто обсуждаются в топи c. ссылка1 ссылка2 ссылка3

0 голосов
/ 01 марта 2020
    `timescale 1 ns / 10 ps

    // The best why to solve this problem since the SystemVerilog
    //  language standard people did't give us a handle to a module
    //  is to create a define that points to full hierarchical path to
    //  the verilog module. Example:

    `define   DEF_BFM1   $root.top.BFM1

    // Verilog-95 style BFM (with verilog 2001 style ports)
    module BFM1(
        input  wire        clk,
        output reg [15:0]  data
    );

        task write(input [15:0] data1);
            data = data1;
            @(posedge clk); 
            #1;
        endtask;

    endmodule
    class MyClass

        function write(input [15:0] data);
            `DEF_BFM1.write(data);
        endfunction
    endclass
    // Testbench top-level
    module top;
        reg        clk;
        reg [15:0] data;

        initial begin
            clk = 0;
            forever #5 !clk = clk; 
        end

        BFM1 BFM1(
            .clk  (clk),
            .data (data)
        );

        DUT DUT(
            .clk  (clk), 
            .data (data)
        );

        initial begin

            //Verilog-95 Style BFM call
            `DEF_BFM1.write(16'h12340);

            // SystemVerilog Class style
            MyClass MyClass1 = new();

            MyClass.write(16'hDEAD);
            MyClass.write(16'hBEEF);

            $finish;
        end
    endmodule
    // Design under Test
    module DUT(
        input wire        clk,
        input wire [15:0] data
    );
        //insert design under test logic
    endmodule
...