Является ли это обязательным для использования "нового" для функционирования в классе systemverilog?
Сейчас я пытаюсь узнать о clss systemverilog.
Из многих примеров класса я нашел "новый" в 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 определит для вас неявную функцию. Причина, по которой вы можете объявить новую функцию внутри вашего класса, заключается в том, что вы хотите передать аргументы конструктору или у вас есть что-то, что требует более сложного процедурного кода для инициализации.