Commit 28f4ea27 authored by Dimitris Lampridis's avatar Dimitris Lampridis

sim: add basic supporting for accessing the wrtd logs

parent 639eef6a
Subproject commit 6beecf5aa562e81a1170af4edbfb59b49245bfb3
Subproject commit f30132905e64f360372278fee7f07c60f60b97e6
......@@ -47,6 +47,44 @@ enum {
WRTD_ACTION_WRITEW
} wrtd_trtl_actions;
`define WRTD_ACTION_LOG 'h20
typedef enum uint32_t {
WRTD_LOG_MSG_EV_GENERATED = 0,
WRTD_LOG_MSG_EV_CONSUMED,
WRTD_LOG_MSG_EV_DISCARDED,
WRTD_LOG_MSG_EV_NETWORK,
WRTD_LOG_MSG_LINK
} wrtd_log_msg_type;
typedef enum uint32_t {
WRTD_LOG_GENERATED_ALARM = 1,
WRTD_LOG_GENERATED_DEVICE_0 = 8,
WRTD_LOG_GENERATED_DEVICE_1 = 16,
WRTD_LOG_GENERATED_DEVICE_2 = 24,
WRTD_LOG_GENERATED_DEVICE_3 = 32,
WRTD_LOG_GENERATED_DEVICE_4 = 40,
WRTD_LOG_GENERATED_DEVICE_5 = 48,
WRTD_LOG_GENERATED_DEVICE_6 = 56,
WRTD_LOG_GENERATED_DEVICE_7 = 64
} wrtd_log_gen_reason;
typedef enum uint32_t {
WRTD_LOG_CONSUMED_START = 1,
WRTD_LOG_CONSUMED_DONE
} wrtd_log_con_reason;
typedef enum uint32_t {
WRTD_LOG_DISCARD_NO_SYNC = 1,
WRTD_LOG_DISCARD_TIMEOUT,
WRTD_LOG_DISCARD_OVERFLOW
} wrtd_log_dsc_reason;
typedef enum uint32_t {
WRTD_LOG_NETWORK_TX = 1,
WRTD_LOG_NETWORK_RX
} wrtd_log_net_reason;
enum {
WRTD_DIR_INPUT,
WRTD_DIR_OUTPUT
......@@ -66,21 +104,10 @@ class WrtdTstamp;
function new ( uint32_t seconds = 0,
uint32_t ns = 0,
uint32_t frac = 0,
string name = "");
this.name = name;
uint32_t frac = 0 );
set ( seconds, ns, frac );
endfunction // new
task mdisplay ( string str );
string tmp;
if (this.name == "")
tmp = $sformatf("<%t> %s", $realtime, str);
else
tmp = $sformatf("[%s] <%t> %s", this.name, $realtime, str);
$display (tmp);
endtask // mdisplay
function void set ( uint32_t seconds, uint32_t ns, uint32_t frac );
this.seconds = seconds;
this.ns = ns;
......@@ -117,6 +144,10 @@ class WrtdTstamp;
set ( 0, 0, 0 );
endfunction // zero
function string tostring ( );
return $sformatf ( "%0d:%0d.%0d", this.seconds, this.ns, this.frac );
endfunction; // tostring
endclass // WrtdTstamp
class WrtdId;
......
......@@ -34,6 +34,7 @@
class WrtdDrv;
uint32_t ready;
protected string name;
protected byte unsigned enable_logging;
protected MockTurtleDriver mt;
protected uint32_t nbr_cpus;
protected uint32_t free_rule_slots[];
......@@ -45,9 +46,15 @@ class WrtdDrv;
protected WrtdRepCapCollection alarms;
function new ( CBusAccessor acc, uint64_t base,
vIMockTurtleIRQ irq, string name = "" );
vIMockTurtleIRQ irq, string name = "",
byte unsigned enable_logging = 1 );
this.name = name;
this.mt = new (acc, base, irq, name);
this.mt = new (acc, base, irq, name);
this.enable_logging = enable_logging;
endfunction // new
task mdisplay ( string str );
......@@ -146,6 +153,9 @@ class WrtdDrv;
this.roots[i].alarms_addr = data[9];
// init free rule slots
this.free_rule_slots[i] = this.roots[i].nbr_rules;
// turn on all logging if enabled
if ( this.enable_logging )
msg_writew ( i, this.roots[i].addr + 12, 1, { data[3] | 32'hff } );
end
// initialise rules
......@@ -412,17 +422,95 @@ class WrtdDrv;
msg_writew ( core, addr, `WRTD_ALRM_WORD_SIZE, data );
endtask // write_alarm
task log_read ( );
endtask // log_read
function string log_msg_tostring ( MQueueMsg msg );
string ret;
wrtd_log_msg_type msg_type;
wrtd_log_gen_reason gen_reason;
wrtd_log_con_reason con_reason;
wrtd_log_dsc_reason dsc_reason;
wrtd_log_net_reason net_reason;
WrtdTstamp ev_tstamp, msg_tstamp;
WrtdId ev_id;
ret = "";
if ( msg.header.msg_id != `WRTD_ACTION_LOG )
begin
$error ( "log_msg_tostring: unknown message id %.8x", msg.header.msg_id );
return ret;
end
msg_tstamp = new ();
msg_tstamp.data_unpack ( msg.data[11:13] );
ret = { ret, $sformatf ( "log timestamp: %s", msg_tstamp.tostring() ) };
ev_tstamp = new ();
ev_tstamp.data_unpack ( msg.data[2:4] );
ret = { ret, $sformatf ( ", event timestamp: %s", ev_tstamp.tostring() ) };
ev_id = new ();
ev_id.data_unpack ( msg.data[5:8] );
ret = { ret, $sformatf ( ", id: %s, seq: %0d", ev_id.get(), msg.data[9] ) };
$cast ( msg_type, msg.data[0] );
ret = { ret, $sformatf ( ", log type: %s", msg_type.name() ) };
case ( msg_type )
WRTD_LOG_MSG_EV_GENERATED :
begin
$cast ( gen_reason, msg.data[1] );
ret = { ret, $sformatf ( ", reason: %s", gen_reason.name() ) };
end
WRTD_LOG_MSG_EV_CONSUMED :
begin
$cast ( con_reason, msg.data[1] );
ret = { ret, $sformatf ( ", reason: %s", con_reason.name() ) };
end
WRTD_LOG_MSG_EV_DISCARDED :
begin
$cast ( dsc_reason, msg.data[1] );
ret = { ret, $sformatf ( ", reason: %s", dsc_reason.name() ) };
end
WRTD_LOG_MSG_EV_NETWORK :
begin
$cast ( net_reason, msg.data[1] );
ret = { ret, $sformatf ( ", reason: %s", net_reason.name() ) };
end
endcase; // case ( msg_type )
return ret;
endfunction // log_msg_tostring
task check_logs ( );
int i;
MQueueMsg msg;
for (int i = 0; i < this.nbr_cpus; i++)
begin
while ( mt.hmq_pending_messages ( i, 0 ) )
begin
msg = new ( i, 0 );
mt.hmq_peek_message ( msg );
if ( msg.header.msg_id != `WRTD_ACTION_LOG ) break;
mt.hmq_receive_message ( msg );
mdisplay ( $sformatf ( "LOG MSG from core %0d: %s", i, log_msg_tostring ( msg ) ) );
end
end
endtask // check_logs
task update ( );
mt.update ( );
fork
/* -----\/----- EXCLUDED -----\/-----
check_log_queue ( 0 );
check_log_queue ( 1 );
-----/\----- EXCLUDED -----/\----- */
join
if ( this.enable_logging )
check_logs ( );
endtask // update
endclass // WrtdDrv
......
......@@ -93,7 +93,7 @@ module main;
if (val != expected)
$fatal (1, "ADC status error (got 0x%8x, expected 0x%8x).", val, expected);
$display ("<%t> DUTA ADC configured and armed", $realtime);
$display ("[DUT:A] <%t> ADC configured and armed", $realtime);
wait (duta_acq_state == 1);
end
......@@ -103,7 +103,7 @@ module main;
devB = new (accB, MT_BASE, MtIrqMonitorB, "DUT:B");
devB.init();
devB.add_rule ( "rule0" );
devB.set_rule ( "rule0", "NET0", "ADCO1", 100000 );
devB.set_rule ( "rule0", "NET0", "ADCO1", 50000 );
devB.enable_rule ( "rule0" );
// Config DUTB to trigger on WRTD and get 64 samples
......@@ -127,16 +127,16 @@ module main;
if (val != expected)
$fatal (1, "ADC status error (got 0x%8x, expected 0x%8x).", val, expected);
$display ("<%t> DUTB ADC configured and armed", $realtime);
$display ("[DUT:B] <%t> ADC configured and armed", $realtime);
wait (dutb_acq_state == 1);
end
join
#50us;
$display("<%t> DUTB START ACQ 1", $realtime);
$display("[DUT:B] <%t> START ACQ 1", $realtime);
accB.write(`ADC_CSR_BASE + `ADDR_FMC_ADC_100MS_CSR_CTL, 'h00000001); // FSM start
$display("<%t> DUTA START ACQ 1", $realtime);
$display("[DUT:A] <%t> START ACQ 1", $realtime);
accA.write(`ADC_CSR_BASE + `ADDR_FMC_ADC_100MS_CSR_CTL, 'h00000001); // FSM start
#5us;
......@@ -147,10 +147,10 @@ module main;
fork
begin
wait (duta_acq_state == 1);
$display("<%t> DUTA END ACQ 1", $realtime);
$display("[DUT:A] <%t> END ACQ 1", $realtime);
accA.read(`ADC_CSR_BASE + `ADDR_FMC_ADC_100MS_CSR_TRIG_POS, val);
$display ("<%t> DUTA TRIG POSITION %.8x", $realtime, val);
$display("[DUT:A] <%t> TRIG POSITION %.8x", $realtime, val);
// DMA transfer
accA.write('h2008, val); // dma start addr
......@@ -168,15 +168,15 @@ module main;
accA.write('h2000, 'h00000001); // xfer start
wait (DUTA.DUT.dma_irq[0] == 1);
$display("<%t> DUTA END DMA 1", $realtime);
$display("[DUT:A] <%t> END DMA 1", $realtime);
end
begin
wait (dutb_acq_state == 1);
$display("<%t> DUTB END ACQ 1", $realtime);
$display("[DUT:B] <%t> END ACQ 1", $realtime);
accB.read(`ADC_CSR_BASE + `ADDR_FMC_ADC_100MS_CSR_TRIG_POS, val);
$display ("<%t> DUTB TRIG POSITION %.8x", $realtime, val);
$display("[DUT:B] <%t> TRIG POSITION %.8x", $realtime, val);
// DMA transfer
accB.write('h2008, val); // dma start addr
......@@ -194,7 +194,7 @@ module main;
accB.write('h2000, 'h00000001); // xfer start
wait (DUTB.DUT.dma_irq[0] == 1);
$display("<%t> DUTB END DMA 1", $realtime);
$display("[DUT:B] <%t> END DMA 1", $realtime);
end
join
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment