Создание экземпляра nmo внутри интерфейса (UVM)

#verilog #system-verilog #verification #modelsim #uvm

Вопрос:

У меня есть интерфейс в моем тестовом стенде UVM, который состоит из нескольких экземпляров nmo. Симулятор(modelsim) жалуется на это, поскольку это нарушение LRM (не может иметь экземпляров чего-либо, кроме интерфейса, внутри интерфейса). Мне нужно переместить экземпляры за пределы интерфейса.

Как мне это сделать? Можно ли это сделать с помощью модпорта или задач? Это устаревший код, который я не писал.

 interface model_interface(input wire mac_clk,input reset);
    
    wire  [31:0] modelio_vi;
     
    wire  [31:0] modelio_data_in;
    wire  [31:0] modelio_data_out;
    wire  [31:0] modelio_data_oen;
    logic [4:0]                  modelio_mode_if [32];
    logic [4:0]                  ulp_modelio_mode_if [32];
    logic                        sample_if [32];  

    bit                          ulp_modelio_mux_en;
    bit                          host_disable;

    genvar loop;
    //The below block is the issue
    generate
        for(loop=0; loop<32; loop=loop 1)
        begin:asgn
           nmos inst_1(modelio_vi[loop],  modelio_data_in[loop], (~modelio_data_oen[loop]));//TB to DUT Buffer
           nmos inst_2(modelio_data_out[loop], modelio_vi[loop], ( modelio_data_oen[loop]));//DUT to TB Buffer
        end
    endgenerate
endinterface
 

Ответ №1:

nmos должен быть создан экземпляр внутри модуля, так как это примитив переключателя Verilog.

nmos (out,in,ctrl); функционально это то же assign out = ctrl ? in : 'z; самое , что и, поэтому вы можете просто переключиться на использование инструкций assign для минимального изменения кода. Другой размер вы должны переместить nmos в отдельный модуль и назначить подключение общих сигналов.

 generate
    for(loop=0; loop<32; loop=loop 1)
    begin:asgn
       assign modelio_vi[loop] =  !modelio_data_oen[loop] ? modelio_data_in[loop] : 'z;//TB to DUT Buffer
       assign modelio_data_out[loop] = modelio_data_oen[loop] ? modelio_vi[loop] : 'z;//DUT to TB Buffer
    end
endgenerate
 

Комментарии:

1. nmo необходим, если вам нужно передать сильные стороны.

2. Спасибо за быстрый ответ. Хотя это действительно решает проблему LRM, это создает функциональные ошибки во время моделирования. Первоначальное намерение состояло в том, чтобы этот сигнал исходил от DUT и TB, и в зависимости от того, какая сила будет выше, он пройдет. Таким образом, НМО по-прежнему будут необходимы.