问题遇到的现象和发生背景
vivado2019.2的程序: wire [0:INPUT_NUM-1][`WD:0] d_in = d;发生了打包维度错误
操作环境、软件版本等信息
vivado2019.2如何设置支持多维打包数组模式
vivado2019.2的程序: wire [0:INPUT_NUM-1][`WD:0] d_in = d;发生了打包维度错误
vivado2019.2如何设置支持多维打包数组模式
收起
当前问题酬金
¥ 15 (您已提供 ¥ 20, 还可追加 ¥ 485)
支付方式
扫码支付
tcl>>set_param pdm.multidimensional_support 1
verilog 不支持这样的二维数组
你可以用 system verilog
你把你的代码文件改下后缀名,比如
将 abc.v 改成 abc.sv 重新将改过名的文件加入工程,就能正常编译使用了
在 Vivado 2019.2 中,多维打包数组可通过多种方式支持。在你的代码中,如果你声明了一个一个多维数组 d_in
,则需要对其进行打包以适配 AXI-Stream 接口。
在 Vivado 中支持多维打包数组模式,需要注意以下几点:
需要确保 d
是一个基于标准 Verilog 数组的多维数组。确保 d
的定义正确,下标的范围都是合法的,不超出数组长度。
在 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
为打包后的多维数组。
对于打包后的多维数组,需要在 AXI-Stream 接口中使用它,这里需要以块为单位进行传输。
如果上述步骤无法解决你的问题,请提供更多错误信息或代码片段以便我们更好地帮助你解决问题。
根据你的描述,可能是由于你在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中运行综合和实现过程时,确保你已经正确地设置了综合和实现选项。在综合选项中,你需要确保已经选择了正确的综合引擎,并且已经启用了打包。在实现选项中,你需要确保已经选择了正确的综合后工具,并且已经启用了打包和优化。
# 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
在 Vivado 中,多维打包数组模式需要使用 SystemVerilog 语言来实现。具体的实现方法如下:
typedef logic [`WD:0] data_t;
typedef data_t data_array_t [0:INPUT_NUM-1];
其中,data_t
表示每个元素的数据类型,data_array_t
表示多维数组类型。
data_array_t d_in;
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 支持,具体方法如下:
打开 Vivado 项目。
在菜单栏中选择 "Tools" -> "Settings"。
在 "Settings" 窗口中选择 "General" -> "Verilog HDL"。
在 "Verilog HDL" 选项卡中,将 "Enable SystemVerilog" 选项设置为 "Yes"。
点击 "OK" 保存设置。
以上就是在 Vivado 中实现多维打包数组模式的方法,希望能对你有所帮助。
根据你提供的信息,因为 d 数组的维度与 d_in 打包维度不匹配,所以导致出现维度错误
经引用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
是给数组取的名称,LSB
和 MSB
分别表示数组元素的最低和最高位,UB
和 LB
分别表示数组索引的上限和下限。
例如,在你的代码中,如果需要定义二维打包数组,可以按如下方式定义:
wire [0:INPUT_NUM-1][0:WD-1][0:DEPTH-1] d_in = d;
这将为你的数组 d_in
分配三个维度,可以存储多个数组元素,并设置每个元素的位数和上下限。请注意,如果你的输入数据 d
不符合此格式,你需要采取一些适当的措施来将其转换为所需的格式,或者重新定义输入数据的格式。
希望这可以帮助你解决问题。
报告相同问题?