We may need to recompile the hardware/software interface when compiling for ESL model as compared to the device driver installed in an OS or ROM firmware.
For a 'mid-level model', differences might be minor and so implemented in C preprocessor.
Device driver access to a DMA controller might be changed as follows:
#define DMACONT_BASE (0xFFFFCD00) // Or other memory map value. #define DMACONT_SRC_REG 0 #define DMACONT_DEST_REG 4 #define DMACONT_LENGTH_REG 8 // These are the offsets of the addressable registers #define DMACONT_STATUS_REG 12 #ifdef ACTUAL_FIRMWARE // For real system and lower-level models: // Store via processor bus to DMACONT device register #define DMACONT_WRITE(A, D) (*(DMACONT_BASE+A*4)) = (D) #define DMACONT_READ(A) (*(DMACONT_BASE+A*4)) #else // For high-level TLM modelling: // Make a direct subroutine call from the firmware to the DMACONT model. #define DMACONT_WRITE(A, D) dmaunit.slave_write(A, D) #define DMACONT_READ(A) dmaunit.slave_read(A) #endif // The device driver will make all hardware accesses to the unit using these macros. // When compiled native, the calls will directly invoke the behavioural model, bypassing the bus model.The remainder of this slide/section links to details of a specific example not lectured in 2017/18.
»DMA Controller RTL Version (from 2016 SoC Parts Slide Pack)
// Behavioural model of
// slave side: operand register r/w.
uint32 src, dest, length;
bool busy, int_enable;
u32_t status() { return (busy << 31)
| (int_enable << 30); }
u32_t slave_read(u32_t a)
{
return (a==0)? src: (a==4) ? dest:
(a==8) ? (length) : status();
}
void slave_write(u32_t1 a, u32_t d)
{
if (a==0) src=d;
else if (a==4) dest=d;
else if (a==8) length = d;
else if (a==12)
{ busy = d >> 31;
int_enable = d >> 30; }
}
| // Bev model of bus mastering portion.
while(1)
{
waituntil(busy);
while (length-- > 0)
mem.write(dest++, mem.read(src++));
busy = 0;
}
|
Like to make interrupt output with an RTL-like continuous assignment:
interrupt = int_enable & !busy;But this will need a thread to run it, so this code must be placed in its own C macro that is inlined at all points where the supporting expressions might change.
| 7: (C) 2008-18, DJ Greaves, University of Cambridge, Computer Laboratory. |