Since this class declares a new SystemC process,
SC_HAS_PROCESS
is used. The constructor passes
its arguments to the base class,
UartDecoupSC
and sets the FIFO queue size to 1.
UartIntrSC::UartIntrSC( sc_core::sc_module_name name, unsigned long int _clockRate, bool _isLittleEndian ) : UartDecoupSC( name, _clockRate, _isLittleEndian ), intrQueue( 1 ) {
Note | |
---|---|
The choice of FIFO size means that there should be only one
request for interrupt pending. In principle this could block an
attempt by the This is an explicit model design decision. If there is interrupt congestion, then it would be useful to know—indicating design issues over the UART capacity. If this were not an issue, then it would be quite valid to use a larger FIFO capacity. |
The constructor then creates the new SystemC method for
intrThread
.
intrThread
has a very simple
API. If true
is read it
asserts an interrupt (drives the interrupt port
true
), otherwise it deasserts the interrupt port
(drives the interrupt port false
).
On initialization, the interrupt port is deasserted
(false
). The thread then sits in a perpetual
loop, copying requests from the FIFO to the interrupt signal output
port.
while( true ) { intr.write( intrQueue.read() ); }
The interrupt generator, genIntr
is almost
identical to the version in the base class,
UartSC
. The only difference is that if an
interrupt is generated, a request to drive the signal is written
onto the internal interrupt FIFO for processing by the
intrThread
thread.
setIntrFlags(); // Show highest priority intrQueue.write( true ); // Request an interrupt signal
The interrupt clear routing is a similar modification, this time
requesting the interrupt signal to be cleared by writing
false
on the FIFO queue.
if( isSet( regs.iir, UART_IIR_IPEND )) { // 1 = not pending intrQueue.write( false ); // Deassert if none left
The implementation of the UART module class with interrupts,
UartIntrSC
may be found in
sys-models/intr-soc/UartIntrSC.cpp
in the
distribution.