首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Vivado推断AXI总线不正确的FREQ_HZ到我的模块

Vivado推断AXI总线不正确的FREQ_HZ到我的模块
EN

Stack Overflow用户
提问于 2018-02-26 07:23:57
回答 1查看 6K关注 0票数 4

我在维瓦多做一个设计。我的顶层设计是一个框图。该框图有IP块和我的Verilog RTL模块。每当我更改我的主模块和Verilog更新方框图时,它总是错误地推断我的模块的时钟频率。,我怎样才能解决这个问题?

这个问题令人恼火,问它破坏了我的设计。设计中的所有其他AXI总线都正确地使用了10 the,但是每当我更改main并更新框图时,Vivado决定main的AXI总线位于100 the。只要时钟不匹配,我就无法构建。我可以手动更新方框图中块属性中的频率,但是每次我更新main (因为它是我的主模块)时,这些更改都会被删除。

我尝试为每个AXI总线添加一个专用时钟和重置(尽管它们都连接到同一个网络)。我和X_INTERFACE_PARAMETER混过了(这里有文档记录吗?)一切都没有结果。

此外,M_AXIS_CMD是一个主AXI接口,应该位于main块的输出端。不知道怎么回事。但与时钟相比,这是一个很小的问题。

来源:https://gitlab.com/tessera/pcd8544-tests

模块接口:

