UPGRADE YOUR BROWSER

We have detected your current browser version is not the latest one. Xilinx.com uses the latest web technologies to bring you the best online experience possible. Please upgrade to a Xilinx.com supported browser:Chrome, Firefox, Internet Explorer 11, Safari. Thank you!

取消
显示结果 
搜索替代 
您的意思是: 
Newbie foxnboy
Newbie
365 次查看
注册日期: ‎12-10-2016

hls 的 -clock选项可能有bug

转到解答

hls v2018.3,添加axi_lite clk后,读寄存器时用的是-clock指定的时钟,而写寄存器时,用的却是ap_clk,我觉得这应该不是设计初衷。

0 项奖励
1 个已接受解答

已接受的解答
Moderator
Moderator
171 次查看
注册日期: ‎05-27-2018

回复: hls 的 -clock选项可能有bug

转到解答

Hi @foxnboy

      你可以看一下AXI_Write 状态机中 有如下代码,写地址寄存器waddr是以 ACLK为时钟的,所以在控制写数据操作的寄存器由ACLK控制。

      这个也恰巧表明了,UG902,中说的AXI_lite的clock和ap_clk必须是同步的,且频率小于ap_clk,否则写数据会有丢失。

      AXI4-Lite interface clock must be synchronous to the clock used for the synthesized logic
(
ap_clk). That is, both clocks must be derived from the same master generator clock.
      AXI4-Lite interface clock frequency must be equal to or less than the frequency of the clock
used for the synthesized logic (
ap_clk)

 

// waddr
always @(posedge ACLK) begin
    if (ACLK_EN) begin
        if (aw_hs)
            waddr <= AWADDR[ADDR_BITS-1:0];
    end
end

// int_dout[31:0]
always @(posedge clk) begin
if (rst)
int_dout[31:0] <= 0;
else if (w_hs && waddr == ADDR_DOUT_DATA_0)
int_dout[31:0] <= (WDATA[31:0] & wmask) | (int_dout[31:0] & ~wmask);
end

 

-------------------------------------------------------------------------
Don’t forget to reply, kudo, and accept as solution.
-------------------------------------------------------------------------
如果提供的信息能解决您的问题,请标记为“接受为解决方案”。
如果您认为帖子有帮助,请点击“奖励”。谢谢!
-------------------------------------------------------------------------------------------------
0 项奖励
6 条回复
Moderator
Moderator
307 次查看
注册日期: ‎05-27-2018

回复: hls 的 -clock选项可能有bug

转到解答

Hi @foxnboy

     你使用的设计语言是System C还是C/C++?点击这个链接,使用以下指令,创建多个时钟接口的设计只有在System C设计中才能实现。

     ap_clk 是默认生成的端口,不太了解你添加时钟的设计需求,可以说得更详细一些吗?

#pragma HLS clock domain

 

谢谢,

Wen

-------------------------------------------------------------------------
Don’t forget to reply, kudo, and accept as solution.
-------------------------------------------------------------------------
如果提供的信息能解决您的问题,请标记为“接受为解决方案”。
如果您认为帖子有帮助,请点击“奖励”。谢谢!
-------------------------------------------------------------------------------------------------
0 项奖励
Newbie foxnboy
Newbie
285 次查看
注册日期: ‎12-10-2016

回复: hls 的 -clock选项可能有bug

转到解答

我用的c++,按照最新的ug902 P436,axilite接口是可以指定时钟的,以下是一个例子:

这是源码和directives:

void tests(volatile unsigned int *dout) {
#pragma HLS INTERFACE m_axi depth=128 port=dout offset=slave bundle=b
#pragma HLS TOP
#pragma HLS INTERFACE s_axilite port=return bundle=a clock=axilite_clk

	int i;
	for(i=0;i<100;i++) {
		*(dout+i) = i;
	}

}

生成verilog以后,m_axi的offset寄存器地址为0x10:

    ADDR_AP_CTRL     = 5'h00,
    ADDR_GIE         = 5'h04,
    ADDR_IER         = 5'h08,
    ADDR_ISR         = 5'h0c,
    ADDR_DOUT_DATA_0 = 5'h10,
    ADDR_DOUT_CTRL   = 5'h14,

以下是axilite读这个寄存器的verilog,可以看到用的是ACLK,即axi的时钟:

// rdata
always @(posedge ACLK) begin
    if (ACLK_EN) begin
        if (ar_hs) begin
            rdata <= 1'b0;
            case (raddr)
                ADDR_AP_CTRL: begin
                    rdata[0] <= int_ap_start;
                    rdata[1] <= int_ap_done;
                    rdata[2] <= int_ap_idle;
                    rdata[3] <= int_ap_ready;
                    rdata[7] <= int_auto_restart;
                end
                ADDR_GIE: begin
                    rdata <= int_gie;
                end
                ADDR_IER: begin
                    rdata <= int_ier;
                end
                ADDR_ISR: begin
                    rdata <= int_isr;
                end
                ADDR_DOUT_DATA_0: begin
                    rdata <= int_dout[31:0];
                end
            endcase
        end
    end
