Childhood Dreams80 2023-05-28 16:54 采纳率: 0%
浏览 42
已结题

vivado如何支持多维打包数组模式

问题遇到的现象和发生背景

vivado2019.2的程序: wire [0:INPUT_NUM-1][`WD:0] d_in = d;发生了打包维度错误

操作环境、软件版本等信息

vivado2019.2如何设置支持多维打包数组模式

  • 写回答

8条回答 默认 最新

  • 这一次有糖 2023-05-28 16:57
    关注
    获得1.50元问题酬金

    tcl>>set_param pdm.multidimensional_support 1

    评论
  • 老皮芽子 2023-05-28 19:09
    关注
    获得2.40元问题酬金

    verilog 不支持这样的二维数组
    你可以用 system verilog
    你把你的代码文件改下后缀名,比如
    将 abc.v 改成 abc.sv 重新将改过名的文件加入工程,就能正常编译使用了

    评论
  • 瞬间动力 2023-05-28 23:04
    关注
    获得0.90元问题酬金

    在 Vivado 2019.2 中,多维打包数组可通过多种方式支持。在你的代码中,如果你声明了一个一个多维数组 d_in,则需要对其进行打包以适配 AXI-Stream 接口。

    在 Vivado 中支持多维打包数组模式,需要注意以下几点:

    1. 需要确保 d 是一个基于标准 Verilog 数组的多维数组。确保 d 的定义正确,下标的范围都是合法的,不超出数组长度。

    2. 在 Vivado 中,需要使用 genvar 变量来循环遍历多维数组。例如:

      generate
        genvar i;
        genvar j;
        for (i = 0; i < INPUT_NUM; i = i+1) begin
          for (j = 0; j < `WD+1; j = j+1) begin
            assign d_in[i][j] = {d[i][j]};
          end
        end
      endgenerate
      

      这里的 i,j 就是 generate 块中定义的 genvar 变量,d 为输入多维数组,d_in 为打包后的多维数组。

    3. 对于打包后的多维数组,需要在 AXI-Stream 接口中使用它,这里需要以块为单位进行传输。

    如果上述步骤无法解决你的问题,请提供更多错误信息或代码片段以便我们更好地帮助你解决问题。

    评论
  • 鱼弦 全栈领域创作新星创作者 2023-05-29 10:22
    关注
    获得0.90元问题酬金

    根据你的描述,可能是由于你在Vivado 2019.2中使用了多维打包数组模式,但没有正确设置打包维度导致的。以下是一些可能有用的步骤:

    首先,确保你已经正确地定义了你的多维打包数组。在你的代码中,你可以使用以下语法来定义一个2维打包数组:

    verilog
    Copy
    wire [`WD:0] d_in [0:INPUT_NUM-1][0:1];

    
    这将定义一个包含INPUT_NUM个2维打包数组的wire类型变量d_in,其中每个2维打包数组包含两个元素,每个元素都是一个WD位的向量。
    
    然后,在你的代码中,你需要正确地设置打包维度。在Vivado 2019.2中,你可以使用以下语法来设置打包维度:
    
    verilog
    Copy
    (* DIMENSION = "PACKED" *)
    wire [`WD:0] d_in [0:INPUT_NUM-1][0:1];
    

    在这个例子中,我们使用了一个特殊的Verilog属性DIMENSION来设置打包维度为"PACKED"。这将告诉Vivado将d_in数组视为一个打包数组并按照打包方式进行编码。

    如果你的代码中有其他的打包数组,你需要为它们也设置正确的打包维度。在Vivado 2019.2中,你可以在你的代码中使用以下语法来为其他打包数组设置打包维度:

    verilog
    Copy
    (* DIMENSION = "PACKED" *)
    wire [`WD:0] d_out [0:OUTPUT_NUM-1];

    ```

    在这个例子中,我们将d_out数组也设置为打包数组,并将其打包维度设置为"PACKED"。

    最后,当你在Vivado 2019.2中运行综合和实现过程时,确保你已经正确地设置了综合和实现选项。在综合选项中,你需要确保已经选择了正确的综合引擎,并且已经启用了打包。在实现选项中,你需要确保已经选择了正确的综合后工具,并且已经启用了打包和优化。

    评论
  • 还有头发的程序员- 2023-05-30 11:32
    关注
    获得0.30元问题酬金
    
    # If there is no project opened, create a project
    set list_projs [get_projects -quiet]
    if { $list_projs eq "" } {
       create_project ${vivado_board_name}-riscv vivado-${vivado_board_name}-riscv -part ${xilinx_part}
       set_property BOARD_PART ${vivado_board_part} [current_project]
    }
     
    # Create 'sources_1' fileset (if not found)
    if {[string equal [get_filesets -quiet sources_1] ""]} {
      create_fileset -srcset sources_1
    }
     
    # Create 'constrs_1' fileset (if not found)
    if {[string equal [get_filesets -quiet constrs_1] ""]} {
      create_fileset -constrset constrs_1
    }
     
    # Set 'sources_1' fileset object
    set source_fileset [get_filesets sources_1]
     
    # Set 'constrs_1' fileset object
    set constraint_fileset [get_filesets constrs_1]
     
    set files [list \
     [file normalize "rocket.vhdl"] \
     [file normalize "srams.v"] \
     [file normalize "system-${vivado_board_name}.v"] \
     [file normalize "../../uart/uart.v"] \
     [file normalize "../../sdc/sd_defines.h"] \
     [file normalize "../../sdc/axi_sd_fifo.v"] \
     [file normalize "../../sdc/axi_sd_fifo_filler.v"] \
     [file normalize "../../sdc/axi_sdc_controller.v"] \
     [file normalize "../../sdc/sd_cmd_master.v"] \
     [file normalize "../../sdc/sd_cmd_serial_host.v"] \
     [file normalize "../../sdc/sd_data_master.v"] \
     [file normalize "../../sdc/sd_data_serial_host.v"] \
     [file normalize "../../sdc/sd_data_xfer_trig.v"] \
     [file normalize "../../vhdl-wrapper/src/net/largest/riscv/vhdl/bscan2jtag.vhdl"] \
     [file normalize "../../board/${vivado_board_name}/ethernet-${vivado_board_name}.v"] \
     [file normalize "../../board/mem-reset-control.v"] \
     [file normalize "../../board/fan-control.v"] \
    ]
    add_files -norecurse -fileset $source_fileset $files
     
    # Note: top.xdc must be first - other files depend on clocks defined in top.xdc
    set files [list \
     [file normalize ../../board/${vivado_board_name}/top.xdc] \
     [file normalize ../../board/${vivado_board_name}/sdc.xdc] \
     [file normalize ../../board/${vivado_board_name}/uart.xdc] \
    ]
    add_files -norecurse -fileset $constraint_fileset $files
     
    source ../../board/${vivado_board_name}/ethernet-${vivado_board_name}.tcl
     
    # Note: timing-constraints.tcl must be last
    set files [list \
     [file normalize ../../board/timing-constraints.tcl] \
    ]
    add_files -norecurse -fileset $constraint_fileset $files
     
    # Set file properties
     
    set file_obj [get_files -of_objects $source_fileset [list "*/*.vhdl"]]
    set_property -name "file_type" -value "VHDL" -objects $file_obj
     
    set file_obj [get_files -of_objects $constraint_fileset [list "*/*.xdc"]]
    set_property -name "file_type" -value "XDC" -objects $file_obj
    set_property -name "used_in" -value "implementation" -objects $file_obj
    set_property -name "used_in_synthesis" -value "0" -objects $file_obj
     
    set file_obj [get_files -of_objects $constraint_fileset [list "*/*.tcl"]]
    set_property -name "file_type" -value "TCL" -objects $file_obj
    set_property -name "used_in" -value "implementation" -objects $file_obj
    set_property -name "used_in_synthesis" -value "0" -objects $file_obj
     
    # Create block design
    set current_vivado_version [version -short]
    source ../../board/${vivado_board_name}/riscv-${current_vivado_version}.tcl
     
    if { [llength [get_bd_intf_pins -quiet RocketChip/JTAG]] == 1 } {
      create_bd_cell -type module -reference bscan2jtag JTAG
      connect_bd_intf_net -intf_net JTAG [get_bd_intf_pins JTAG/JTAG] [get_bd_intf_pins RocketChip/JTAG]
      create_bd_cell -type ip -vlnv xilinx.com:ip:debug_bridge:3.0 BSCAN
      set_property -dict [list CONFIG.C_DEBUG_MODE {7} CONFIG.C_USER_SCAN_CHAIN {1} CONFIG.C_NUM_BS_MASTER {1}] [get_bd_cells BSCAN]
      connect_bd_intf_net -intf_net BSCAN [get_bd_intf_pins BSCAN/m0_bscan] [get_bd_intf_pins JTAG/S_BSCAN]
    }
     
    set_property CONFIG.CLKOUT1_REQUESTED_OUT_FREQ $riscv_clock_frequency [get_bd_cells clk_wiz_0]
    validate_bd_design
     
    regenerate_bd_layout
    save_bd_design
     
    if { [get_files -quiet -of_objects $source_fileset [list "*/riscv_wrapper.v"]] == "" } {
      make_wrapper -files [get_files riscv.bd] -top
      add_files -norecurse [file normalize vivado-${vivado_board_name}-riscv/${vivado_board_name}-riscv.srcs/sources_1/bd/riscv/hdl/riscv_wrapper.v ]
    }
    set_property top riscv_wrapper $source_fileset
    update_compile_order -fileset $source_fileset
    
    评论
  • 阿正很牛 2023-06-01 14:53
    关注

    在 Vivado 中,多维打包数组模式需要使用 SystemVerilog 语言来实现。具体的实现方法如下:

    1. 定义多维数组类型:
    typedef logic [`WD:0] data_t;
    typedef data_t data_array_t [0:INPUT_NUM-1];
    

    其中,data_t 表示每个元素的数据类型,data_array_t 表示多维数组类型。

    1. 声明多维数组变量:
    data_array_t d_in;
    
    1. 给多维数组变量赋值:
    d_in[0][0] = 1'b0;
    d_in[0][1] = 1'b1;
    d_in[1][0] = 1'b1;
    d_in[1][1] = 1'b0;
    

    在以上代码中,d_in 是一个二维数组,每个元素的数据类型为 data_t

    需要注意的是,在 Vivado 中,需要在项目设置中开启 SystemVerilog 支持,具体方法如下:

    1. 打开 Vivado 项目。

    2. 在菜单栏中选择 "Tools" -> "Settings"。

    3. 在 "Settings" 窗口中选择 "General" -> "Verilog HDL"。

    4. 在 "Verilog HDL" 选项卡中,将 "Enable SystemVerilog" 选项设置为 "Yes"。

    5. 点击 "OK" 保存设置。

    以上就是在 Vivado 中实现多维打包数组模式的方法,希望能对你有所帮助。

    评论
  • GIS工具开发 2023-06-03 16:04
    关注
    获得1.20元问题酬金

    根据你提供的信息,因为 d 数组的维度与 d_in 打包维度不匹配,所以导致出现维度错误

    评论
  • 小小y979 2023-05-28 17:32
    关注

    经引用chatgpt回答如下:
    打包维度错误通常是因为维度不匹配导致的。在这里,你的 d_in 是一个多维数组,按照如下的打包方式组织:

    wire [0:INPUT_NUM-1][WD:0] d_in = d;
    

    其中 INPUT_NUM 是一个常量,WD 也是常量,具有打包维度(packed array dimension)的特殊格式。如果 d 的维度不是 [0:INPUT_NUM-1][WD:0],就会发生打包维度错误。

    要设置支持多维打包数组模式,需要先检查 d 的维度是否匹配。如果 d 的维度不匹配,可以考虑对 d 进行重排或重新定义维度,使其符合上述的打包方式。

    为了在 Vivado 中支持多维打包数组模式,需要在创建数组时按如下格式定义:wire [MSB:LSB] array_name [UB:LB],其中 array_name 是给数组取的名称,LSBMSB 分别表示数组元素的最低和最高位,UBLB 分别表示数组索引的上限和下限。

    例如,在你的代码中,如果需要定义二维打包数组,可以按如下方式定义:

    wire [0:INPUT_NUM-1][0:WD-1][0:DEPTH-1] d_in = d;
    

    这将为你的数组 d_in 分配三个维度,可以存储多个数组元素,并设置每个元素的位数和上下限。请注意,如果你的输入数据 d 不符合此格式,你需要采取一些适当的措施来将其转换为所需的格式,或者重新定义输入数据的格式。

    希望这可以帮助你解决问题。

    
    
    
    评论

报告相同问题?

问题事件

  • 系统已结题 6月5日
  • 创建了问题 5月28日

悬赏问题

  • ¥15 vue引入sdk后的回调问题
  • ¥15 求一个智能家居控制的代码
  • ¥15 ad软件 pcb布线pcb规则约束编辑器where the object matpcb布线pcb规则约束编辑器where the object matchs怎么没有+15v只有no net
  • ¥15 虚拟机vmnet8 nat模式可以ping通主机,主机也能ping通虚拟机,但是vmnet8一直未识别怎么解决,其次诊断结果就是默认网关不可用
  • ¥20 求各位能用我能理解的话回答超级简单的一些问题
  • ¥15 yolov5双目识别输出坐标代码报错
  • ¥15 这个代码有什么语法错误
  • ¥15 给予STM32按键中断与串口通信
  • ¥15 使用QT实现can通信
  • ¥15 关于sp验证的一些东西,求告知如何解决,