微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

SystemVerilog:在接口数组上折叠和 & ......折叠或 |在接口数组上 但是,我的问题是,如何在接口数组中的单个位字段上执行此操作尝试 #1:尝试 #2:尝试 #3:尝试 #4:尝试 #5:尝试 #6:尝试 #7愚蠢但需要哈哈:尝试 #8 bash/sh 中的一些语法,使用 @ 来引用整个数组愚蠢但需要哈哈:

如何解决SystemVerilog:在接口数组上折叠和 & ......折叠或 |在接口数组上 但是,我的问题是,如何在接口数组中的单个位字段上执行此操作尝试 #1:尝试 #2:尝试 #3:尝试 #4:尝试 #5:尝试 #6:尝试 #7愚蠢但需要哈哈:尝试 #8 bash/sh 中的一些语法,使用 @ 来引用整个数组愚蠢但需要哈哈:

我正在尝试彻底改变我的一些代码。在我在模块端口签名中使用广泛使用的结构的任何地方,我都想用接口替换(如果合适)。

我还没有弄清楚的一个逻辑操作是折叠 & 或和折叠 or。

使用常规的位向量很容易做到这一点: 在模块中的某个地方,我可以很容易地执行折叠 & 和 |

logic [31:0] vect ;
logic my_sig_and ;
logic my_sig_or ;

always_comb begin
  my_sig_and = &vect ;
  my_sig_or = |vect ;
end

但是,我的问题是,如何在接口数组中的单个位字段上执行此操作

我的尝试如下(即使是愚蠢的尝试):

interface myInterface () () ;
    logic valid
    logic[31:0] data
endinterface

尝试 #1:

我在模块中某处的尝试:

myInterface () my_intfs [PORTS-1:0] () ; // assume this is assigned to
logic temp_signal ;
logic my_sig_and ;

always_comb begin
    temp_signal = my_intfs[0].ready ;
    for( genvar ii = 1; ii < PORTS; ii++ ) begin
        temp_signal = temp_signal && my_intfs[ii].ready ; // error line
    end
end

always_comb begin
    my_sig_and = temp_signal;
end

错误:靠近“genvar”:语法错误,意外的genvar,需要';'。

尝试 #2:

我在模块中某处的尝试:

myInterface () my_intfs [PORTS-1:0] () ; // assume this is assigned to
logic temp_signal ;
logic my_sig_and ;

always_comb begin
    temp_signal = my_intfs[0].ready ;
    for( int ii = 1; ii < PORTS; ii++ ) begin
        temp_signal = temp_signal && my_intfs[ii].ready ; // error line
    end
end

always_comb begin
    my_sig_and = temp_signal;
end

错误:实例数组“my_intfs”中的非常量索引

尝试 #3:

我在模块中某处的尝试:

myInterface () my_intfs [PORTS-1:0] () ; // assume this is assigned to
logic temp_signal ;
logic my_sig_and ;

always_comb begin
    temp_signal = my_intfs[0].ready ;
    for( int ii = 1; ii < PORTS; ii++ ) begin
        temp_signal = temp_signal && my_intfs[ii+:0].ready ; // error line
    end
end

always_comb begin
    my_sig_and = temp_signal;
end

(vlog-13172) 部分选择后选择的名称可能只是接口端口上的 modport。

尝试 #4:

我在模块中某处的尝试:

myInterface () my_intfs [PORTS-1:0] () ; // assume this is assigned to
logic temp_signal ;
logic my_sig_and ;

always_comb begin
    temp_signal = my_intfs[0].ready ;
end

for( genvar ii = 1; ii < PORTS; ii++ ) begin
    always_comb begin
        temp_signal = temp_signal && my_intfs[ii].ready ; // error line
    end
end

always_comb begin
    my_sig_and = temp_signal;
end

(vopt-7033) 在组合块中驱动的变量“temp_signal”,不能由任何其他进程驱动

尝试 #5:

我在模块中某处的尝试:

myInterface () my_intfs [PORTS-1:0] () ; // assume this is assigned to
logic temp_signal ;
logic my_sig_and ;

for( genvar ii = 0; ii < PORTS; ii++ ) begin
    always_comb begin
        temp_signal = temp_signal && my_intfs[ii].ready ; // error line
    end
end

always_comb begin
    my_sig_and = temp_signal;
end

(vopt-7033) 在组合块中驱动的变量“temp_signal”,不能由任何其他进程驱动。

尝试 #6:

我在模块中某处的尝试:

myInterface () my_intfs [PORTS-1:0] () ; // assume this is assigned to
logic temp_signal ;
logic my_sig_and ;

always_comb begin
    temp_signal = &my_intfs.ready ; // error line
end

always_comb begin
    my_sig_and = temp_signal;
end

(vopt-2990) 对解压类型的非法操作。

尝试 #7(愚蠢但需要哈哈):

我在模块中某处的尝试:

myInterface () my_intfs [PORTS-1:0] () ; // assume this is assigned to
logic temp_signal ;
logic my_sig_and ;

always_comb begin
    temp_signal = my_intfs.&ready ; // error line
end

always_comb begin
    my_sig_and = temp_signal;
end

“&”附近:语法错误,意外的“&”

尝试 #8 bash/sh 中的一些语法,使用 @ 来引用整个数组(愚蠢但需要哈哈):

我在模块中某处的尝试:

myInterface () my_intfs [PORTS-1:0] () ; // assume this is assigned to
logic temp_signal ;
logic my_sig_and ;

always_comb begin
    temp_signal = &my_intfs[@].ready ; // error line
end

always_comb begin
    my_sig_and = temp_signal;
end

“@”附近:语法错误,意外的“@”。

解决方法

使用宏将所有接口数组元素分配给占位符逻辑向量有效。完成所有分配后,只需折叠逻辑向量即可。:

somewhere in a module:
myInterface () my_intfs [PORTS-1:0] () ; // assume this is assigned to
logic temp_signal ;
logic my_sig_and ;

`INTF_FIELD_COLLAPSE_AND( blah,my_intfs,valid,PORTS,1,my_sig_and )


`ifndef INTF_FIELD_COLLAPSE_AND
    `define INTF_FIELD_COLLAPSE_AND( unique,intf,field,size,field_size,output_sig ) \
        logic [size-1:0] [field_size-1:0] my_sig_unique ; \
        for( genvar ii_unique = 0; ii_unique < PORTS; ii_unique++ ) begin \
            always_comb begin \
                my_sig_unique[ii_unique] = intf[ii_unique].field ; \
            end \
        end \
        output_sig = &my_sig_unique ;
`endif
,

您不能像普通的位数组一样访问(接口或模块)实例数组。由于潜在的参数覆盖接口端口连接,必须使用常量独立访问每个实例。

你应该做的是从接口信号数组中分别创建一个本地打包数组,然后你就可以对本地数组进行操作了。

myInterface my_intfs [PORTS-1:0] () ; 

logic [PORTS-1:0] local_ready;

for(genvar i=0;i<PORTS;i++)
   assign local_ready[i] = my_intfs[i].ready;

assign my_sig_and = &local_ready;

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。