Является ли это обязательным для использования "нового" для функционирования в классе systemverilog?

Сейчас я пытаюсь узнать о clss systemverilog.

Из многих примеров класса я нашел "новый" в 2 типах.

  1. Случай "нового" существует в классе.
  2. Случай с "новым" существует в начале.

Есть ли разница между этими реализациями конструктора?

Еще один, что в функции new()? Я не уверен, что цель в функции new ()

Обновить

Например 1 есть. Класс ххх... Функция new(); ... Конечная функция

Endclass

Пример 2

program

class xxxx


 endclass

 Initial begin
 xxxx  x = new;
   end

endprogram

обновление 2

Спасибо, что дали мне знать. У меня есть вопрос. В чем разница между

Class xxx
...
Function new();
(Variable initialization)
...
Endfunction
Endclass

А также

Class xxx
...
Function new();
(Nothing variable initialization)
Endfunction
Endclass

Но в этом случае передать значение в первоначальном утверждении или задачах. Что есть в функции new() endfunction? Я не уверен, что мне нужно инициализировать переменные?

Update3

class packet;
  //class properties
  bit [31:0] addr;
  bit [31:0] data;
  bit        write;
  string     pkt_type;

  //constructor
  function new(bit [31:0] addr,data,bit write,string pkt_type);
    addr  = addr;
    data  = data;
    write = write;
    pkt_type = pkt_type;
  endfunction

  //method to display class prperties
  function void display();
    $display("---------------------------------------------------------");
    $display("\t addr  = %0h",addr);
    $display("\t data  = %0h",data);
    $display("\t write = %0h",write);
    $display("\t pkt_type  = %0s",pkt_type);
    $display("---------------------------------------------------------");
  endfunction
endclass

module sv_constructor;
  packet pkt;
  initial begin
    pkt = new(32'h10,32'hFF,1,"GOOD_PKT");
    pkt.display();
  end
endmodule

Это то, что у меня есть код. ты это видишь,

два типа объявляют функциональный блок.

1. is with new

  function new(bit [31:0] addr,data,bit write,string pkt_type);
    addr  = addr;
    data  = data;
    write = write;
    pkt_type = pkt_type;
  endfunction


2. is without new.

  //method to display class prperties
  function void display();
    $display("---------------------------------------------------------");
    $display("\t addr  = %0h",addr);
    $display("\t data  = %0h",data);
    $display("\t write = %0h",write);
    $display("\t pkt_type  = %0s",pkt_type);
    $display("---------------------------------------------------------");
  endfunction

1 ответ

Решение

Вызов метода new() для класса является единственным способом создания объекта класса. Есть несколько причин, по которым вы можете захотеть определить класс и никогда не вызывать для него метод new(), но вы должны задать этот вопрос позже, когда у вас будет лучшее понимание SystemVerilog.

Обновить

Я думаю, вы можете спросить, в чем разница между классом с объявленной функцией new() внутри класса

class xxxx;
  int x;
  function new;
  ...
  endfucntion
endclass

по сравнению с классом без него

class xxxx;
  int x;
endclass

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

Другие вопросы по тегам