zoukankan      html  css  js  c++  java
  • 如何在SV中使用二维数组精简代码

    前言
    在信号处理实现过程中,对于多通道的数据定义,采用常规的方式就得定义多个通道变量。
    verilog不支持二维端口数组定义,但SV可以,所以可以省点代码量。

    流程
    对于verilog 的代码:可以看到代码类似冗长。
    reg [31:0] r_value_add_ch0 = 32'd0;
    reg [31:0] r_value_add_ch1 = 32'd0;
    reg [31:0] r_value_add_ch2 = 32'd0;
    reg [31:0] r_value_add_ch3 = 32'd0;
    always @(posedge i_clk)
    begin
        if (r_cal_remain_edge == 2'b10//下降沿重新启动校正流程
            r_value_add_ch0 <= 32'd0;
        else if (r_calibration_en)
            r_value_add_ch0 <= r_value_add_ch0 + {{16{i_din_ch0[15]}},i_din_ch0};
    end
    always @(posedge i_clk)
    begin
        if (r_cal_remain_edge == 2'b10//上升沿
            r_value_add_ch1 <= 32'd0;
        else if (r_calibration_en)
            r_value_add_ch1 <= r_value_add_ch1 + {{16{i_din_ch1[15]}},i_din_ch1};
    end
    always @(posedge i_clk)
    begin
        if (r_cal_remain_edge == 2'b10//上升沿
            r_value_add_ch2 <= 32'd0;
        else if (r_calibration_en)
            r_value_add_ch2 <= r_value_add_ch2 + {{16{i_din_ch2[15]}},i_din_ch2};
    end
    always @(posedge i_clk)
    begin
        if (r_cal_remain_edge == 2'b10//上升沿
            r_value_add_ch3 <= 32'd0;
        else if (r_calibration_en)
            r_value_add_ch3 <= r_value_add_ch3 + {{16{i_din_ch3[15]}},i_din_ch3};
    end
    对其用SV进行二维数组合并及generate语句改写:极大的精简了代码量,同时方便调试修改。
    logic [3:0][31:0] r_value_add= 32'd0;
    genvar i;
    generate 
        for (i=0;i<4;i++)
        begin
            always_ff @(posedge i_clk)
            begin
                if (r_cal_remain_edge == 2'b10//下降沿重新启动校正流程
                    r_value_add[i][15:0<= 32'd0;
                else if (r_calibration_en)
                    r_value_add[i][15:0<= r_value_add[i][15:0+ {{16{i_din[i][15]}},i_din[i][15:0]};
            end
        end
    endgenerate 


    Sim: 赋值[15:0] l_m_data 到 [3:0][3:0] l_s_data的信号,仿真其对应关系。信号剥离时使用。
    timeunit 1ns;
    timeprecision 1ps;
    module top;
    logic [15:0] l_m_data = 16'habcd;
    logic [3:0][3:0] l_s_data;
    assign l_s_data = l_m_data;

    endmodule 
    可以看到是高对高,低对低。

    以上。
  • 相关阅读:
    log4net 简单使用教程(配置)
    C#WinForm 国际化的简单实现,多语言实现
    EF Power Tool 参数错误 HRESULT:0x80070057 (E_INVALIDARG)) 解决办法
    如何用委托与事件实现winfrom窗体之间值传递
    VS2010自带的Dotfuscator 5注册
    WinForm 实现主程序(exe)与其关联类库(*.dll)分开存放
    POJ_3211 Washing Clothes (01背包)
    POJ_3624 Charm Bracelet ( 01背包 )
    集训队内部测试赛(2012.01.02)
    HDU_1011 Starship Troopers && HDU_1561 The more, The Better (树型dp)
  • 原文地址:https://www.cnblogs.com/kingstacker/p/13492408.html
Copyright © 2011-2022 走看看