代码语言:javascript
运行
复制
module main #(
        CLK_FREQ = 50000000// : CLK_FREQ > 0 // clock frequency
    )(
        (* X_INTERFACE_PARAMETER = "XIL_INTERFACENAME core_clk, ASSOCIATED_RESET core_rst, FREQ_HZ 10000000" *)
        (* X_INTERFACE_INFO = "xilinx.com:signal:clock:1.0 core_clk CLK" *)
        input clk,
        (* X_INTERFACE_PARAMETER = "XIL_INTERFACENAME core_rst, POLARITY ACTIVE_HIGH" *)
        (* X_INTERFACE_INFO = "xilinx.com:signal:reset:1.0 core_rst RST" *)
        input rst,
        (* X_INTERFACE_PARAMETER = "XIL_INTERFACENAME axi_rst, POLARITY ACTIVE_LOW" *)
        (* X_INTERFACE_INFO = "xilinx.com:signal:reset:1.0 axi_rst RST" *)
        input axi_rst,

        (* X_INTERFACE_INFO = "xilinx.com:interface:fifo_write:1.0 DOUT FULL" *)
        input wr_full,
        (* X_INTERFACE_INFO = "xilinx.com:interface:fifo_write:1.0 DOUT WR_DATA" *)
        output reg [8:0] wr_data,
        (* X_INTERFACE_INFO = "xilinx.com:interface:fifo_write:1.0 DOUT WR_EN" *)
        output reg wr_valid,

        // slave AXI-Lite write channel FROM PS
        (* X_INTERFACE_INFO = "xilinx.com:interface:aximm_rtl:1.0 S_AXI_REG AWADDR"  *) input  wire [4:0]  s_axi_reg_awaddr,  // address
        (* X_INTERFACE_INFO = "xilinx.com:interface:aximm_rtl:1.0 S_AXI_REG AWPROT"  *) input  wire [2:0]  s_axi_reg_awprot,  // channel protection type
        (* X_INTERFACE_INFO = "xilinx.com:interface:aximm_rtl:1.0 S_AXI_REG AWVALID" *) input  wire        s_axi_reg_awvalid, // address valid
        (* X_INTERFACE_INFO = "xilinx.com:interface:aximm_rtl:1.0 S_AXI_REG AWREADY" *) output wire        s_axi_reg_awready, // address ready
        (* X_INTERFACE_INFO = "xilinx.com:interface:aximm_rtl:1.0 S_AXI_REG WDATA"   *) input  wire [31:0] s_axi_reg_wdata,   // data
        (* X_INTERFACE_INFO = "xilinx.com:interface:aximm_rtl:1.0 S_AXI_REG WSTRB"   *) input  wire [3:0]  s_axi_reg_wstrb,   // strobes - one bit per byte of data
        (* X_INTERFACE_INFO = "xilinx.com:interface:aximm_rtl:1.0 S_AXI_REG WVALID"  *) input  wire        s_axi_reg_wvalid,  // data/strobes valid
        (* X_INTERFACE_INFO = "xilinx.com:interface:aximm_rtl:1.0 S_AXI_REG WREADY"  *) output wire        s_axi_reg_wready,  // data/strobes ready
        (* X_INTERFACE_INFO = "xilinx.com:interface:aximm_rtl:1.0 S_AXI_REG BRESP"   *) output wire [1:0]  s_axi_reg_bresp,   // response
        (* X_INTERFACE_INFO = "xilinx.com:interface:aximm_rtl:1.0 S_AXI_REG BVALID"  *) output wire        s_axi_reg_bvalid,  // response valid
        (* X_INTERFACE_INFO = "xilinx.com:interface:aximm_rtl:1.0 S_AXI_REG BREADY"  *) input  wire        s_axi_reg_bready,  // response ready

        // slave AXI-Lite read channel FROM PS
        (* X_INTERFACE_INFO = "xilinx.com:interface:aximm_rtl:1.0 S_AXI_REG ARADDR"  *) input  wire [4:0]  s_axi_reg_araddr,  // address
        (* X_INTERFACE_INFO = "xilinx.com:interface:aximm_rtl:1.0 S_AXI_REG ARPROT"  *) input  wire [2:0]  s_axi_reg_arprot,  // channel protection type
        (* X_INTERFACE_INFO = "xilinx.com:interface:aximm_rtl:1.0 S_AXI_REG ARVALID" *) input  wire        s_axi_reg_arvalid, // address valid
        (* X_INTERFACE_INFO = "xilinx.com:interface:aximm_rtl:1.0 S_AXI_REG ARREADY" *) output wire        s_axi_reg_arready, // address ready
        (* X_INTERFACE_INFO = "xilinx.com:interface:aximm_rtl:1.0 S_AXI_REG RDATA"   *) output wire [31:0] s_axi_reg_rdata,   // data
        (* X_INTERFACE_INFO = "xilinx.com:interface:aximm_rtl:1.0 S_AXI_REG RRESP"   *) output wire [1:0]  s_axi_reg_rresp,   // response
        (* X_INTERFACE_INFO = "xilinx.com:interface:aximm_rtl:1.0 S_AXI_REG RVALID"  *) output wire        s_axi_reg_rvalid,  // data/response valid
        (* X_INTERFACE_INFO = "xilinx.com:interface:aximm_rtl:1.0 S_AXI_REG RREADY"  *) input  wire        s_axi_reg_rready,  // data/response ready



        // master AXI-Stream command channel TO DataMover
        (* X_INTERFACE_INFO = "xilinx.com:interface:axis_rtl:1.0 M_AXIS_CMD TDATA"   *) output reg  [71:0] m_axis_cmd_data,
        (* X_INTERFACE_INFO = "xilinx.com:interface:axis_rtl:1.0 M_AXIS_CMD TREADY"  *) output reg         m_axis_cmd_valid,
        (* X_INTERFACE_INFO = "xilinx.com:interface:axis_rtl:1.0 M_AXIS_CMD TVALID"  *) input  wire        m_axis_cmd_ready,

        // slave AXI-Stream status channel FROM DataMover
        (* X_INTERFACE_INFO = "xilinx.com:interface:axis_rtl:1.0 S_AXIS_STS TDATA"   *) input  wire [7:0]  s_axis_status_data,
        (* X_INTERFACE_INFO = "xilinx.com:interface:axis_rtl:1.0 S_AXIS_STS TKEEP"   *) input  wire [0:0]  s_axis_status_keep,
        (* X_INTERFACE_INFO = "xilinx.com:interface:axis_rtl:1.0 S_AXIS_STS TLAST"   *) input  wire        s_axis_status_last,
        (* X_INTERFACE_INFO = "xilinx.com:interface:axis_rtl:1.0 S_AXIS_STS TREADY"  *) input  wire        s_axis_status_valid,
        (* X_INTERFACE_INFO = "xilinx.com:interface:axis_rtl:1.0 S_AXIS_STS TVALID"  *) output reg         s_axis_status_ready,

        // slave AXI-Stream data channel FROM DataMover
        (* X_INTERFACE_INFO = "xilinx.com:interface:axis_rtl:1.0 S_AXIS_DATA TDATA"  *) input  wire [31:0] s_axis_stream_data,
        (* X_INTERFACE_INFO = "xilinx.com:interface:axis_rtl:1.0 S_AXIS_DATA TKEEP"  *) input  wire [3:0]  s_axis_stream_keep,
        (* X_INTERFACE_INFO = "xilinx.com:interface:axis_rtl:1.0 S_AXIS_DATA TLAST"  *) input  wire        s_axis_stream_last,
        (* X_INTERFACE_INFO = "xilinx.com:interface:axis_rtl:1.0 S_AXIS_DATA TREADY" *) input  wire        s_axis_stream_valid,
        (* X_INTERFACE_INFO = "xilinx.com:interface:axis_rtl:1.0 S_AXIS_DATA TVALID" *) output reg         s_axis_stream_ready,

        // DataMover memory-mapped to stream error
        input wire datamover_mm2s_err
    );
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-02-26 22:09:35

