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!

AR# 24751

9.1i EDK microblaze_v4_00_a - FSL "put" operation drops data in nonblocking mode


There are occasional drops of data during nonblocking FSL "put" operations. The specific code used for FSL channel transfers qualifies the success of the write based on the fsl_isinvalid macro, shown below.

int isinvalid = 0;

if (queueNum == 0) nputfsl(value, 0);

else if (queueNum == 1) nputfsl(value, 1);


where fsl_isinvalid is defined in mb_interface.h as:

#define fsl_isinvalid(result) asm volatile ("addic\t%0,r0,0" : "=d" (result))

Data drops occur only occasionally (perhaps 1 out of every 13K writes) with fsl_isinvalid setting the isinvalid variable correctly most of the time.

If I implement a custom check for invalid writes to the FSL as shown below, then I get reliable performance out of the fsl writes with no dropped data across millions of FSL transfers. The custom solution checks the carry bit from the MSR explicitly instead of relying on the add with carry as defined in the macro.

int isinvalid = 0;

register unsigned int msr_var;

if (queueNum == 0) nputfsl(value, 0);

else if (queueNum == 1) nputfsl(value, 1);

asm volatile ("mfs %0, rmsr" : "=d" (msr_var));

isinvalid = (msr_var & 0x4);


This issue is officially fixed for MicroBlaze v6.00.a, available in EDK 9.1i at:


The problem was caused by erroneously checking the FSL full signal during two clock cycles. This issue also affected nonblocking FSL "get" instructions.

AR# 24751
Date 12/15/2012
Status Active
Type General Article