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

How to use a parameter to add or remove a signal from a system verilog interface and modport

这是一些界面代码的片段,其中包含一些参数化的大小。第四个参数 HAS_BURST 是我试验过的,但它只会导致编译错误。

实际上我正在寻找一种方法 ADD/REMOVE 来自基于参数的接口的信号。有没有办法让可移动信号具有通用接口?

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

不,没有。端口在生成块中无效。参数可用于调整端口的宽度,但不能完全删除它。您可以使用 `ifdef 有条件地编译它,但这是一个 all-or-none 解决方案。不能有某些实例有信号而其他实例没有信号。

在很多情况下无条件地存在信号是好的,这是处理这个问题的最简单的方法。将任何未使用的输入连接到逻辑 0,未使用的输出可以保持未连接状态。

如果这些选项都不起作用,那么除了定义两个不同的接口之外别无他法。手动执行此操作很快变得无法维护。如果现在有两种变体,您可以肯定很快就会需要第三种,然后是第四种、第五种……许多芯片设计公司都有 SystemVerilog 代码生成器,可以为每个实例创建定制模块。