它总是错误地推断出我的模块的时钟频率。我怎么才能解决这个问题?

我从你的git中提取,它在Vivado 2017.4中运行得很好。你可能把几件不同的事情混为一谈,而且很可能是在期待一些不该发生的事情发生。这是完全可以理解的,因为缺乏适当的(但有用的) Vivado IP包和框图工具的文档。

  • 2017.4在功能上与添加部件的2017.3相同,因此这不应导致任何差异。
  • 我为时钟把FREQ_HZ(* X_INTERFACE_PARAMETER ... *)中删除了。这可能导致了你提到的时钟错配,但即使我把它放回去,它现在对我也没问题。但是,FREQ_HZ只应用于输出(生成)时钟;见下文。
  • 当我第一次打开图表或更新main.v并单击输入引脚时,属性表示100 the,就像您所做的那样。但是在一个F6“验证”命令之后,pin正确地报告了10 the。这都是意料之中的事。

  • 您不应该期望CLK_FREQ Verilog参数能够根据引脚神奇地更新。只要模块是新的,GUI中的参数就会采用默认值。他们可以编辑,应该停留在一个更新周期,但有可能,他们将不得不重置,因为主要的编辑。--这取决于您是否设置这些参数来匹配
  • 一些Xilinx内核,如AXI Uartlite,使用一些奇特的、无文档的TCL脚本来在验证时自动将引脚频率传递给Verilog参数。例如,在/opt/Xilinx/Vivado/2017.4/data/ip/xilinx/axi_uartlite_v2_0/bd/bd.tcl文件中,您可以看到这是如何完成的。

这里有记录吗?

有一些关于在UG994中使用HDL模块的文档,“在RTL模块中推断控制信号”,但它不是很完整。这方面最好的文档是在"Lite灯泡“的家伙(克利皮的远亲)中,您可以通过按编辑器工具栏中的小灯泡来达到这个目的。

  • 不请自来的建议#1 -使用RTL模块听起来是个好主意。比完成打包自己IP的工作要容易得多。直到您发现:( a)它只是在后台打包模块,并在每个编辑上自动重新运行;( b)它甚至比包程序还要灵活;( c)您无法控制接口推断等等。学习如何使用包创建真正的IP包。
  • 主动通知#2 -在TCL脚本中保存方框图和项目文件。不要将整个项目或框图.xci和.xml文件放在Git中。请参见类似于:write_bd_tclwrite_project_tcl的命令。如果(经常)需要在项目损坏时重新生成该项目,这将允许完全一致的结果。
  • 最后,这里是我设置(* X_INTERFACE... *)内容的头的一个片段。如果时钟运行AXI总线,也添加ASSOCIATED_BUSIF标志: (* X_INTERFACE_INFO = "xilinx.com:signal:clock:1.0 core_clk CLK“*) (* X_INTERFACE_PARAMETER = "ASSOCIATED_RESET reset”*)输入clk,(* X_INTERFACE_INFO =“xilinx.com:信号:reset:1.0 core_rst RST”*) (* X_INTERFACE_PARAMETER =“极性ACTIVE_HIGH”*)输入rst,
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48983355

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档