모듈내에 데이터 비트등을 선언할때 정의를 하도록 하려면 Parameter 방법을 이용해야 한다. Hard-fix 코드로 박아두면 항상 문제가 생기곤 했다. 귀찮아도 꼭 미리 해두자
Parameter 선언
인스턴스 생성시에 데이터 비트를 지정하게 하는 방법은
모듈을 만들때 아래처럼 파라메터 값을 받아 처리하도록 하는 것이다. C/C++ 코드의 생성자 함수내의 파라메터를 같은 개념이지
module <module_name> #(<parameter list>) <port_list>;
아래 예제는 여기서 가져왔다.
https://docs.xilinx.com/r/en-US/ug901-vivado-synthesis/Parameters-Example-Verilog
module myreg (clk, clken, d, q);
parameter SIZE = 1;
input clk, clken;
input [SIZE-1:0] d;
output reg [SIZE-1:0] q;
always @(posedge clk)
begin
if (clken)
q <= d;
end
endmodule
module parameter_1 (clk, clken, di, do);
parameter SIZE = 8;
input clk, clken;
input [SIZE-1:0] di;
output [SIZE-1:0] do;
myreg #8 inst_reg (clk, clken, di, do);
// parameter 생성하는 예제 위의 myreg 모듈에 SIZE 값을 8 주는 예제이다.
endmodule
Parameter and Generate-For Example
활용도가 높은 코드이다. 파라메터로 값을 받아서 원하는 수 만큼 같은 로직을 생성시키는 코드 예제이다.
module parameter_generate_for_1 (clk, si, so);
parameter SIZE = 8;
input clk;
input si;
output so;
reg [0:SIZE-1] s;
assign so = s[SIZE-1];
always @ (posedge clk)
s[0] <= si;
genvar i;
generate
for (i = 1; i < SIZE; i = i+1)
begin : shreg
always @ (posedge clk)
begin
s[i] <= s[i-1];
end
end
endgenerate
endmodule
Parameter 사용법
예제는 이글에서 참고했다.
https://lifelectronics.tistory.com/161 설명이 아주 자세하게 잘 되어 있다. 꼭 방문해 보시길~~
defparam을 이용해서 직접 C의 변수처럼 지정하는 방법이 있고,
module annotate;
defparam
top.m1.size=5, //defparam을 통해 m1 모듈의 size 파라미터를 변경한다.
top.m1.delay=10, //m1 모듈의 delay 파라미터를 변경한다.
top.m2.size=10,
top.m2.delay=20;
endmodule
혹은 생성할때, 순서로 지정을 하던, 이름을 가지고 직접 입력하던 아래 처럼 #() 를 이용해서 할당하는 방법이 있다.
//순서에 의한 parameter 값 변경
vdff #(10,15) mod_a(out_a, in_a, clk); // vdff 를 mod_a라는 이름으로 인스턴스하며
// size = 10, delay=15로 바꿈
//이름에 의한 parameter 값 변경
vdff #(.delay(12)) mod_c(out_c, in_c, clk); //delay가 12로 바뀜 size는 5 그대로
좀 더 종합적으로 다 들어 있는 예제 코드는 아래를 보면 된다. 모든 경우를 다 넣어 둔듯 하다.
https://vlsiverify.com/system-verilog/systemverilog-parameters/
`define 도 써서, 적당하게 활용되는 예제가 잘 구성되어 있다.
순서로 지정하기, 이름으로 지정하기, defparam으로 지정하기 전부 다 정의되어 있다.
`define D_WIDTH 32
`define I_WIDTH 8
module tb_top;
param_example p1(.data(2), .id(1)); // without passing parameter
param_example #(4, 16) p2(.data(3), .id(2)); // constant parameter passing
param_example #(`D_WIDTH, `I_WIDTH) p3(.data(6), .id(3)); // macro define based parameter passing
param_example p4(.data(9), .id(4));
// Change parameter value using defparam
defparam p4.DATA_WIDTH = 10;
defparam p4.ID_WIDTH = 16;
endmodule
이상 모듈 인스턴스 생성시에 변경될 수 있는 데이터 비트, 내부 모듈에 사용되는 상수값 들을 정의하는 parameter 에 대해 살펴봤다. 정리를 하면서 필요하면 계속 업데이트 할 생각이다. :)
'IT > ASIC | FPGA' 카테고리의 다른 글
FPGA - Nexys A7 보드 터미널 설정 on Windows (0) | 2024.02.22 |
---|---|
Xilinx – PROM mcs 설정 – spi buswidth clock 조정 (0) | 2024.02.22 |
Verilog - 숫자 표현 정리 - Signed vector 내용 중요 (0) | 2024.02.20 |
Xilinx Vivado - SPRAM, DPRAM, block RAM 활용 (1) | 2024.02.20 |
Verilog - Metastable, CDC (clock domain crossing) 정리 (0) | 2024.02.16 |