【发布时间】:2015-12-10 12:25:47
【问题描述】:
下面是总是块代码。
我需要 11 次相同的代码,具有相同的功能但使用不同的变量。那么如何复用代码呢?
always @(posedge tconClk or negedge tconRst_n)
begin
if(~tconRst_n)
begin
pulse_cnt <= 0;
pulse_start = 0;
start_written = 0;
pulse_width <= 'h271;
end
else if(~pulse_rst)
begin
pulse_cnt <= 0;
pulse_start = 0;
end
else
begin
if(start_signal)
begin
// start_written = 0;
pulse_width <= (pulse_start) ? pulse_width : START_PW;
pulse_start = 1;
end
pulse_cnt <= (pulse_start) ? (pulse_cnt + 1) : pulse_cnt;
end
end
命名模式-
-
tconClk、tconRst_n很常见, -
pulse_cnt0,pulse_cnt1到10, -
pulse_width0,pulse_width1到10, -
pulse_start[0:10](数组), -
start_written[0:10](数组), -
pulse_rst[0:10](数组), -
start_signal[0:10](数组), -
START_PW(无模式,每 11 个始终块的名称不同)
注意-
定义宏不起作用,因为此代码包含许多 verilog 标记。
我无法制作代码的模块,因为always块中使用的信号也用于代码的其他部分。因此,如果我制作模块,那么我将无法确保与模块进行正确的注册或电线连接。 (就像一个模块的输出端口必须是一根线,但相同的信号已被用作其他部分代码的reg)
【问题讨论】:
-
我不知道为什么你不能为此使用宏。您可以定义包含许多标记的多行宏,所以我不确定您为什么认为您不能。
-
@Unn :我已经尝试过,通过带参数的多行宏,但我得到了编译错误。因此,如果可能的话,我请求您将其发布为答案。
-
我不明白为什么这不能是一个模块。你有没有尝试过?驱动带有模块输出的 reg 很好。
-
宏、模块或两者的组合都可以工作。你能举一些例子来说明其他变量名是什么吗?有命名模式吗?例如,所有组都有相同的后缀信号(例如:
_cnt,_start,_width),只有前缀(pulse)发生变化。 -
Emacs verilog 模式 AUTO_TEMPLATE 来拯救。我现在没有时间为您的案例编写适当的模板,但这里是文档的链接:veripool.org/projects/verilog-mode/wiki/Faq
标签: verilog