ipxact-ruby 0.11.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (142) hide show
  1. data/.autotest +15 -0
  2. data/.gitignore +2 -0
  3. data/README.html +89 -0
  4. data/README.mdown +91 -0
  5. data/Rakefile +31 -0
  6. data/VERSION +1 -0
  7. data/autotest/discover.rb +17 -0
  8. data/lib/ipxact.rb +263 -0
  9. data/lib/ipxact/component.rb +235 -0
  10. data/lib/ipxact/parser.rb +27 -0
  11. data/lib/ipxact/parser/bus_data_parser.rb +229 -0
  12. data/lib/ipxact/parser/component_data_parser.rb +309 -0
  13. data/lib/ipxact/parser/platform_data_parser.rb +63 -0
  14. data/lib/ipxact/pathfinder/graph_pathfinder.rb +191 -0
  15. data/lib/ipxact/platform.rb +43 -0
  16. data/schemas/abstractionDefinition.xsd +332 -0
  17. data/schemas/abstractor.xsd +156 -0
  18. data/schemas/autoConfigure.xsd +226 -0
  19. data/schemas/busDefinition.xsd +99 -0
  20. data/schemas/busInterface.xsd +640 -0
  21. data/schemas/commonStructures.xsd +189 -0
  22. data/schemas/component.xsd +253 -0
  23. data/schemas/configurable.xsd +82 -0
  24. data/schemas/constraints.xsd +283 -0
  25. data/schemas/design.xsd +105 -0
  26. data/schemas/designConfig.xsd +144 -0
  27. data/schemas/file.xsd +560 -0
  28. data/schemas/fileType.xsd +86 -0
  29. data/schemas/generator.xsd +240 -0
  30. data/schemas/identifier.xsd +93 -0
  31. data/schemas/index.xsd +67 -0
  32. data/schemas/memoryMap.xsd +1007 -0
  33. data/schemas/model.xsd +291 -0
  34. data/schemas/port.xsd +441 -0
  35. data/schemas/signalDrivers.xsd +220 -0
  36. data/schemas/simpleTypes.xsd +90 -0
  37. data/schemas/subInstances.xsd +256 -0
  38. data/spec/integration/bus_data_extraction_spec.rb +105 -0
  39. data/spec/integration/data_calculation_spec.rb +133 -0
  40. data/spec/integration/data_construction_spec.rb +52 -0
  41. data/spec/integration/general_spec.rb +121 -0
  42. data/spec/test_data/spiritconsortium.org/Leon2TLM/PV/pv_initiator_port.h +135 -0
  43. data/spec/test_data/spiritconsortium.org/Leon2TLM/PV/pv_initiator_port.tpp +247 -0
  44. data/spec/test_data/spiritconsortium.org/Leon2TLM/PV/pv_initiator_port_base.h +189 -0
  45. data/spec/test_data/spiritconsortium.org/Leon2TLM/PV/pv_router.h +205 -0
  46. data/spec/test_data/spiritconsortium.org/Leon2TLM/PV/pv_router.tpp +278 -0
  47. data/spec/test_data/spiritconsortium.org/Leon2TLM/PV/pv_slave_base.h +115 -0
  48. data/spec/test_data/spiritconsortium.org/Leon2TLM/PV/pv_slave_base.tpp +126 -0
  49. data/spec/test_data/spiritconsortium.org/Leon2TLM/PV/pv_target_port.h +168 -0
  50. data/spec/test_data/spiritconsortium.org/Leon2TLM/PV/pv_target_port_base.h +133 -0
  51. data/spec/test_data/spiritconsortium.org/Leon2TLM/PV/pv_tlm_if.h +280 -0
  52. data/spec/test_data/spiritconsortium.org/Leon2TLM/PV/user_types.h +38 -0
  53. data/spec/test_data/spiritconsortium.org/Leon2TLM/SystemTLM1/Leon2Platform/Leon2Platform.xml +77 -0
  54. data/spec/test_data/spiritconsortium.org/Leon2TLM/SystemTLM1/Leon2Platform/design_Leon2Platform.xml +156 -0
  55. data/spec/test_data/spiritconsortium.org/Leon2TLM/SystemTLM1/Leon2Platform/tlmsrc/Leon2Platform.h +149 -0
  56. data/spec/test_data/spiritconsortium.org/Leon2TLM/SystemTLM1/apbSubSystem/apbSubSystem.xml +406 -0
  57. data/spec/test_data/spiritconsortium.org/Leon2TLM/SystemTLM1/apbSubSystem/design_apbSubSystem.xml +135 -0
  58. data/spec/test_data/spiritconsortium.org/Leon2TLM/SystemTLM1/apbSubSystem/tlmsrc/apbSubSystem.h +133 -0
  59. data/spec/test_data/spiritconsortium.org/Leon2TLM/SystemTLM2/Leon2Platform/Leon2Platform.xml +77 -0
  60. data/spec/test_data/spiritconsortium.org/Leon2TLM/SystemTLM2/Leon2Platform/design_Leon2Platform.xml +157 -0
  61. data/spec/test_data/spiritconsortium.org/Leon2TLM/SystemTLM2/Leon2Platform/tlmsrc/Leon2Platform.h +150 -0
  62. data/spec/test_data/spiritconsortium.org/Leon2TLM/SystemTLM2/apbSubSystem/apbSubSystem.xml +422 -0
  63. data/spec/test_data/spiritconsortium.org/Leon2TLM/SystemTLM2/apbSubSystem/designConfig_apbSubSystem.xml +79 -0
  64. data/spec/test_data/spiritconsortium.org/Leon2TLM/SystemTLM2/apbSubSystem/design_apbSubSystem.xml +184 -0
  65. data/spec/test_data/spiritconsortium.org/Leon2TLM/SystemTLM2/apbSubSystem/tlmsrc/apbSubSystem.h +164 -0
  66. data/spec/test_data/spiritconsortium.org/Leon2TLM/SystemTLM3/Leon2Platform/Leon2Platform.xml +105 -0
  67. data/spec/test_data/spiritconsortium.org/Leon2TLM/SystemTLM3/Leon2Platform/design_Leon2Platform.xml +157 -0
  68. data/spec/test_data/spiritconsortium.org/Leon2TLM/SystemTLM3/Leon2Platform/tlmsrc/Leon2Platform.h +152 -0
  69. data/spec/test_data/spiritconsortium.org/Leon2TLM/SystemTLM3/apbSubSystem/apbSubSystem.xml +429 -0
  70. data/spec/test_data/spiritconsortium.org/Leon2TLM/SystemTLM3/apbSubSystem/designConfig_apbSubSystem.xml +64 -0
  71. data/spec/test_data/spiritconsortium.org/Leon2TLM/SystemTLM3/apbSubSystem/design_apbSubSystem.xml +150 -0
  72. data/spec/test_data/spiritconsortium.org/Leon2TLM/SystemTLM3/apbSubSystem/tlmsrc/apbSubSystem.h +167 -0
  73. data/spec/test_data/spiritconsortium.org/Leon2TLM/ahbbus/1.4/ahbbus22.xml +236 -0
  74. data/spec/test_data/spiritconsortium.org/Leon2TLM/ahbbus/1.4/tlmsrc/ahbbus.h +52 -0
  75. data/spec/test_data/spiritconsortium.org/Leon2TLM/ahbram/1.4/ahbram.xml +184 -0
  76. data/spec/test_data/spiritconsortium.org/Leon2TLM/ahbram/1.4/tlmsrc/ahbram.cc +93 -0
  77. data/spec/test_data/spiritconsortium.org/Leon2TLM/ahbram/1.4/tlmsrc/ahbram.h +77 -0
  78. data/spec/test_data/spiritconsortium.org/Leon2TLM/apbbus/1.4/apbbus8.xml +544 -0
  79. data/spec/test_data/spiritconsortium.org/Leon2TLM/apbbus/1.4/tlmsrc/apbbus.h +55 -0
  80. data/spec/test_data/spiritconsortium.org/Leon2TLM/apbmst/1.4/apbmst.xml +209 -0
  81. data/spec/test_data/spiritconsortium.org/Leon2TLM/apbmst/1.4/tlmsrc/apbmst.h +53 -0
  82. data/spec/test_data/spiritconsortium.org/Leon2TLM/apbram/1.0/apbram.xml +395 -0
  83. data/spec/test_data/spiritconsortium.org/Leon2TLM/apbram/1.0/hdlsrc/apbram.cc +89 -0
  84. data/spec/test_data/spiritconsortium.org/Leon2TLM/apbram/1.0/hdlsrc/apbram.h +69 -0
  85. data/spec/test_data/spiritconsortium.org/Leon2TLM/apbram/1.0/hdlsrc/apbram.v +82 -0
  86. data/spec/test_data/spiritconsortium.org/Leon2TLM/apbram/1.0/hdlsrc/apbram.vhd +132 -0
  87. data/spec/test_data/spiritconsortium.org/Leon2TLM/cgu/1.4/cgu.xml +686 -0
  88. data/spec/test_data/spiritconsortium.org/Leon2TLM/cgu/1.4/tlmsrc/cgu.cc +121 -0
  89. data/spec/test_data/spiritconsortium.org/Leon2TLM/cgu/1.4/tlmsrc/cgu.h +81 -0
  90. data/spec/test_data/spiritconsortium.org/Leon2TLM/cgu/1.5/cgu.xml +707 -0
  91. data/spec/test_data/spiritconsortium.org/Leon2TLM/cgu/1.5/tlmsrc/cgu.cc +121 -0
  92. data/spec/test_data/spiritconsortium.org/Leon2TLM/cgu/1.5/tlmsrc/cgu.h +81 -0
  93. data/spec/test_data/spiritconsortium.org/Leon2TLM/dma/1.4/dma.xml +272 -0
  94. data/spec/test_data/spiritconsortium.org/Leon2TLM/dma/1.4/tlmsrc/dma.cc +230 -0
  95. data/spec/test_data/spiritconsortium.org/Leon2TLM/dma/1.4/tlmsrc/dma.h +116 -0
  96. data/spec/test_data/spiritconsortium.org/Leon2TLM/irqctrl/1.4/irqctrl.xml +530 -0
  97. data/spec/test_data/spiritconsortium.org/Leon2TLM/irqctrl/1.4/tlmsrc/irqctrl.cc +211 -0
  98. data/spec/test_data/spiritconsortium.org/Leon2TLM/irqctrl/1.4/tlmsrc/irqctrl.h +108 -0
  99. data/spec/test_data/spiritconsortium.org/Leon2TLM/processor/1.4/processor.xml +423 -0
  100. data/spec/test_data/spiritconsortium.org/Leon2TLM/processor/1.4/tlmsrc/processor.cc +331 -0
  101. data/spec/test_data/spiritconsortium.org/Leon2TLM/processor/1.4/tlmsrc/processor.h +121 -0
  102. data/spec/test_data/spiritconsortium.org/Leon2TLM/pv2apb/1.0/pv2apb.xml +240 -0
  103. data/spec/test_data/spiritconsortium.org/Leon2TLM/pv2apb/1.0/tlmsrc/pv2apb.cc +153 -0
  104. data/spec/test_data/spiritconsortium.org/Leon2TLM/pv2apb/1.0/tlmsrc/pv2apb.h +77 -0
  105. data/spec/test_data/spiritconsortium.org/Leon2TLM/pv2tac/1.0/pv2tac.xml +154 -0
  106. data/spec/test_data/spiritconsortium.org/Leon2TLM/pv2tac/1.0/tlmsrc/pv2tac.cc +114 -0
  107. data/spec/test_data/spiritconsortium.org/Leon2TLM/pv2tac/1.0/tlmsrc/pv2tac.h +67 -0
  108. data/spec/test_data/spiritconsortium.org/Leon2TLM/rgu/1.4/rgu.xml +766 -0
  109. data/spec/test_data/spiritconsortium.org/Leon2TLM/rgu/1.4/tlmsrc/rgu.cc +126 -0
  110. data/spec/test_data/spiritconsortium.org/Leon2TLM/rgu/1.4/tlmsrc/rgu.h +105 -0
  111. data/spec/test_data/spiritconsortium.org/Leon2TLM/scmlAdaptor/1.0/scmlAdaptor.xml +154 -0
  112. data/spec/test_data/spiritconsortium.org/Leon2TLM/scmlAdaptor/1.0/tlmsrc/scmladaptor.cc +100 -0
  113. data/spec/test_data/spiritconsortium.org/Leon2TLM/scmlAdaptor/1.0/tlmsrc/scmladaptor.h +62 -0
  114. data/spec/test_data/spiritconsortium.org/Leon2TLM/serial_device/1.0/serial_device.xml +151 -0
  115. data/spec/test_data/spiritconsortium.org/Leon2TLM/serial_device/1.0/tlmsrc/serial_device.h +85 -0
  116. data/spec/test_data/spiritconsortium.org/Leon2TLM/timers/1.4/timers.xml +460 -0
  117. data/spec/test_data/spiritconsortium.org/Leon2TLM/timers/1.4/tlmsrc/timers.cc +201 -0
  118. data/spec/test_data/spiritconsortium.org/Leon2TLM/timers/1.4/tlmsrc/timers.h +102 -0
  119. data/spec/test_data/spiritconsortium.org/Leon2TLM/uart_scml/1.0/tlmsrc/inc/uart.h +152 -0
  120. data/spec/test_data/spiritconsortium.org/Leon2TLM/uart_scml/1.0/tlmsrc/inc/uart_fifo.h +113 -0
  121. data/spec/test_data/spiritconsortium.org/Leon2TLM/uart_scml/1.0/tlmsrc/inc/uart_memory_map.h +96 -0
  122. data/spec/test_data/spiritconsortium.org/Leon2TLM/uart_scml/1.0/tlmsrc/inc/uart_types.h +60 -0
  123. data/spec/test_data/spiritconsortium.org/Leon2TLM/uart_scml/1.0/tlmsrc/src/uart.cc +125 -0
  124. data/spec/test_data/spiritconsortium.org/Leon2TLM/uart_scml/1.0/tlmsrc/src/uart_interrupt_handler.cc +136 -0
  125. data/spec/test_data/spiritconsortium.org/Leon2TLM/uart_scml/1.0/tlmsrc/src/uart_register_bank.cc +129 -0
  126. data/spec/test_data/spiritconsortium.org/Leon2TLM/uart_scml/1.0/tlmsrc/src/uart_serial_tx_rx.cc +145 -0
  127. data/spec/test_data/spiritconsortium.org/Leon2TLM/uart_scml/1.0/uart_scml.xml +372 -0
  128. data/spec/test_data/spiritconsortium.org/Leon2TLM/uart_tac/1.0/tlmsrc/include/Leon2_uart.h +216 -0
  129. data/spec/test_data/spiritconsortium.org/Leon2TLM/uart_tac/1.0/tlmsrc/include/def_Leon2_uart.h +34 -0
  130. data/spec/test_data/spiritconsortium.org/Leon2TLM/uart_tac/1.0/tlmsrc/include/tlm_field.h +72 -0
  131. data/spec/test_data/spiritconsortium.org/Leon2TLM/uart_tac/1.0/tlmsrc/include/tlm_register.h +129 -0
  132. data/spec/test_data/spiritconsortium.org/Leon2TLM/uart_tac/1.0/tlmsrc/include/tlmreg_Leon2_uart.h +133 -0
  133. data/spec/test_data/spiritconsortium.org/Leon2TLM/uart_tac/1.0/tlmsrc/src/Leon2_uart.cc +316 -0
  134. data/spec/test_data/spiritconsortium.org/Leon2TLM/uart_tac/1.0/tlmsrc/src/tlmreg_Leon2_uart.cc +197 -0
  135. data/spec/test_data/spiritconsortium.org/Leon2TLM/uart_tac/1.0/tlmsrc/src/user_specific_Leon2_uart.cc +146 -0
  136. data/spec/test_data/spiritconsortium.org/Leon2TLM/uart_tac/1.0/uart_tac.xml +222 -0
  137. data/spec/unit/component_spec.rb +98 -0
  138. data/spec/unit/graph_pathfinder_spec.rb +128 -0
  139. data/spec/unit/interconnect_spec.rb +177 -0
  140. data/spec/unit/ipxact_spec.rb +69 -0
  141. data/spec/unit/platform_spec.rb +34 -0
  142. metadata +225 -0