end

以下是axilite写这个寄存器的代码:

// int_dout[31:0]
always @(posedge clk) begin
    if (rst)
        int_dout[31:0] <= 0;
    else if (w_hs && waddr == ADDR_DOUT_DATA_0)
        int_dout[31:0] <= (WDATA[31:0] & wmask) | (int_dout[31:0] & ~wmask);
end

可以看到用的是ap_clk的时钟。

我也看ug902里说systemc可以指定多个时钟,c/c++只能有一个统一的时钟,可是P436的解释似乎是适用于c/c++的。如果P436的解释是针对systemc的那么以上源文件生成verilog时应该报错才对。

0 项奖励
Moderator
Moderator
215 次查看
注册日期: ‎05-27-2018

回复: hls 的 -clock选项可能有bug

转到解答

Hi @foxnboy

     1、看了一下工程,读和写的时钟不一样,在Verilog上使用的一个是clk,一个是ACLK,是你的设计初衷吗?

     2、手册里P109-110面说的C和C++中,有接口指令: INTERFACE directive clock option, 其实是一个接口指令,给每个AXI_lite 接口指定独立的时钟接口,并且只能和AP_clk同步,且频率小于等于ap_clk。功能在于给你创立的axi_lite接口加以独立于ap_clk的axi_clock。

hls_clock.png

     3、以上接口时钟指令和用于SystemC的优化指令create_clock不同也不冲突 。

每个 SC_MODULE可以在综合的时候拥有不同的时钟频率。P128、403上说明了这是一个虚拟的时钟,最终是在不同solution中让用户去优化延迟,时钟裕量等。

     还有问题欢迎继续交流~

 

谢谢,

Wen

-------------------------------------------------------------------------
Don’t forget to reply, kudo, and accept as solution.
-------------------------------------------------------------------------
如果提供的信息能解决您的问题,请标记为“接受为解决方案”。
如果您认为帖子有帮助,请点击“奖励”。谢谢!
-------------------------------------------------------------------------------------------------
0 项奖励
Newbie foxnboy
Newbie
205 次查看
注册日期: ‎12-10-2016

回复: hls 的 -clock选项可能有bug

转到解答

1.这不是我的设计目标。

2.我用的就是这个directive,想用这个directive达到你说的这个目的。

3.上次我贴的那个代码,实际上会在s_axilite空间中生成一个寄存器(0x10),这个寄存器的作用是让主机通过s_axilite接口配置m_axi接口的地址偏移量(ug902-p123),

 而由于这个寄存器的写时钟并不是ACLK(即s_axilite)时钟,所以造成这个寄存器只能读不能写,所以我认为这是一个bug。

4.我不会sc,所以没法用sc验证是否有这个问题。但c/c++上生成的hdl确实是与文档上说的不一样,且没有任何warning或error

0 项奖励
Moderator
Moderator
172 次查看
注册日期: ‎05-27-2018

回复: hls 的 -clock选项可能有bug

转到解答

Hi @foxnboy

      你可以看一下AXI_Write 状态机中 有如下代码,写地址寄存器waddr是以 ACLK为时钟的,所以在控制写数据操作的寄存器由ACLK控制。

      这个也恰巧表明了,UG902,中说的AXI_lite的clock和ap_clk必须是同步的,且频率小于ap_clk,否则写数据会有丢失。

      AXI4-Lite interface clock must be synchronous to the clock used for the synthesized logic
(
ap_clk). That is, both clocks must be derived from the same master generator clock.
      AXI4-Lite interface clock frequency must be equal to or less than the frequency of the clock
used for the synthesized logic (
ap_clk)

 

// waddr
always @(posedge ACLK) begin
    if (ACLK_EN) begin
        if (aw_hs)
            waddr <= AWADDR[ADDR_BITS-1:0];
    end
end

// int_dout[31:0]
always @(posedge clk) begin
if (rst)
int_dout[31:0] <= 0;
else if (w_hs && waddr == ADDR_DOUT_DATA_0)
int_dout[31:0] <= (WDATA[31:0] & wmask) | (int_dout[31:0] & ~wmask);
end

 

-------------------------------------------------------------------------
Don’t forget to reply, kudo, and accept as solution.
-------------------------------------------------------------------------
如果提供的信息能解决您的问题,请标记为“接受为解决方案”。
如果您认为帖子有帮助,请点击“奖励”。谢谢!
-------------------------------------------------------------------------------------------------
0 项奖励
Newbie foxnboy
Newbie
162 次查看
注册日期: ‎12-10-2016

回复: hls 的 -clock选项可能有bug

转到解答
应该是这个原因,多谢
0 项奖励