生成循环中的Verilog端口

时间:2016-02-14 02:41:16

标签: verilog quartus qsys

由于无法避免的原因(Qsys的要求),我有几个Verilog模块,最终有许多端口,如果它们被打包,将更容易使用。试着解释我的意思,这是一个例子:

module foo #(
    COUNT = 4
) (
    //Interface 0
    input  bar_0,
    output deadbeef_0,

    //Interface 1
    input  bar_1,
    output deadbeef_1,

    //Interface 2
    input  bar_2,
    output deadbeef_2,

    //Interface 3
    input  bar_3,
    output deadbeef_3,
);
...
endmodule

现在通常只会制作两个矢量化端口(例如input [COUNT-1:0] bar,),但是如果需要将信号馈送到不同的接口,Qsys无法应对此问题 - 您只能选择整个端口,而不仅仅是一点点一个。

你可以想象,如果你需要在generate循环之类的内部访问端口,这会非常恼人,如果你的模块接口有10个必须是写了16次!

到目前为止,我一直在做的是手动添加映射到模块中。再次举例说明 - 继续上面的例子,我在模块的主体中​​有这样的东西:

wire [COUNT-1:0] bar;
wire [COUNT-1:0] deadbeef;
generate
if (COUNT > 0) begin
    assign bar[0] = bar_0;
    assign deadbeef_0 = deafbeef[0];
end else begin
    assign deadbeef_0 = 1'b0; //Terminate!
end
if (COUNT > 1) begin
    assign bar[1] = bar_1;
    assign deadbeef_1 = deafbeef[1];
end else begin
    assign deadbeef_1 = 1'b0; //Terminate!
end
...
endgenerate

// deadbeef[] and bar[] can now be used as arrays, woop.

在这个例子中,即使只为两个信号写出几个接口也非常繁琐!

我的程序员的每个部分都在尖叫着停止这样做,必须是更好的方式。这让我想到了我的问题:

  

有一种简单的方法吗?

理想情况下,我会有一些形式的循环为我生成这些映射,从循环变量生成信号名称。但我不确定这在Verilog中是否可行。

另外,为了让事情变得有趣,我一直在使用十六进制作为端口,以便在写出来时更容易,例如:

input bar_0,
input bar_1,
...
input bar_9,
input bar_a,
input bar_b,
...

理想情况下,解决这个问题的方法也可以处理这样的名称,但老实说,如果它简化了事情,我可以很容易地将名称转换为十进制(bar_10)。

如果您想知道,在Qsys中可以很容易地将接口链接到端口,因为Qsys使用TCL文件进行映射。在TCL中,我可以简单地使用for循环并连接循环变量来创建名称。

1 个答案:

答案 0 :(得分:0)

我想,在您的情况下,可用于解决您的问题。因此,在您的代码中,您可以使用bar作为向量,但事实并非如此。

像这样定义一个宏:

`define bar(n) bar_``n``
`define deadbeef(n) deadbeef_``n``

你可以使用现在的栏作为下面的矢量:

`bar(0)
`deadbeef(0)