a SHARC Processor Silicon Anomaly List ADSP-21483/21486/21487/21488/21489 ABOUT ADSP-21483/21486/21487/21488/21489 SILICON ANOMALIES These anomalies represent the currently known differences between revisions of the SHARC®ADSP-21483/21486/21487/21488/21489 product(s) and the functionality specified in the ADSP-21483/21486/21487/21488/21489 data sheet(s) and the Hardware Reference book(s). SILICON REVISIONS A silicon revision number with the form "-x.x" is branded on all parts (see the data sheet for information on reading part branding). The silicon revision can also be electronically read by reading the REVPID and ROMID registers either via JTAG or DSP code. The following DSP code can be used to read the register: UREG = dm(REVPID); UREG = dm(ROMID); Silicon REVISION REVPID[7:4] ROMID[4:0] Applicable Product 0.3 b#0010 b#00001 ADSP-21486/21487 0.2 b#0010 b#00000 ADSP-21483/21486/21487/21488/21489 ANOMALY LIST REVISION HISTORY The following revision history lists the anomaly list revisions and major changes for each anomaly list revision. Date Anomaly List Revision Data Sheet Revision Additions and Changes 03/05/2014 K B Added anomaly 15000031 08/21/2013 J B Added anomaly 15000029 and 15000030 05/17/2013 I B Added anomaly 15000028, Modified Anomaly 15000014 07/09/2012 H A Added anomaly 15000024 01/30/2012 G 0 Added anomaly 15000023 09/20/2011 F 0 Modified anomaly 15000020, Added anomaly 15000021 10/26/2010 E PrA Added anomaly 15000020 07/20/2010 D PrA Modified anomaly 15000016 06/30/2010 C PrA Added anomaly 15000018, Included information about 0.2 silicon 03/17/2010 B PrA Title of the document is updated to reflect correct part numbers 02/24/2010 A PrA Initial release SHARC and the SHARC logo are registered trademarks of Analog Devices, Inc. NR004008K Information furnished by Analog Devices is believed to be accurate and reliable. However, no responsibility is assumed by Analog Devices for its use, nor for any infringements of patents or other rights of third parties that may result from its use. Specifications subject to change without notice. No license is granted by implication or otherwise under any patent or patent rights of Analog Devices. Trademarks and registered trademarks are the property of their respective owners. One Technology Way, P.O.Box 9106, Norwood, MA 02062-9106 U.S.A. Tel: 781.329.4700 www.analog.com Fax: 781.461.3113 ©2014 Analog Devices, Inc. All rights reserved. ADSP-21483/21486/21487/21488/21489 Silicon Anomaly List SUMMARY OF SILICON ANOMALIES The following table provides a summary of ADSP-21483/21486/21487/21488/21489 anomalies and the applicable silicon revision(s) for each anomaly. No. ID Description 0.2 0.3 1 15000002 Incorrect Popping of stacks possible when exiting IRQx/Timer Interrupts with DB modifier x x 2 3 15000003 IOP Register access immediately following an External Memory access may not work x x 15000004 Effect latency of some System Registers may be 2 cycles instead of 1 for External data accesses x x 4 15000005 Writes to LCNTR, CURLCNTR and LADDR from Internal Memory may fail if there is a DMA block conflict x x 5 15000010 Incorrect value when the results of Enhanced Modify/BITREV Instruction are used in the very next Instruction x x 6 15000012 Latency with external FLAG-based Conditional instructions involving DAG register post-modify operation x x 7 15000014 Special PLL Initialization Sequence required if MediaLB interface is used in DMA-driven transfer mode x x 8 15000018 SPORT DMA may not work as expected, when SPORTs from the same DMA group access both the external memory and internal memory for data and/or TCB and other peripheral DMAs (including SPORT DMAs in other groups) are also enabled in parallel x x 9 15000020 PLL Programming may not take effect under specific conditions x x 10 15000021 After an emulator halt at the instruction before ‘idle' instruction, the Core Timer stops decrementing even after code execution restarts x x 11 15000023 A three column data access over DM bus immediately following an indirect delayed branch (db) may not work as expected in VISA mode x x 12 15000024 Execution of the instructions in VISA space from internal memory may execute corrupted instructions when either of the two most recent write operations has updated the locations holding these instructions or the neighboring locations x x 13 15000028 Internal Memory write gets incorrect value in presence of external memory access in Type-1 instruction under certain conditions x x 14 15000029 UART stop bit width smaller than expected for UART divisor values of 3 or greater x x 15 15000030 Initial state of /WDTRSTO signal can be High or Low until WDT_CLKIN starts switching. x x 16 15000031 Read access and Write access Breakpoint do not function reliably for external memory data address ranges x x Key: x = anomaly exists in revision . = Not applicable NR004008K | Page 2 of 21 | March 2014 Silicon Anomaly List ADSP-21483/21486/21487/21488/21489 DETAILED LIST OF SILICON ANOMALIES The following list details all known silicon anomalies for the ADSP-21483/21486/21487/21488/21489 including a description, workaround, and identification of applicable silicon revisions. 1. 15000002 - Incorrect Popping of stacks possible when exiting IRQx/Timer Interrupts with DB modifier: DESCRIPTION: If a delayed branch modifier (DB) is used to return from the interrupt service routines of any of IRQx (hardware) or timer interrupts, the automatic popping of ASTATx/ASTATy/MODE1 registers from the status stack may not work correctly. The specific instructions affected by this anomaly are "RTI(DB);" and "JUMP(CI)(DB);". This anomaly affects only IRQx and Timer Interrupts as these are the only interrupts that cause the sequencer to push an entry onto the status stack. This anomaly applies to both internal and external memory execution. WORKAROUND: Do not use (DB) modifiers in instructions exiting IRQ or Timer ISRs. Instructions in the delay slot should be moved to a location prior to the branch. Note: This workaround may be built into the development tool chain and/or into the operating system source code. For tool chains and Operating Systems supported by ADI, such as VisualDSP++ and VDK please consult the "Silicon Anomaly Tools Support" help page in the applicable documentation and release notes for details. APPLIES TO REVISION(S): 0.2, 0.3 2. 15000003 - IOP Register access immediately following an External Memory access may not work: DESCRIPTION: If an instruction making an access to an IOP register immediately follows another instruction that performs an access to external memory, the IOP register access may not occur correctly. WORKAROUND: Separate the two instructions by inserting another instruction in between them, such as a NOP. APPLIES TO REVISION(S): 0.2, 0.3 NR004008K | Page 3 of 21 | March 2014 ADSP-21483/21486/21487/21488/21489 Silicon Anomaly List 3. 15000004 - Effect latency of some System Registers may be 2 cycles instead of 1 for External data accesses: DESCRIPTION: The following registers that have an effect latency of 1 (the maximum number of instructions it takes for a write to these registers to take effect) will instead have an effect latency of 2 if any of their bits impact an instruction containing an external data access: MODE1, MODE2, MMASK, SYSCTL, BRKCTL, ASTATx, ASTATy, STKYx, and STKYy. For example, consider the following sequence of instructions: bit set MODE1 BR8; nop; //Sufficient if not immediately followed by external memory access instruction nop; //Extra NOP needed if following instruction accesses external memory pm(i8,m12)=f9; //i8 is pointing to an address in external memory Registers other than the ones listed above are not affected by this anomaly. Note: This anomaly is independent of whether the instruction itself resides in internal or external memory. Rather, the anomaly is encountered if there are external memory data accesses within the two instructions immediately following the register modification. WORKAROUND: If any of the above registers with an effect latency of 1 is modified, it is recommended that no accesses involving external memory (over either PM or DM bus) are performed in the two instructions immediately following the register modification. It is recommended to insert two NOPs after such register modifications. APPLIES TO REVISION(S): 0.2, 0.3 4. 15000005 - Writes to LCNTR, CURLCNTR and LADDR from Internal Memory may fail if there is a DMA block conflict: DESCRIPTION: Writes to LCNTR, CURLCNTR and LADDR from internal memory (either as a DM access or as a PM access) may fail when a DMA transfer to/ from the same block occurs in the same cycle. For example, consider the following instruction: CURLCNTR = dm(i0,m0); Now consider any DMA access involving the same memory block as pointed to by address (i0+m0). If the DMA and the above write align in such a way that DMA transfer happens in the same cycle as the above instruction, then the above write will fail. Note: This anomaly also occurs if (i0+m0) points to a memory-mapped I/O register. WORKAROUND: 1. Change the DMA to source/target a different internal memory block thereby avoiding any DMA block conflict. 2. Instead of loading these registers directly from memory, they can be loaded indirectly as a 2-step process as shown below: r0 = dm(i0,m0); CURLCNTR = r0; APPLIES TO REVISION(S): 0.2, 0.3 NR004008K | Page 4 of 21 | March 2014 Silicon Anomaly List ADSP-21483/21486/21487/21488/21489 5. 15000010 - Incorrect value when the results of Enhanced Modify/BITREV Instruction are used in the very next Instruction: DESCRIPTION: In the following specific sequence of instructions, the memory or the register load in INSTR3 will not contain the correct updated value of the DAG register Ia from INSTR2, but rather its value from INSTR1: INSTR1: Ia = <immediate load | register load | memory load>; INSTR2: Ia = MODIFY|BITREV (Ib, Mc); INSTR3: <memory load | register load> = Ia; Note: This anomaly is only applicable in the case where Ia and Ib are unique and different. WORKAROUND: The user must avoid the above exact sequence of instructions which might produce an incorrect result. Note: This workaround may be built into the development tool chain and/or into the operating system source code. For tool chains and Operating Systems supported by ADI, such as VisualDSP++ and VDK please consult the "Silicon Anomaly Tools Support" help page in the applicable documentation and release notes for details. APPLIES TO REVISION(S): 0.2, 0.3 6. 15000012 - Latency with external FLAG-based Conditional instructions involving DAG register postmodify operation: DESCRIPTION: External FLAG-based Conditional instructions involving DAG register post-modify operation must not be followed immediately by an instruction that uses the same index register. For example, in the following instruction sequence shown below: INSTR1: IF COND dm(Ia,Mb); //any instruction that involves post-modify operation INSTR2: dm(Ia,Mc); //any instruction that depends on updated Ia value The value of the DAG index register in INSTR2 will either be Ia or (Ia+Mb) depending on whether INSTR1 was aborted or executed. In the unique case where COND is an external FLAG condition (for example, say FLAG2_IN) which is set asynchronously by an external source or event, the necessary internal stalls which would result in the DAG index register getting the correct value do not take effect, and consequently the value of the DAG index register in INSTR2 may not contain the correct and expected value. WORKAROUND: Separate the instructions in the above sequence by at least two NOPs. APPLIES TO REVISION(S): 0.2, 0.3 NR004008K | Page 5 of 21 | March 2014 ADSP-21483/21486/21487/21488/21489 Silicon Anomaly List 7. 15000014 - Special PLL Initialization Sequence required if MediaLB interface is used in DMA-driven transfer mode: DESCRIPTION: The MediaLB interface's DMA clock may lose synchronization with the processor's internal clock if the procesor's PLL is placed in bypass mode as part of the initial initialization sequence. WORKAROUND: Use the following instruction sequence while initializing the PLL if using MediaLB interface in DMA-driven transfer mode: 1. Disable clock to the MediaLB interface. ustat4 = dm(PMCTL1); bit set ustat4 MLBOFF; R2=dm(MLB_VCCR); // any "dummy" read of an IOP register outside of the core to force // clock synchronization between core and peripheral clock domains dm(PMCTL1) = ustat4; 2. Place PLL in bypass mode. 3. Proceed with programming PLL parameters as per default guidelines. Provide sufficient delay in order for the changes to take effect, again as per default guidelines. 4. Bring PLL out of bypass mode and re-enable the clock to the MediaLB interface: ustat1 = dm(PMCTL); bit clr ustat1 PLLBP; ustat4 = dm(PMCTL1); bit clr ustat4 MLBOFF; dm(PMCTL) = ustat1; dm(PMCTL1) = ustat4; Ensure that the above instruction sequence is executed from within internal memory, is not interrupted, and that there is no background DMA activity. Note1: The above procedure does not need to be followed if the MediaLB interface is not used in a system, or if the MediaLB interface is expected to operate only with core-driven data transfers. Note2: For programming the PLL parameters, the work-around as mentioned in Anomaly ID 15000020 should be followed. APPLIES TO REVISION(S): 0.2, 0.3 NR004008K | Page 6 of 21 | March 2014 Silicon Anomaly List ADSP-21483/21486/21487/21488/21489 8. 15000018 - SPORT DMA may not work as expected, when SPORTs from the same DMA group access both the external memory and internal memory for data and/or TCB and other peripheral DMAs (including SPORT DMAs in other groups) are also enabled in parallel: DESCRIPTION: The SPORT DMA channels for the SHARC processors are arranged in 4 groups as follows: a. b. c. d. Group 1 : DMA channels for the SPORTs 0 and 1 (SP0A,SP0B, SP1A and SP1B) Group 2 : DMA channels for the SPORTs 2 and 3 (SP2A,SP2B, SP3A and SP3B) Group 3 : DMA channels for the SPORTs 4 and 5 (SP4A,SP4B, SP5A and SP5B) Group 4 : DMA channels for the SPORTs 6 and 7 (SP6A,SP6B, SP7A and SP7B) The SPORT DMA may not work as expected, when the SPORTs from the same group are enabled in DMA mode with read/write transactions to both internal and external memory and another DMA also enabled in parallel. This problem is applicable for both the normal DMA mode and DMA chaining mode of SPORT DMAs. When the problem occurs, the data read from the memory may not be correct for the SPORT transmit DMA. For the chaining DMA operations, additionally the TCB may also not be loaded correctly. For the receive DMA case, the data written to the memory will be correct but the latency between two successive writes will increase. WORKAROUND: 1. For normal DMA mode, place all the SPORT DMA buffers belong to the same group either in internal memory or in external memory,but not on both. 2. For DMA chaining mode, place both the SPORT TCBs and SPORT DMA buffers belong to the same group, either in internal memory or in the external memory, but not on both. APPLIES TO REVISION(S): 0.2, 0.3 NR004008K | Page 7 of 21 | March 2014 ADSP-21483/21486/21487/21488/21489 Silicon Anomaly List 9. 15000020 - PLL Programming may not take effect under specific conditions: DESCRIPTION: The PLL programming in software may not work as expected under specific conditions of temperature, frequency, and operating voltage. This can be because of one or both of the following issues: 1. The PLL may not get programmed to the new multiplier (PLLM) value in software. The reason for the failure is that the new PLL multiplier value configured using the PLLM bits is not updated correctly and the PLL continues to use the previous multiplier value only. The symptom of this issue will be that the PLL will continue to work at the old frequency (regardless of the new value programmed). This issue is however not seen for the cases where any portion of the PLL divider circuitry alone is re-programmed (such as for example INDIV, PLLD, LPCKR, or SDCKR/DDR2CKR ratios). 2. The PLL may fail to enter the bypass mode because of either of the following two possible reasons: a. If setting of the PLLBP bit coincides with certain specific alignment of internal clocks (not visible externally). Since the offending internal alignment is not visible externally, though a code may not show this failure, it is still recommended to use the workaround mentioned below. It should also be noted that though adding/ removing few instructions (e.g. "nop" instructions) before the instruction which sets the PLLBP bit may either avoid or cause the failure, it shouldn't be used as a workaround. b. If the CCLK: SDCLK/DDR2CLK (SDCKR/DDR2CKR) ratio is programmed to 4:1 and it coincides with a specific alignment of internal clocks(not visible externally), some internal clocks may lose mutual synchronization. This synchronization is necessary for the PLL to enter into the bypass mode. Thus, if this change is followed by a code which sets the PLLBP bit, the PLL may fail to enter into the bypass mode. Like in the issue (a), in this issue as well, though adding/removing few instructions before (e.g. "nop" instructions) the instruction which performs the SDCKR/DDR2CKR ratio change may avoid or cause the failure, it shouldn't be used as a workaround. This issue is not applicable for cases where the PLLD, and (or) the LPCKR(ADSP-2146x only) clock ratios are alone reprogrammed, or if the SDCKR/DDR2CKR ratio is programmed to ratios other than 4:1, without any modifications to the PLLM and the INDIV bits. The following are some of the symptoms of this issue: i. The synchronization between SDCLK/DDR2CLK and peripheral clock (PCLK)may be lost as a result of which the core might hang when trying to perform core external port accesses (AMI/SD/DDR2DRAM). ii. Some of the peripherals (e.g. SPORT, UART etc.) may run at an unexpected frequency after the PLL programming. iii. Entering into the bypass mode is important for the PLLM/INDIV change to take effect. Thus, another symptom of this issue is that the new PLLM and (or)INDIV values may not take effect. But if the failed bypass entry is followed by a SDCKR/DDR2CKR or PLLD change to a new value, the new PLLM and (or) INDIV may erroneously take effect. However, it should be noted that this phenomenon is not guaranteed and should not be used as a workaround.To understand this better, let us consider a scenario where at a particular point,CLKIN=25 MHz, PLLM = 8, SDCKR=4, INDIV=0, and PLLD=2, which gives fCCLK=200MHz. Let us assume a case where it is only required to reprogram the PLL to a new PLLM value (say 16) to get CCLK speed of 400 MHz.While in another case, in addition to the PLLM change to 16, it is also required to change the SDCKR ratio to 2.5 to get SDCLK speed of 160 MHz. Assume that the following code is used for both the cases where the SDCKR change step is not applicable for the first case. //Set the new value of PLLM (16) and set the PLLBP bit to enter the bypass mode ustat1 = dm(PMCTL); bit clr ustat1 PLLM63; bit set ustat1 PLLM16 | PLLBP; dm(PMCTL) = ustat1; lcntr=4096, do delay1 until lce; delay1:nop; //Clear the PLLBP bit to come out of the bypass mode ustat1 = dm(PMCTL); bit clr ustat1 PLLBP; dm(PMCTL) = ustat1; lcntr=16, do delay2 until lce; delay2:nop; //Change the SDCKR ratio from 4 to 2.5 - only applicable for the second case ustat1 = dm(PMCTL); bit clr ustat1 SDCKR3_5 | SDCKR4; bit set ustat1 SDCKR2_5 | DIVEN; dm(PMCTL) = ustat1; In this scenario, if the PLL fails to enter into the bypass mode because of any of the above two mentioned issues, the new PLLM value NR004008K | Page 8 of 21 | March 2014 Silicon Anomaly List ADSP-21483/21486/21487/21488/21489 (16) will not take effect and the CCLK may still continue to run at 200 MHz even after the PLLBP bit is cleared. For the first case, the CCLK will always remain at 200 MHz as there was no SDCKR/PLLD change. However, for the second case, the CCLK will be 200 MHz before performing the SDCKR change to 2.5. But, after the SDCKR change, the new value of PLLM (16) may erroneously take effect and the CCLK speed may change to the expected value i.e. 400 MHz and consequently the SDCLK may also be changed to the expected value (160 MHz). WORKAROUND: CASE 1 - issue 1 and 2(a) To take care of the issues 1 and 2 (a), the following sequence should be used to re-program the PLL in software when PLLM and/or INDIV change is required: 1. 1st write to the PMCTL registerIf SDCKR/DDR2CKR change is also needed and the final/required values of both PLLD and SDCKR are 4: Set the PLLD to 8, set the DIVEN bit, and do not change the PLLM value. Else: Set the PLLD to 4, set the DIVEN bit, and do not change the PLLM value. 2. Wait for at least 16 CCLK cycles. 3. 2nd write to the PMCTL registerClear the DIVEN bit, set the INDIV bit, and set the PLLBP bit. PLL goes into the bypass mode the first time. 4. Wait for at least 4096 CCLK cycles. 5. 3rd write to the PMCTL registerClear the PLLBP bit. PLL comes out of the bypass mode. 6. Wait for at least 16 CCLK cycles. 7 4th write to the PMCTL registerSet the new PLLM and INDIV values, clear the DIVEN bit, set the PLLBP bit. PLL goes into the bypass mode the second time. 8. Wait for at least 4096 CCLK cycles. 9. 5th write to the PMCTL registerClear the PLLBP bit. PLL comes out of the bypass mode. 10. Wait for at least 16 CCLK cycles. 11. 6th write to the PMCTL registerSet the new PLLD, SDCKR/DDR2CKR, and LPCKR (only for 2146x) values, and set the DIVEN bit. 12. Wait for at least 16 CCLK cycles. The following important points should be noticed regarding the PLL programming sequence mentioned above: 1. Step 1 takes care of the issue 2(a) by changing the PLLD to 4 or 8 which avoids the occurrence of the offending internal clock alignment condition while setting the PLLBP bit. 2. Steps 3-6 take care of issue 1 by setting INDIV and bringing down the VCO frequency below fVCOmax/2 (please refer to the corresponding data sheet for the fVCO expression and the fVCOmax specification). This implies that: a. These steps are not needed if the VCO is already running at a speed less than fVCOmax/2. b. There is no workaround for the case where the PLL has to be re-programmed to a new PLLM value, the VCO is running above fVCOmax/2, and the INDIV bit is already set. Since the reset value of the INDIV bit is zero, this restriction applies only to a case where the PLL has to be reprogrammed more than once in software.In such a case, for all the PLL programming attempts other than the last one, the VCO speed should always be less than fVCOmax/2 if the INDIV bit is set. If the VCO speed more than or equal to fVCOmax/2 is required, use INDIV =0 with half of the PLLM value than the one which would have been used with INDIV=1(it may however result in loss of fCCLK precision). 3. Steps 7-10 are the normal PLL programming sequence to program the new PLLM and/or INDIV values. 4. Steps 11 and 12 are required only if the required value of PLLD is different from the one programmed in step 1 and/or if SDCKR/DDR2CKR and/or LPCKR (2146x only) change is required. NR004008K | Page 9 of 21 | March 2014 ADSP-21483/21486/21487/21488/21489 Silicon Anomaly List Example assembly code sequence: #include <def21489.h> // for ADSP-2148x processors // #define PLLD4_SDCKR4 //Uncomment this line if the final/required values //of PLLD=4 and SDCKR/DDR2CKR=4 //Step 1 #ifdef PLLD4_SDCKR4 //If the final/required values of PLLD=4 and SDCKR/DDR2CKR=4 ustat1 = dm(PMCTL); bit clr USTAT1 PLLD16 ; bit set USTAT1 PLLD8 | DIVEN ; dm(PMCTL) = ustat1; #else //If !(the final/ required values of PLLD=4 and SDCKR/DDR2CKR=4) ustat1 = dm(PMCTL); bit clr USTAT1 PLLD16 ; bit set USTAT1 PLLD4 | DIVEN ; dm(PMCTL) = ustat1; #endif //Step 2 lcntr=16, do first_div_delay until lce; first_div_delay: nop; //Step 3 bit clr ustat1 DIVEN; bit set ustat1 INDIV | PLLBP; dm(PMCTL) = ustat1; //Step 4 lcntr=4096, do first_bypass_delay until lce; first_bypass_delay:nop; //Step 5 ustat1 = dm(PMCTL); bit clr ustat1 PLLBP; dm(PMCTL) = ustat1; //Step 6 lcntr=16, do second_div_delay until lce; second_div_delay:nop; //Step 7 ustat1 = dm(PMCTL); bit clr ustat1 INDIV | PLLM63; //Set the new values of PLLM and INDIV here: PLLM18, INDIV=0 in this example bit set ustat1 PLLM18 | PLLBP; dm(PMCTL) = ustat1; //Step 8 lcntr=4096, do second_bypass_delay until lce; second_bypass_delay:nop; //Step 9 ustat1 = dm(PMCTL); bit clr ustat1 PLLBP; dm(PMCTL) = ustat1; //Step 10 lcntr=16, do third_div_delay until lce; third_div_delay:nop; //Step 11 ustat1 = dm(PMCTL); NR004008K | Page 10 of 21 | March 2014 Silicon Anomaly List ADSP-21483/21486/21487/21488/21489 //0x1C0000 is mask for the SDCKR bit field bit clr ustat1 PLLD16|0x1C0000; //Set the new values of PLLD and SDCKR here: bit set ustat1 SDCKR2 | PLLD2 | DIVEN; dm(PMCTL) = ustat1; //Step 12 lcntr=16, do fourth_div_delay until lce; fourth_div_delay: nop; Example C Code sequence: #include <def21489.h> // for ADSP-2148x processors #include <cdef21489.h> // #define PLLD4_SDCKR4 //Uncomment this line if the final/required values of //PLLD=4 and SDCKR/DDR2CKR=4 int temp,i; //Step 1 #ifdef PLLD4_SDCKR4 //If the final/required values of PLLD=4 and SDCKR/DDR2CKR=4 temp=*pPMCTL; temp&=~PLLD16 ; temp|=(PLLD8 | DIVEN) ; *pPMCTL = temp; #else //If !( the final/required values of PLLD=4 and SDCKR/DDR2CKR=4) temp=*pPMCTL; temp&=~PLLD16 ; temp|=(PLLD4 | DIVEN) ; *pPMCTL = temp; #endif //Step 2 for(i=0;i<16;i++); //Step 3 temp&=~DIVEN; temp|=(INDIV | PLLBP); *pPMCTL = temp; //Step 4 for(i=0;i<4096;i++); //Step 5 temp=*pPMCTL; temp&=~PLLBP; *pPMCTL = temp; //Step 6 for(i=0;i<16;i++); //Step 7 temp = *pPMCTL; temp&=~ (INDIV | PLLM63); //Set the new values of PLLM and INDIV here: //PLLM18, INDIV=0 in this example temp|= (PLLM18| PLLBP); *pPMCTL = temp; //Step 8 for(i=0;i<4096;i++); //Step 9 temp = *pPMCTL; temp&=~PLLBP; NR004008K | Page 11 of 21 | March 2014 ADSP-21483/21486/21487/21488/21489 Silicon Anomaly List *pPMCTL=temp; //Step 10 for(i=0;i<16;i++); //Step 11 temp=*pPMCTL; //0x1C0000 is mask for the SDCKR bit field temp&=~(PLLD16 | 0x1C0000 ); //Set the new values of PLLD and SDCKR here: temp|= (SDCKR2 | PLLD2 | DIVEN); *pPMCTL=temp; //Step 12 for(i=0;i<16;i++); CASE 2- issue 2(b) To take care of the issue 2(b), the following sequence should be followed if SDCKR/DDR2CKR ratio change to 4 alone is required without changing PLLM and INDIV values, and another PLLM and (or) INDIV change is required afterwards: 1. 1st write to the PMCTL registerSet the PLLD to a value different than the original one and set the DIVEN bit. 2. Wait for at least 16 CCLK cycles. 3. 2nd write to the PMCTL registerSet the PLLD to the original value back, set the SDCKR/DDR2CKR to 4, and set the DIVEN bit. 4. Wait for at least 16 CCLK cycles. Example assembly code sequence: #include <def21489.h> // for ADSP-2148x processors //Step 1 ustat1 = dm(PMCTL); bit clr USTAT1 PLLD16 ; //Example: set PLLD8 if the original value is PLLD4 bit set USTAT1 PLLD8 | DIVEN ; dm(PMCTL) = ustat1; //Step 2 lcntr=16, do div_delay1 until lce; div_delay1: nop; //Step 3 ustat1 = dm(PMCTL); //0x1C0000 is mask for the SDCKR bitfield bit clr USTAT1 PLLD16|0x1C0000 ; //Example: set the original value (PLLD4) back and set SDCKR4 bit set USTAT1 PLLD4 | DIVEN|SDCKR4 ; dm(PMCTL) = ustat1; //Step 4 lcntr=16, do div_delay2 until lce; div_delay2: nop; Example C code sequence: #include <def21489.h> // for ADSP-2148x processors #include <cdef21489.h> int temp, i; //Step 1 temp=*pPMCTL; NR004008K | Page 12 of 21 | March 2014 Silicon Anomaly List ADSP-21483/21486/21487/21488/21489 temp&=~PLLD16 ; //Example: set PLLD8 if the original value is PLLD4 temp|=(PLLD8 | DIVEN) ; *pPMCTL = temp; //Step 2 for(i=0;i<16;i++); //Step 3 temp=*pPMCTL; //0x1C0000 is mask for the SDCKR bitfield temp&=~(PLLD16 | 0x1C0000 ); //Example: set the original value (PLLD4) back and set SDCKR4 temp|= (SDCKR4 | PLLD4 | DIVEN); *pPMCTL=temp; //Step 4 for(i=0;i<16;i++); Note: The following points are applicable for all the above mentioned workaround codes: 1. Applicable only for ADSP-2147x: It is possible that while executing some of the steps of the workaround code, the VCO speed may go below its minimum specified value in the datasheet. This is allowed only during the execution of the workaround code as long as the VCO speed is not less than 150MHz. However, after the execution of the complete workaround, the VCO speed should adhere to the limits specified in the datasheet. 2. Both assembly and C workaround codes can be used in the VISA/NON VISA mode. 3. Both assembly and C workaround codes can be used with/without interrupts enabled. 4. Optimization should be disabled for the C workaround codes. Various compiler pragmas can be used to selectively turn off the optimization during the workaround codes. E.g. the code below turns off the compiler optimization before the workaround code and turns it on (back to command line optimization settings) again afterward. #pragma optimize_off Put the workaround code here…. #pragma optimize_as_cmd_line APPLIES TO REVISION(S): 0.2, 0.3 NR004008K | Page 13 of 21 | March 2014 ADSP-21483/21486/21487/21488/21489 Silicon Anomaly List 10. 15000021 - After an emulator halt at the instruction before ‘idle' instruction, the Core Timer stops decrementing even after code execution restarts: DESCRIPTION: When the processor is halted at a breakpoint in an emulator session, the core timer correctly stops decrementing and restarts when code execution is resumed. However, if the emulator breakpoint is placed at an instruction just before an idle instruction, the core timer remains halted even after the code execution is resumed. In the example code below, the core timer remains halted after code execution is resumed following the core halt at Instruction1. The same behavior is seen if Instruction1 is executed by ‘single stepping'. Enable_Core_timer: …… Bit set MODE1 TIMEN; …… …… Instruction1; Idle; Instruction2; Instruction3; // Placing breakpoint here causes the anomaly Note: This issue impacts only Emulator session debug. WORKAROUND: None APPLIES TO REVISION(S): 0.2, 0.3 NR004008K | Page 14 of 21 | March 2014 Silicon Anomaly List ADSP-21483/21486/21487/21488/21489 11. 15000023 - A three column data access over DM bus immediately following an indirect delayed branch (db) may not work as expected in VISA mode: DESCRIPTION: A three column data access (e.g. 40 bit extended precision access or a 48 bit PX registers access) over DM bus may not work as expected if all the following conditions are met: 1. The code is running in VISA mode. 2. The access immediately follows an indirect* delayed branch instruction (e.g. call (db) or jump (db)). The anomaly is applicable for both read and write as well as for both direct and indirect accesses. This is however not applicable for IOP and external memory data accesses. Following are few example scenarios in which the anomaly may occur: Scenario 1: 40 bit data access using RF registers - The following code may show the failure if the corresponding IMDWx bit is set to enable 40 bit data access: jump(m8,i8) (db); //Indirect delayed branch instruction r0=dm(i1,m1); //This 40 bit read access may fail nop; Scenario 2: 48 bit data access using PX register - The following code may show the failure irrespective of whether the corresponding IMDWx bit is set or not: call(m8,i8) (db); //Indirect delayed branch instruction dm(i1,m1)=px; //This 48 bit write access may fail nop; Scenario 3: 40 bit data access using "rframe" instruction - The "rframe" instruction (performed as "i7=i6, i6=dm(0,i6)") may fail as well if the corresponding IMDWx bit in the SYSCTL register is set. It is noticeable that the "rframe" instruction is generated by the compiler for C codes. It is not used for assembly codes generally. jump(m8,i8) (db); //Indirect delayed branch instruction rframe; //The 40 bit read access "i6=dm(0,i6)" nop; may fail The occurrence of the failure depends upon the relationship between target address of the indirect branch (e.g. i8+m8 in the above examples) and the address of the three column data access. * This anomaly is applicable only for the indirect branch instructions using DAG2 registers. PC relative branch instructions are not affected by this anomaly. WORKAROUND: 1. Do not perform such data access immediately after the indirect delayed branch instruction. If possible, move the access to the second slot of the delayed branch. For example, putting the "rframe" instruction in the second slot of the delayed branch in the above code(scenario 3) will avoid the failure: jump(m8,i8) (db); //Indirect delayed branch instruction nop; rframe; //The 40 bit read access "i6=dm(0,i6)" moved to second slot 2. Use direct branch instead of indirect branch. 3. Use normal indirect branch instead of delayed indirect branch. This may however result in additional branch latency. Also, this workaround may not be helpful if the delayed branch was being used to be able to execute the two instructions in the (db) slot atomically. 4. Use PM bus instead of DM bus for such data accesses. This may however cost additional core clock cycle because of the PM bus conflict with the instruction fetch. E.g. replacing the DM access by PM access (i1 replaced by i9) in the above code (scenario 1) will avoid the failure: jump(m8,i8) (db); r0=pm(i9,m9); //DM replaced by PM, i1(DAG1) replaced by i9(DAG2) for PM access nop; 5. Use NON-VISA mode for such data accesses. NR004008K | Page 15 of 21 | March 2014 ADSP-21483/21486/21487/21488/21489 Silicon Anomaly List Note: Some of these workarounds may be built into the development tool chain and/or into the operating system source code. For tool chains and Operating Systems supported by ADI, such as VisualDSP++ and VDK please consult the "Silicon Anomaly Tools Support" help page in the applicable documentation and release notes for details. APPLIES TO REVISION(S): 0.2, 0.3 NR004008K | Page 16 of 21 | March 2014 Silicon Anomaly List ADSP-21483/21486/21487/21488/21489 12. 15000024 - Execution of the instructions in VISA space from internal memory may execute corrupted instructions when either of the two most recent write operations has updated the locations holding these instructions or the neighboring locations: DESCRIPTION: When the internal memory is written to a location containing or neighboring to a VISA (Variable Instruction Set Architecture) instruction and this write happens to be one of the two most recent internal memory writes, subsequent execution of such VISA instruction may fail. The write to the neighboring location will affect only if this write involves either one or two of the 16 bit words after the VISA instruction. Note that the offending write can be of any type (short word-16bit, normal word-32/40/48 bit, or long word-64 bit). Additionally, source of write operation could be core-driven or DMA-driven. It should be noted that this issue is applicable even for the case where the internal memory is initialized with VISA instructions for the first time. For example, this issue may be encountered after boot loading the application after processor comes out of reset. It however may not be seen with the default boot kernels as they initialize the interrupt vector table (IVT) locations at the end of the boot loading process. Since the IVT code is always expected in non-VISA mode, the memory writes corresponding to the IVT initialization will make sure that any previous writes to VISA memory space are flushed out from the FIFO. There is a two-deep write FIFO at the interface of each of the internal memory blocks. Under normal circumstances, the operation of these FIFOs is transparent to the users. Any write operation to a block of internal memory is first performed to the FIFO. The FIFO pushes the write to the memory array eventually in the non-read cycles. In a non-read cycle the block is not accessed for read operation by either the DMA or the core for instruction or data. Depending on availability of non-read cycles, last two writes to a block can stay in the FIFO for indefinite time. A read operation first looks for data in the FIFO of the relevant memory block. This is termed as "data forwarding" by the FIFO. If either the respective FIFO is empty or address match fails, memory array is accessed for the data. Both the explicit data read performed in the user code and the instruction fetch performed by the program sequencer go through this process. However, "data forwarding" by the FIFO does not work correctly for fetch of VISA instructions, leading to corruption of the instruction. VISA instructions are always fetched in packets of three short words irrespective of the actual size of the instructions that are executed. Consequently a VISA instruction can be corrupted if the relevant fetched packet is fully or partially forwarded from the FIFO. Thus the failure may be seen even when one or two neighboring short words are updated in recent writes (not necessarily the VISA instruction itself). The symptoms of this anomaly can be seen in variety of ways such as: - Core might hang or the execution might go to a recoverable or non-recoverable unknown state. - The affected instruction may not be executed as expected after the offending write. For example, assume that the affected instruction is "r1=0xABCDEF12" whose opcode is "0x0F01ABCDEF12" and is stored at a short word location starting at "0x124314". Suppose a short word write is performed to the location "0x124315" such that 0xABCD is changed to 0x0000 and the instruction changes to "0x0F010000EF12" i.e. "r1=0xEF12". .section/sw seg_code_block0; r0=0; dm(0x124315)=r0; //Offending write instruction r1=0xABCDEF12: //Affected instruction at address "0x124314" This write makes the latest instruction content to be pushed to the FIFO. Now, because of the anomaly, the instruction might not be fetched correctly as "0x0F010000EF12" and might still be fetched as "0x0F01ABCDEF12" which is the old value stored in the memory array and the content of R1 may be seen as "0xABCDEF12" even after apparently executing the instruction "r1=0xEF12". It has to be noted that in case of C code, there are few interrupt set-up functions such as interrupt(), interruptcb(), interruptf(), interrupts(), interruptss() which use self-modifying code to configure interrupt registers. The internal memory writes involved in this self-modifying code may trigger this anomaly as well. Note: This issue is seen only with instructions in VISA space executing from internal memory. Execution of VISA instructions from external memory is not affected by this anomaly. WORKAROUND: The only known workaround for this anomaly is to make sure that the VISA instruction and (or) the two 16 bit neighboring locations after the VISA instruction are not forwarded by the write FIFO. This can be done in following different ways: 1. If a write has to be performed to the internal memory holding a valid VISA instruction or the two 16 bit neighboring locations after the VISA, it should be followed by at least two writes to different memory locations in the same block of internal memory which do not overlap with a VISA instruction or the two 16 bit neighboring locations after the VISA instruction. These writes can either be valid NR004008K | Page 17 of 21 | March 2014 ADSP-21483/21486/21487/21488/21489 Silicon Anomaly List writes already present in the code or dummy writes. These two writes will push all the modified VISA instruction and(or) the neighboring content to the memory array from the FIFO and thus the following fetch is guaranteed to get the instruction from the array instead of the write FIFO. The above example code thus can be modified as mentioned below: .section/sw seg_code_block0; r0=0; dm(0x124315)=r0; //Offending write instruction dm(0x124300)=r0; //First Dummy write to a different "scratch" location dm(0x124300)=r0; //Second Dummy write to a different "scratch" location r1=0xABCDEF12: //Affected instruction at address "0x124314" Sometimes, re-arranging the order of the writes may also be helpful to avoid this anomaly. For example, when booting the processor, the issue can be avoided by making sure that at least two non-VISA instructions are initialized after VISA instructions. As explained above, the default boot kernels already have the order of writes in this way and therefore this issue will not be seen with the default boot kernel codes. 2. The content of the FIFO will automatically be pushed out of the FIFO and written to the corresponding memory location in the array as soon as the corresponding memory block is free for at least two core clock cycles (not necessarily consecutive) before executing the affected VISA instruction. This can be done by making sure that the corresponding memory block is not accessed by core, DMA, or program sequencer for at least two core clock cycles. For example, the above example code can be modified as mentioned below: .section/sw seg_code_block0; r0=0; dm(0x124315)=r0; //Offending write instruction call Dummy_block1_code; //Call dummy code from different block r1=0xABCDEF12: //Affected instruction at address "0x124314" .section/sw seg_code_block1; Dummy_block1_code: //Program sequencer executes dummy code from different block nop; // The code before "rts;" must have at least two non-read instructions nop; //to the offending block (block 0 in this example). rts; //Return to the main code. 3. In case of C code, use the equivalent interrupt set-up functions that do not use self-modifying code such as interruptnsm(), interruptcbnsm(), interruptfnsm(), interruptsnsm(), interruptssnsm(). Alternatively, copy the source file <<INSTALL_DIR>>Œxx\lib\src\libc_src\irptl.asm to the project and modify it so that there is a "nop" immediately before 'modify_two_instrs'. In order to build the file, the following include path will need to be added to the assembly options: <<INSTALL_DIR>>Œxx\lib\src\libc_src. The code snippet below shows the code with this workaround: .GLOBAL modify_instr, modify_two_instrs; nop; //This is the additional "nop" instruction modify_two_instrs: BIT SET IRPTL 0x00000000; APPLIES TO REVISION(S): 0.2, 0.3 NR004008K | Page 18 of 21 | March 2014 Silicon Anomaly List ADSP-21483/21486/21487/21488/21489 13. 15000028 - Internal Memory write gets incorrect value in presence of external memory access in Type-1 instruction under certain conditions: DESCRIPTION: IF a Type 1a instruction (compute + dual data memory move) in which the compute operation is a multiplication is followed by a conditional branch based on the result of the Type 1a multiplication and any of the following conditions are met: 1. The source register for an internal memory write is the same as the: a. Result register of the compute b. Result register of an external memory read 2. The source register for an internal memory write accessing long word space is the same as the: a. Implicit/explicit result register of the compute instruction b. Implicit/explicit result register of an external memory read THEN the data value written to internal memory is the modified value of the source register. This anomaly applies regardless of whether the condition in the second instruction is true or not. Note that the anomaly does NOT apply if the Type 1a instruction data operands are both located in external or internal memory . For this anomaly to occur, the Type 1a instruction can be any of the following fomats: 1. 2. 3. 4. Rx = multiplier compute, internal memory write = Rx, external memory data access; Multiplier compute, Rx = external memory data read, internal memory write = Rx; Multiplier compute, Rx = ALU operation result, external memory data access, internal memory write = Rx; Rx = multiplier compute, external memory data access, internal memory write to long word address space = Ry; where (Rx,Ry) are an implicit/explicit register pair. The following instructions are examples of these four formats of the Type 1a instruction in corresponding order to the above: R8 = R1 * R2 (UUI), dm(Ix, Mx) = R8, R1 = pm(Iy,My); // // // // // // Where Ix points to internal memory normal or short word address space and Iy points to external memory. In this case, the internal memory will receive the result of the multiplication. R5 = R2 * R7 (UUI), R4 = dm(Iy,My), pm(Ix,Mx) = R4; Where Ix points to internal memory normal or short word address space and Iy points to external memory. In this case, the internal memory will receive the data read from external memory. // // // // // // R5 = R2 * R7 (SSFR), R1 = R11 + R15, dm(Iy,My) = R4, PM(Ix,Mx) = R1; // Where Ix points to internal memory // normal or short word address space // and Iy points to external memory. // In this case, the internal memory // receives the result of the register // add. R1 = R3 * R7 (SSFR), R2 = pm(Iy,My), dm(Iz,Mz) = R0; // // // // // // // // Where Iy points to external memory and Iz points to internal memory long word address space. In this case, (R0,R1) are a register pair modified by the multiplication and the internal memory write gets the result in R1 after the multiplication. NR004008K | Page 19 of 21 | March 2014 Silicon Anomaly List ADSP-21483/21486/21487/21488/21489 For this anomaly to occur, the Type 1a instruction must be followed by a multiplier conditional branch instruction. This instruction can be any branch instruction (Jump, Call,RTS,RTI) with the condition based on multiplier status bits. The following is an example of the conditional branch: If not ms call label2; Example which shows this behavior: R8 = R1 * R2 (UUI), dm(Ix,Mx) = R8, R1 = pm(Iy,My); If not ms call label2; // // // // where Ix points to internal memory and Iy points to external memory internal memory gets updated with the result of the multiplication Failure is independent of : 1. Which data bus (DM,PM) is used for the internal/external memory access 2. Presence or absence of a PM bus conflict (cache hit or cache miss) 3. Whether the code runs in VISA or non-VISA mode 4. The source code is present in internal or external memory 5. Floating or Fixed point multifunction instructions are used. WORKAROUND: 1. Place a "nop;" instruction between Instruction-1 and Instruction-2. 2. Do not use "multiplier conditional" branch immediately after Instruction-1. APPLIES TO REVISION(S): 0.2, 0.3 14. 15000029 - UART stop bit width smaller than expected for UART divisor values of 3 or greater: DESCRIPTION: According to the EIA-404 standard specification, the UART stop bit width must be a minimun of 80% of full stop bit width. On SHARC processors, for UART divisor values of 3 or greater, the stop bit width is 14 PCLK cycles smaller than the full stop bit width for both one stop bit (UARTSTB = 0) and two stop bit (UARTSTB =1) settings. This causes the stop bit width to be less than the worst case standard specification for certain UART divisor values. For example, for any PCLK speed when one stop bit is configured, the following two divisor values cause the stop bit width to be less than the worst case stop bit width specified. 1. UART0DLL = 3, Actual Stop bit width = 70.8% of the programmed bit width. 2. UART0DLL = 4, Actual Stop bit width = 78.125% of the programmed bit width. Note: UART0DLH = 0 in the cases above. WORKAROUND: IF a shorter stop bit is an issue Then any one of the following workarounds can be used to increase the stop bit width: 1. Use two stop bit (UARTSTB =1) setting to ensure the stop bit width is greater than one bit. 2. Use UART divisor values of 1 and 2 or use higher UART divisor values to ensure the Stop bit width is close to hundred percent. 3. Use slow core driven mode transfers, as stop bit width will be larger if the data is not available to transfer between each of the core driven transfers. APPLIES TO REVISION(S): 0.2, 0.3 NR004008K | Page 20 of 21 | March 2014 Silicon Anomaly List ADSP-21483/21486/21487/21488/21489 15. 15000030 - Initial state of /WDTRSTO signal can be High or Low until WDT_CLKIN starts switching.: DESCRIPTION: The /WDTRSTO signal should be in a known state when /RESETOUT signal is de-asserted. But the state of /WDTRSTO signal can be high or low until WDT_CLKIN starts switching. There is a possibility that if the startup time of the WDT_CLKIN clock source is more, the WDTCLK_IN signal may not be available by the time /RESETOUT of the chip gets de-asserted. Hence for some duration, the state of the / WDTRSTO signal is not known even after the /RESETOUT of the chip is de-asserted. In some parts where /WDTRSTO signal remains asserted even after the /RESETOUT signal goes high , if the /WDTRSTO signal is given to any external device as an input, the external device will wrongly interpret the assertion of the /WDTRSTO signal as a watchdog timer expiry. This may lead to unexpected behavior. Hence the /WDTRSTO signal should be used only after the WDT_CLKIN starts switching. WORKAROUND: None APPLIES TO REVISION(S): 0.2, 0.3 16. 15000031 - Read access and Write access Breakpoint do not function reliably for external memory data address ranges: DESCRIPTION: The Breakpoint set for external memory address does not work reliably for following condition: Case1: Breakpoint is set for Write to address X. a. If the DM/PM write to address X, is followed by any instruction without DM/PM write operation, then Write Breakpoint will not hit. b. If the DM/PM write to address X, is followed by any instruction with DM/PM write operation to any address, then Write Breakpoint will hit. Case2: Breakpoint is set for Read to address X. a. If the DM/PM write to address X, is followed by any instruction without DM/PM write operation, then Read Breakpoint will hit. Here it is not expected to hit. b. If the DM/PM read to address X, is followed by any instruction with DM/PM write operation to any address, then Read Breakpoint will not hit. Note: Above ‘X' refers to external memory address. This issue will not be seen if breakpoint address is in internal memory. Both DM and PM breakpoint on external memory address are affected by this issue. WORKAROUND: Use the ‘Any Access' mode corresponding to ‘11' triggering mode for all external memory data address breakpoint. APPLIES TO REVISION(S): 0.2, 0.3 ©2014 Analog Devices, Inc. All rights reserved. Trademarks and registered trademarks are the property of their respective owners. a NR004008K | Page 21 of 21 | March 2014 www.analog.com