Я довольно новичок в Verilog и изучаю веревки. У меня есть код, который генерирует 8-битный счетчик вверх (модуль counter.v), который затем вызывается верхним модулем (top_module.v). Существует тестовая фикстура моделирования (test_fixture.v), которая вызывает верхний модуль для тестирования.
Я пытался определить ширину счетчика с помощью параметра (параметр COUNTER_WIDTH) и столкнулся с трудностями при этом. Коллега исправил код для меня, и теперь он действительно работает, но я хочу понять несколько вещей, чтобы понять, что на самом деле происходит.
Вот код модуля счетчика:
module counter
#(parameter COUNTER_WIDTH = 8)
(
input wire CLK,
input wire RST,
input wire CE,
output reg[COUNTER_WIDTH-1:0] out = {COUNTER_WIDTH{1'b0}}
);
always @(posedge CLK) begin
if (RST == 1) begin
out <= {COUNTER_WIDTH{1'b0}};
end else begin
if (CE == 1) begin
out <= out + 1'b1;
end
end
end
endmodule
Верхний модуль:
module top_module
#(parameter COUNTER_WIDTH = 8)
(
input wire CLK,
input wire CE,
input wire RST,
output wire[COUNTER_WIDTH-1:0] out
);
counter #(
.COUNTER_WIDTH(COUNTER_WIDTH)
)
counter_inst(
.CLK(CLK),
.RST(RST),
.CE(CE),
.out(out)
);
endmodule
И тестовое приспособление:
module test_fixture();
parameter COUNTER_WIDTH = 8;
// inputs
reg CLK = 0;
reg RST = 0;
reg CE = 0;
// outputs
wire [COUNTER_WIDTH-1:0] Q;
// instance of top module to be tested
top_module #(
.COUNTER_WIDTH(COUNTER_WIDTH)
)
test_inst(
.CLK(CLK),
.RST(RST),
.CE(CE),
.out(Q)
);
endmodule
Я думаю, что у меня все в порядке с модулем счетчика, но у меня есть вопрос о том, что происходит в верхнем модуле/тестовом приспособлении:
- Похоже, что параметр COUNTER_WIDTH объявлен в каждом модуле (#(параметр COUNTER_WIDTH = 8)), а затем «подключен» (если это правильное выражение) к объявлению параметра в другом модуле (например, #(.COUNTER_WIDTH(COUNTER_WIDTH ))
- Правильно ли это понимание? Если да, то почему мы должны объявлять параметр в модуле и связывать его с параметром в другом модуле?
Заранее спасибо за вашу помощь!