systemverilog 인자의 갯수를 variable 하게 넣는 방법.
write(addr,wcnt,wdata0,wdata1,wdata2);
처럼 write 할때, 주소와 wcnt 를 뒤에 따라오는 wdata0,w,data1 등의 갯수만큼 넣어 준다.
단, 아래처럼 최대로 wcnt 할 수 있는 갯수의 데이타를 초기값을 할당한 상태로 지정해 준다.
task write(input addr, input [7:0] wcnt, input [31:0] wdata0 = 0 , wdata1 = 0, wdata2 = 0, wdata3 = 0, ..., wdata255 = 0);
logic [8*256-1:0] wdata_all;
wdata_all = {wdata255, .... , wdata1, wdata0 }; // 일단, 데이터들을 모두 모으고,
8bit 씩 write 하는 task를 따로 만들어 두고,
for(int i =0; i<wcnt+1); i++) begin
byte_wrtie( wdata_all >>(i*8) & 8'hFF); // 이렇게 wcnt 만큼 회전하면서, byte_write를 진행한다.
end
그럼 외부에서 사용하는 task 자체는 wcnt, wdata 갯수만 필요한 만큼 지정해서 사용하면 된다.
--------
SystemVerilog에서는 C 언어의 stdarg.h에 해당하는 가변 인자 리스트를 직접 지원하지 않습니다. 즉, C 언어에서처럼 va_list, va_start, va_arg, va_end 같은 매크로를 사용하여 가변 인자를 처리하는 기능은 SystemVerilog에 내장되어 있지 않습니다.
SystemVerilog는 하드웨어 설계와 검증을 위한 언어로, 그 특성상 하드웨어의 신호나 행동을 모델링하는 데 초점을 맞추고 있습니다. 이 때문에, C 언어의 일부 고급 프로그래밍 기능들, 특히 메모리 관리나 가변 인자 리스트와 같은 기능들은 SystemVerilog에서 직접적으로 지원되지 않습니다.
만약 SystemVerilog에서 여러 개의 다른 인자를 처리해야 하는 상황이 있다면, 일반적으로 배열, 구조체(struct), 또는 클래스를 사용하여 이를 구현합니다. 예를 들어, 여러 개의 값을 처리해야 하는 경우, 이 값들을 배열로 전달하고, 배열의 크기를 인자로 함께 전달하는 방법이 사용될 수 있습니다.
task process_values(input int values[], input int size);
// 배열 values[]에 대한 처리 로직
endtask
이 방법은 C 언어의 가변 인자 리스트와 같은 유연성은 제공하지 않지만, SystemVerilog의 사용 목적과 맥락에 적합한 대안을 제공합니다.