如何使用参数从系统Verilog接口和modport添加或删除信号

时间:2019-03-11 21:49:31

标签: system-verilog

这是一些具有一些参数化大小的接口代码的片段。第四个参数HAS_BURST是我尝试过的东西,但仅导致编译错误。

有效地,我正在寻找一种基于参数从接口添加/删除信号的方法。有没有办法建立带有可移动信号的通用接口?

interface axi_if 
    #(parameter ID_WIDTH   = 4, 
                ADDR_WIDTH = 40,
                DATA_WIDTH = 64,
                HAS_BURST  = 0) 
    ();

logic                      aw_ready;     
logic                      aw_valid;     
logic [ID_WIDTH-1:0]       aw_bits_id;   
logic [ADDR_WIDTH-1:0]     aw_bits_addr; 
logic [7:0]                aw_bits_len;  
logic [2:0]                aw_bits_size;
generate
if (HAS_BURST)
logic [1:0]                aw_bits_burst;
endgenerate
logic [2:0]                aw_bits_size;

modport slave (  
output aw_ready,
input  aw_valid,
input  aw_bits_id,
input  aw_bits_addr,
input  aw_bits_len,
generate
if (HAS_BURST)
input  aw_bits_burst,
endgenerate
input  aw_bits_size
);

modport master (  
input  aw_ready,
output aw_valid,
output aw_bits_id,
output aw_bits_addr,
output aw_bits_len,
generate
if (HAS_BURST)
output aw_bits_burst,
endgenerate
output aw_bits_size
);
endinterface
`endif

1 个答案:

答案 0 :(得分:0)

不,没有。端口在generate块中无效。参数可用于调整端口的宽度,但不能将其完全删除。您可以使用`ifdef有条件地对其进行编译,但这是一个全有或全无的解决方案。信号不会有某些实例,而没有信号就不会有其他实例。

在许多情况下,无条件显示信号是好的,这是处理此问题的最简单方法。将所有未使用的输入绑定到逻辑0,未使用的输出可以保持未连接状态。

如果这些选项都不起作用,则只能定义两个不同的接口。快速手动执行此操作变得难以维护。如果现在有两种变体,您可以确定很快将需要第三种,然后是第四种,第五种...许多芯片设计公司都有SystemVerilog代码生成器,它们为每个实例创建自定义模块。