@@ -0,0 +1,331 @@
1
+ //
2
+ // Revision: $Revision: 1506 $
3
+ // Date: $Date: 2009-04-26 01:51:56 -0500 (Sun, 26 Apr 2009) $
4
+ //
5
+ // Copyright (c) 2005, 2006, 2007, 2008, 2009 The SPIRIT Consortium.
6
+ //
7
+ // This work forms part of a deliverable of The SPIRIT Consortium.
8
+ //
9
+ // Use of these materials are governed by the legal terms and conditions
10
+ // outlined in the disclaimer available from www.spiritconsortium.org.
11
+ //
12
+ // This source file is provided on an AS IS basis. The SPIRIT
13
+ // Consortium disclaims any warranty express or implied including
14
+ // any warranty of merchantability and fitness for use for a
15
+ // particular purpose.
16
+ //
17
+ // The user of the source file shall indemnify and hold The SPIRIT
18
+ // Consortium and its members harmless from any damages or liability.
19
+ // Users are requested to provide feedback to The SPIRIT Consortium
20
+ // using either mailto:feedback@lists.spiritconsortium.org or the forms at
21
+ // http://www.spiritconsortium.org/about/contact_us/
22
+ //
23
+ // This file may be copied, and distributed, with or without
24
+ // modifications; but this notice must be included on any copy.
25
+
26
+ /*------------------------------------------------------------------------------
27
+ * Simple TLM processor
28
+ * Note: this is a dummy implementation of a Leon2 processor.
29
+ * One should read this model as a simple testbench generator.
30
+ *------------------------------------------------------------------------------*/
31
+
32
+ /*------------------------------------------------------------------------------
33
+ * Includes
34
+ *----------------------------------------------------------------------------*/
35
+ #include "processor.h"
36
+ #include <string>
37
+ #include <map>
38
+ #include <vector>
39
+ #include <sstream>
40
+ #include <stdlib.h>
41
+ #include <errno.h>
42
+ #include <unistd.h>
43
+
44
+ /*------------------------------------------------------------------------------
45
+ * Methods
46
+ *----------------------------------------------------------------------------*/
47
+ processor::processor( sc_module_name module_name , char* tb_file_name) :
48
+ sc_module( module_name ),
49
+ pv_slave_base<ADDRESS_TYPE,DATA_TYPE>(name()),
50
+ apb_slave_port("apb_slave_port"),
51
+ ahb_master_port ("ahb_master_port"),
52
+ irl_port ("irl_port"),
53
+ irqvec_port ("irq_port"),
54
+ intack_port ("ack_port"),
55
+ clk ("clk"),
56
+ rst_an ("rst_an"),
57
+ cmdIndex_(0),
58
+ enableInterrupt_(true)
59
+ {
60
+ apb_slave_port( *this );
61
+ init_local_memory();
62
+ SC_THREAD( ahbMaster );
63
+ sensitive << clk;
64
+ SC_METHOD( restart );
65
+ sensitive << rst_an;
66
+ SC_METHOD( catch_it );
67
+ dont_initialize();
68
+ sensitive << irl_port;
69
+ read_testbench_file(tb_file_name);
70
+ cout << "-----------------------------" << endl;
71
+ cout << "Elaborating" << endl;
72
+ cout << "-----------------------------" << endl;
73
+ intack_port.initialize(0);
74
+ irqvec_port.initialize(0x0);
75
+ }
76
+
77
+ processor::~processor() {
78
+ cout << "-----------------------------" << endl;
79
+ cout << "Simulation done" << endl;
80
+ cout << "-----------------------------" << endl;
81
+ }
82
+
83
+ void processor::end_of_elaboration() {
84
+ cout << name() << " constructed." << endl;
85
+ }
86
+
87
+ // the big statemachine (simplified compared to RTL)
88
+ void processor::ahbMaster() {
89
+ tlm::tlm_status status;
90
+ tb_cmd_t trans;
91
+ int mask;
92
+ DATA_TYPE localData;
93
+ DATA_TYPE data;
94
+
95
+ while (true) {
96
+ // while (cmdIndex_ < numTbCmds_) {
97
+ while (rst_an.read() == false) {
98
+ wait();
99
+ }
100
+
101
+ while (cmdIndex_ == numTbCmds_)
102
+ wait();
103
+
104
+ if (cmdIndex_ == 0 ) {
105
+ cout << "-----------------------------" << endl;
106
+ cout << "Ready to start the simulation" << endl;
107
+ cout << "-----------------------------" << endl;
108
+ }
109
+
110
+ // get next command
111
+ trans = tbData_[cmdIndex_];
112
+ cmdIndex_++;
113
+ // generate transactions based on command
114
+ switch (trans.cmd) {
115
+ case IDLE:
116
+ for (int j=0; j<trans.idle and rst_an.read(); j++) {
117
+ wait();
118
+ while (clk.read() != SC_LOGIC_1)
119
+ wait();
120
+ }
121
+ cout << "[" << name() << "]: stayed IDLE for : "
122
+ << std::dec << trans.idle << " clock cycles"
123
+ << "\tAt time " << sc_time_stamp() << endl;
124
+ break;
125
+ case READ:
126
+ if ((trans.addr >= PROC_LOCALMEMORY_BASE_ADDR) &&
127
+ (trans.addr < (PROC_LOCALMEMORY_BASE_ADDR + PROC_LOCALMEMORY_SIZE))) {
128
+ // internal read
129
+ localData = local_memory[trans.addr-PROC_LOCALMEMORY_BASE_ADDR]; // & trans.mask;
130
+ // display vaue read
131
+ cout << "[" << name() << "]: local memory READ data : "
132
+ << std::showbase << std::hex << localData
133
+ << " from address \t" << std::showbase << std::hex << trans.addr
134
+ << "\tAt time " << sc_time_stamp() << endl;
135
+ // check vs expected vaue
136
+ if (trans.data!=localData) {
137
+ cout << "WARNING: expected data value " << std::showbase << std::hex << trans.data << endl;
138
+ }
139
+ } else {
140
+ status = ahb_master_port.read(trans.addr, data);
141
+ if (status.is_ok()) {
142
+ // display value read
143
+ cout << "[" << name() << "]: external READ data : "
144
+ << std::showbase << std::hex << data
145
+ << " from address \t" << std::showbase << std::hex << trans.addr
146
+ << "\tAt time " << sc_time_stamp() << endl;
147
+ // check vs expected vaue
148
+ if ((trans.data & trans.mask) != (data & trans.mask)) {
149
+ cout << "WARNING: expected data value " << std::showbase << std::hex << trans.data << endl;
150
+ }
151
+ }
152
+ else {
153
+ cout << "[" << name() << "]: external READ returned ERROR expected data : "
154
+ << std::showbase << std::hex << trans.data
155
+ << " from address \t" << std::showbase << std::hex << trans.addr
156
+ << "\tAt time " << sc_time_stamp() << endl;
157
+ }
158
+ }
159
+ break;
160
+ case WRITE:
161
+ if ((trans.addr >= PROC_LOCALMEMORY_BASE_ADDR) &&
162
+ (trans.addr < (PROC_LOCALMEMORY_BASE_ADDR + PROC_LOCALMEMORY_SIZE))) {
163
+ // internal write
164
+ local_memory[trans.addr-PROC_LOCALMEMORY_BASE_ADDR] = trans.data;
165
+ // display value written
166
+ cout << "[" << name() << "]: local memory WRITE data : "
167
+ << std::showbase << std::hex << trans.data
168
+ << " at address \t" << std::showbase << std::hex << trans.addr
169
+ << "\tAt time " << sc_time_stamp() << endl;
170
+ } else {
171
+ // external write
172
+ status = ahb_master_port.write(trans.addr, trans.data);
173
+ if (status.is_ok()) {
174
+ // display value written
175
+ cout << "[" << name() << "]: external WRITE data : "
176
+ << std::showbase << std::hex << trans.data
177
+ << " to address \t" << std::showbase << std::hex << trans.addr
178
+ << "\tAt time " << sc_time_stamp() << endl;
179
+ }
180
+ else {
181
+ cout << "[" << name() << "]: external WRITE returned ERROR expected data : "
182
+ << std::showbase << std::hex << trans.data
183
+ << " to address \t" << std::showbase << std::hex << trans.addr
184
+ << "\tAt time " << sc_time_stamp() << endl;
185
+ }
186
+
187
+ }
188
+ break;
189
+ case END:
190
+ cout << "[" << name() << "]: Table Finished "
191
+ << "\tAt time " << sc_time_stamp() << endl;
192
+ break;
193
+ default:
194
+ cout << "[" << name() << "]: WARNING Skiping Unknown command" << endl;
195
+ break;
196
+ }
197
+ wait(); // next edge
198
+ while (clk.read() != SC_LOGIC_1) // wait if not rising
199
+ wait();
200
+ }
201
+ }
202
+
203
+ // Watch for a reset
204
+ void processor::restart() {
205
+
206
+ if (!rst_an.read()) {
207
+ cout << name() << " Reset" << "\tAt time " << sc_time_stamp() << endl;
208
+ cmdIndex_ = 0;
209
+ }
210
+ }
211
+
212
+
213
+ // Handle slave port write requests
214
+ tlm::tlm_status processor::write( const ADDRESS_TYPE &addr , const DATA_TYPE &data,
215
+ const unsigned int byte_enable,
216
+ const tlm::tlm_mode mode,
217
+ const unsigned int export_id)
218
+ {
219
+ tlm::tlm_status status;
220
+ if ((addr < PROC_BASE_ADDR) || (addr >= PROC_BASE_ADDR+PROC_SIZE)) {
221
+ cout << "ERROR\t" << name() << " : trying to write out of bounds at address " << addr << endl;
222
+ status.set_error();
223
+ return status;
224
+ }
225
+ // APB write. for now only effect is to reset the interrupt
226
+ //enableInterrupt_ = !enableInterrupt_;
227
+ //cout << name() << " : interrupts enable = " << enableInterrupt_ << endl;
228
+ apb_memory[addr & PROC_SIZE] = data;
229
+
230
+ status.set_ok();
231
+ return status;
232
+ }
233
+
234
+ // Handle slave port read requests
235
+ tlm::tlm_status processor::read( const ADDRESS_TYPE &addr , DATA_TYPE &data,
236
+ const unsigned int byte_enable,
237
+ const tlm::tlm_mode mode,
238
+ const unsigned int export_id)
239
+ {
240
+ tlm::tlm_status status;
241
+ if ((addr < PROC_BASE_ADDR) || (addr >= PROC_BASE_ADDR+PROC_SIZE)) {
242
+ cout << "ERROR\t" << name() << " : trying to read out of bounds at address " << addr << endl;
243
+ status.set_error();
244
+ return status;
245
+ }
246
+ data = apb_memory[addr & PROC_SIZE];
247
+
248
+ status.set_ok();
249
+ return status;
250
+ }
251
+
252
+ // Handle interrupt requests
253
+ void processor::catch_it() {
254
+ // decode interrupt signal
255
+ irqvec_port.write(irl_port.read());
256
+
257
+ if (enableInterrupt_ && irl_port.read() != 0) {
258
+ cout << name() << " Got interrupt. Send ack and reset SubSystem Interrupt register" << endl;
259
+ intack_port.write(1);
260
+ }
261
+ if (!enableInterrupt_ || irl_port.read() == 0) {
262
+ // cout << name() << " intack low" << endl;
263
+ intack_port.write(0);
264
+ }
265
+ }
266
+
267
+ // Initialize local memory
268
+ void processor::init_local_memory()
269
+ {
270
+ for (unsigned long i=0; i < PROC_LOCALMEMORY_SIZE; i++) local_memory[i]=0;
271
+ for (unsigned long i=0; i < PROC_SIZE; i++) apb_memory[i]=0;
272
+ }
273
+
274
+ // the file name should have the .tbl extension
275
+ // the file format is (
276
+ // R Address Data <MASK>
277
+ // W Address Data
278
+ // I Clocks
279
+ // Note: address and data values in HEX comments start with --
280
+ void processor::read_testbench_file( const char *file_name ) {
281
+ ifstream fd ( file_name );
282
+ std::string line;
283
+ std::string token, token2;
284
+ if ( ! fd.is_open() ) {
285
+ cout << "[" << name() << "]: ERROR Cannot open file " << file_name << endl;
286
+ return;
287
+ }
288
+ int i=0;
289
+ while( !fd.eof() ) {
290
+ getline(fd ,line) ;
291
+ std::istringstream iss(line);
292
+ token = "";
293
+ iss>>token;
294
+ if (token=="" || (token[0]=='-' && token[1]=='-')) continue;
295
+ switch (token[0]) {
296
+ case 'R' :
297
+ tbData_[i].cmd = READ;
298
+ tbData_[i].cmdname = 'R';
299
+ iss >> token2; tbData_[i].addr = std::strtol(token2.c_str(),0,16);
300
+ iss >> token2; tbData_[i].data = std::strtol(token2.c_str(),0,16);
301
+ iss >> token2;
302
+ if (token2=="" || token2=="--" ) {
303
+ tbData_[i].mask = std::strtol("FFFFFFFF",0,16);
304
+ } else {
305
+ tbData_[i].mask = std::strtol(token2.c_str(),0,16);
306
+ }
307
+ i++;
308
+ break;
309
+ case 'W' :
310
+ tbData_[i].cmd = WRITE;
311
+ tbData_[i].cmdname = 'W';
312
+ iss >> token2; tbData_[i].addr = std::strtol(token2.c_str(),0,16);
313
+ iss >> token2; tbData_[i].data = std::strtol(token2.c_str(),0,16);
314
+ i++;
315
+ break;
316
+ case 'I' :
317
+ tbData_[i].cmd = IDLE;
318
+ tbData_[i].cmdname = 'I';
319
+ iss >> token2; tbData_[i].idle = std::strtol(token2.c_str(),0,10);
320
+ i++;
321
+ break;
322
+ case '-' :
323
+ tbData_[i].cmd = COMMENT;
324
+ tbData_[i].cmdname = 'C';
325
+ i++;
326
+ break;
327
+ }
328
+ }
329
+ tbData_[i++].cmd = END;
330
+ numTbCmds_ = i;
331
+ }
@@ -0,0 +1,121 @@
1
+ //
2
+ // Revision: $Revision: 1506 $
3
+ // Date: $Date: 2009-04-26 01:51:56 -0500 (Sun, 26 Apr 2009) $
4
+ //
5
+ // Copyright (c) 2005, 2006, 2007, 2008, 2009 The SPIRIT Consortium.
6
+ //
7
+ // This work forms part of a deliverable of The SPIRIT Consortium.
8
+ //
9
+ // Use of these materials are governed by the legal terms and conditions
10
+ // outlined in the disclaimer available from www.spiritconsortium.org.
11
+ //
12
+ // This source file is provided on an AS IS basis. The SPIRIT
13
+ // Consortium disclaims any warranty express or implied including
14
+ // any warranty of merchantability and fitness for use for a
15
+ // particular purpose.
16
+ //
17
+ // The user of the source file shall indemnify and hold The SPIRIT
18
+ // Consortium and its members harmless from any damages or liability.
19
+ // Users are requested to provide feedback to The SPIRIT Consortium
20
+ // using either mailto:feedback@lists.spiritconsortium.org or the forms at
21
+ // http://www.spiritconsortium.org/about/contact_us/
22
+ //
23
+ // This file may be copied, and distributed, with or without
24
+ // modifications; but this notice must be included on any copy.
25
+
26
+ /*------------------------------------------------------------------------------
27
+ * Simple TLM processor
28
+ * Note: this is a dummy implementation of a Leon2 processor.
29
+ * One should read this model as a simple testbench generator.
30
+ *------------------------------------------------------------------------------*/
31
+
32
+ #ifndef _PROCESSOR_H_
33
+ #define _PROCESSOR_H_
34
+
35
+ /*------------------------------------------------------------------------------
36
+ * Includes
37
+ *----------------------------------------------------------------------------*/
38
+ #include <systemc.h>
39
+ #include <string.h>
40
+
41
+ #include "pv_slave_base.h"
42
+ #include "pv_target_port.h"
43
+ #include "pv_initiator_port.h"
44
+ #include "user_types.h"
45
+
46
+ /*------------------------------------------------------------------------------
47
+ * Define device parameters (for APB slave)
48
+ *----------------------------------------------------------------------------*/
49
+ #define PROC_BASE_ADDR 0x0000 // in global systems, start at: 0x30006000
50
+ #define PROC_SIZE 0x1000 // 4Kb
51
+ /*------------------------------------------------------------------------------
52
+ * Define device parameters (for local memory)
53
+ *----------------------------------------------------------------------------*/
54
+ #define PROC_LOCALMEMORY_BASE_ADDR 0x10000000
55
+ #define PROC_LOCALMEMORY_SIZE 0x1000 // 4Kb
56
+
57
+ //#define LOCALMEMORYADDR 0x10000000
58
+ //#define LOCALMEMORYBITS 4 // number of address bits
59
+ //#define LOCALMEMORYSIZE 16 // number of memory locations
60
+ /*------------------------------------------------------------------------------
61
+ * testbench processor
62
+ *----------------------------------------------------------------------------*/
63
+
64
+ // the processor class
65
+ class processor :
66
+ public sc_module,
67
+ public pv_slave_base< ADDRESS_TYPE , DATA_TYPE >
68
+ {
69
+ public:
70
+ SC_HAS_PROCESS( processor );
71
+ processor( sc_module_name module_name , char* tb_file_name);
72
+ ~processor();
73
+
74
+ // ports
75
+ pv_target_port<ADDRESS_TYPE,DATA_TYPE> apb_slave_port;
76
+ pv_initiator_port<ADDRESS_TYPE,DATA_TYPE> ahb_master_port;
77
+ sc_in<sc_logic> clk;
78
+ sc_in<bool> rst_an;
79
+ sc_in<int> irl_port;
80
+ sc_out<int> irqvec_port;
81
+ sc_out<bool> intack_port;
82
+
83
+ // APB slave
84
+ tlm::tlm_status write( const ADDRESS_TYPE &addr , const DATA_TYPE &data,
85
+ const unsigned int byte_enable = tlm::NO_BE,
86
+ const tlm::tlm_mode mode = tlm::REGULAR,
87
+ const unsigned int export_id = 0 );
88
+ tlm::tlm_status read( const ADDRESS_TYPE &addr , DATA_TYPE &data,
89
+ const unsigned int byte_enable = tlm::NO_BE,
90
+ const tlm::tlm_mode mode = tlm::REGULAR,
91
+ const unsigned int export_id = 0 );
92
+
93
+ private:
94
+ void ahbMaster();
95
+ void restart();
96
+ void catch_it();
97
+ void read_testbench_file(const char* fileName);
98
+ void end_of_elaboration();
99
+ void init_local_memory();
100
+
101
+ typedef enum {READ, WRITE, IDLE, COMMENT, END} cmd_t;
102
+ typedef struct {
103
+ cmd_t cmd;
104
+ char cmdname;
105
+ unsigned long addr;
106
+ unsigned int idle;
107
+ unsigned long data;
108
+ unsigned long mask;
109
+ char* comment;
110
+ } tb_cmd_t;
111
+
112
+ sc_pvector<DATA_TYPE> local_memory;
113
+ sc_pvector<DATA_TYPE> apb_memory;
114
+ sc_pvector<tb_cmd_t> tbData_;
115
+ int numTbCmds_;
116
+ int cmdIndex_;
117
+ bool enableInterrupt_;
118
+ };
119
+
120
+
121
+ #endif /* _PROCESSOR_H_ */