关于verilog不能处理数组端口的解决方法

Verilog语言目前并不支持数组型端口,这不利于一些信号的管理。虽然System Veilog支持这样的定义,但是如果是芯片开发,就不得不用Verilog开发了。


即在Verilog中,不支持如下的端口定义:

module divider_common#
(
     parameter                                  CHAN_NUM                  = 8    // 通道数
    ,parameter                                  CHAN_DW                   = 8    // 数据位宽
)
(
     input                                      sys_clk
    ,input                                      sys_rst
    
    ...
    
    ,input                                      i_dat_vld      [0:CHAN_NUM-1]
    ,input  [CHAN_DW-1:0]                       i_dat          [0:CHAN_NUM-1]

    ...

    ,output                                     o_dat_vld      [0:CHAN_NUM-1]
    ,output [CHAN_DW-1:0]                       o_dat          [0:CHAN_NUM-1]
);

针对上述情况,更改端口定义方式:即从数组定义方式变为大位宽定义

module divider_common#
(
     parameter                                  CHAN_NUM                  = 8    // 通道数
    ,parameter                                  CHAN_DW                   = 8    // 数据位宽
)
(
     input                                      sys_clk
    ,input                                      sys_rst
    
    ...
    
    ,input  [CHAN_NUM-1:0]                      i_dat_vld
    ,input  [CHAN_NUM*CHAN_DW-1:0]              i_dat

    ...

    ,output [CHAN_NUM-1:0]                      o_dat_vld
    ,output [CHAN_NUM*CHAN_DW-1:0]              o_dat
);

为了在模块内部更方便的使用(例如generate for 或者 generate if),可以在模块内部将大位宽数据拆分为数组。如下:

对于input端口

    genvar i;
    
    wire                             data_in_vld      [0:CHAN_NUM-1]  ;
    wire  [CHAN_DW-1:0]              data_in          [0:CHAN_NUM-1]  ;

    // input 大位宽转数组
    generate
        for (i = 0; i < CHAN_NUM; i = i + 1) begin
            assign data_in_vld[i] = i_dat_vld[i*1 +: 1];
            assign data_in[i] = i_dat[i*CHAN_DW +: CHAN_DW];
        end
    endgenerate

对于output端口

    genvar i;
    
    reg                             data_out_vld      [0:CHAN_NUM-1]  ;
    reg  [CHAN_DW-1:0]              data_out          [0:CHAN_NUM-1]  ;

    // input 大位宽转数组
    generate
        for (i = 0; i < CHAN_NUM; i = i + 1) begin
            assign o_dat_vld[i*1 +: 1] = data_out_vld[i];
            assign o_dat[i*CHAN_DW +: CHAN_DW] = data_out[i];
        end
    endgenerate

    ...

    generate
        for (i = 0; i < CHAN_NUM; i = i + 1) begin
            always@ (posedge sys_clk) begin
                data_out_vld[i] <= ...;
                data_out <= ...;
            end
        end
    endgenerate

相关推荐

  1. 关于verilog处理数组端口解决方法

    2024-05-09 09:18:06       36 阅读
  2. MyEclipse自动编译解决方案

    2024-05-09 09:18:06       25 阅读
  3. 关于QT串口发送数据及时发出问题

    2024-05-09 09:18:06       59 阅读
  4. 关于paddle OCR调用cpu问题

    2024-05-09 09:18:06       19 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-05-09 09:18:06       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-05-09 09:18:06       100 阅读
  3. 在Django里面运行非项目文件

    2024-05-09 09:18:06       82 阅读
  4. Python语言-面向对象

    2024-05-09 09:18:06       91 阅读

热门阅读

  1. Linux程序依赖动态链接库目录管理和案例分析

    2024-05-09 09:18:06       102 阅读
  2. 机器学习之sklearn基础教程

    2024-05-09 09:18:06       34 阅读
  3. Spring Bean的线程安全问题

    2024-05-09 09:18:06       32 阅读
  4. stylus详解与引入的例子

    2024-05-09 09:18:06       32 阅读
  5. 01 设计模式--单例模式

    2024-05-09 09:18:06       31 阅读
  6. 腾讯云k8s中pod集群yaml文件详解

    2024-05-09 09:18:06       32 阅读
  7. conll-2012-formatted-ontonotes-5.0中文数据格式说明

    2024-05-09 09:18:06       24 阅读