source: trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Front_end/Front_end/Context_State/src/Context_State_genMoore.cpp @ 123

Last change on this file since 123 was 123, checked in by rosiere, 15 years ago

1) Fix performance
2) add auto generation to SPECINT2000
3) add reset in genMoore and genMealy

  • Property svn:keywords set to Id
File size: 6.4 KB
Line 
1#ifdef SYSTEMC
2/*
3 * $Id: Context_State_genMoore.cpp 123 2009-06-08 20:43:30Z rosiere $
4 *
5 * [ Description ]
6 *
7 */
8
9#include "Behavioural/Core/Multi_Front_end/Front_end/Context_State/include/Context_State.h"
10
11namespace morpheo                    {
12namespace behavioural {
13namespace core {
14namespace multi_front_end {
15namespace front_end {
16namespace context_state {
17
18
19#undef  FUNCTION
20#define FUNCTION "Context_State::genMoore"
21  void Context_State::genMoore (void)
22  {
23    log_begin(Context_State,FUNCTION);
24    log_function(Context_State,FUNCTION,_name.c_str());
25
26    if (PORT_READ(in_NRESET))
27      {
28    // -------------------------------------------------------------------
29    // -----[ EVENT ]-----------------------------------------------------
30    // -------------------------------------------------------------------
31    for (uint32_t i=0; i<_param->_nb_context; i++)
32      {
33        context_state_t state = reg_STATE [i];
34
35        Tcontrol_t val              = ((state == CONTEXT_STATE_KO_EXCEP_ADDR      ) or
36                                       (state == CONTEXT_STATE_KO_MISS_BRANCH_ADDR) or
37                                       (state == CONTEXT_STATE_KO_MISS_LOAD_AND_BRANCH_ADDR) or
38                                       (state == CONTEXT_STATE_KO_MISS_LOAD_ADDR  ) or
39                                       (state == CONTEXT_STATE_KO_PSYNC_ADDR      ) or
40                                       (state == CONTEXT_STATE_KO_CSYNC_ADDR));
41       
42        // SR can't change in this cycle
43        // Exception Prefix High
44        Taddress_t    address          = reg_EVENT_ADDRESS [i] | (((state == CONTEXT_STATE_KO_EXCEP_ADDR) and PORT_READ(in_SPR_SR_EPH [i]))?(0xF000000>>2):0);
45        Taddress_t    address_next     = reg_EVENT_ADDRESS_EPCR [i];
46        Tcontrol_t    address_next_val = (state == CONTEXT_STATE_KO_MISS_BRANCH_ADDR) and (reg_EVENT_ADDRESS_EPCR_VAL [i]);
47        Tcontrol_t    is_ds_take       = (state == CONTEXT_STATE_KO_MISS_BRANCH_ADDR) and (reg_EVENT_IS_DS_TAKE       [i]);
48        // excep : address exception
49        // miss  : address delay_slot, and address dest
50        // psync : address next
51        // csync : address next
52        Tevent_type_t type                         ;//[nb_context]
53        Tdepth_t      depth            = reg_EVENT_DEPTH [i];
54        Tcontrol_t    flush_only       = reg_EVENT_FLUSH_ONLY [i];
55
56        switch (state)
57          {
58          case CONTEXT_STATE_KO_EXCEP_ADDR      : (type = EVENT_TYPE_EXCEPTION              ); break;
59          case CONTEXT_STATE_KO_MISS_LOAD_AND_BRANCH_ADDR: 
60          case CONTEXT_STATE_KO_MISS_BRANCH_ADDR: (type = EVENT_TYPE_BRANCH_MISS_SPECULATION); break;
61          case CONTEXT_STATE_KO_MISS_LOAD_ADDR  : (type = EVENT_TYPE_LOAD_MISS_SPECULATION  ); break;
62          case CONTEXT_STATE_KO_PSYNC_ADDR      : (type = EVENT_TYPE_PSYNC                  ); break; 
63          case CONTEXT_STATE_KO_CSYNC_ADDR      : (type = EVENT_TYPE_CSYNC                  ); break;
64          default                               : (type = EVENT_TYPE_NONE                   ); break;
65          }
66//      (type = EVENT_TYPE_SPR_ACCESS        );
67//      (type = EVENT_TYPE_MSYNC             );
68//      (type = EVENT_TYPE_BRANCH_NO_ACCURATE);
69
70        internal_EVENT_VAL [i] = val;
71        PORT_WRITE(out_EVENT_ADDRESS          [i], address);
72        PORT_WRITE(out_EVENT_ADDRESS_NEXT     [i], address_next); 
73        PORT_WRITE(out_EVENT_ADDRESS_NEXT_VAL [i], address_next_val);
74        PORT_WRITE(out_EVENT_IS_DS_TAKE       [i], is_ds_take);
75        PORT_WRITE(out_EVENT_TYPE             [i], type);
76        if (_param->_have_port_depth)
77        PORT_WRITE(out_EVENT_DEPTH            [i], depth);
78        PORT_WRITE(out_EVENT_FLUSH_ONLY       [i], flush_only);
79
80        log_printf(TRACE,Context_State,FUNCTION,"  * EVENT Context      : %d", i);
81        log_printf(TRACE,Context_State,FUNCTION,"    * VAL              : %d", val);
82        log_printf(TRACE,Context_State,FUNCTION,"    * ADDRESS          : %.8x (%.8x)", address     , address     <<2);
83        log_printf(TRACE,Context_State,FUNCTION,"    * ADDRESS_NEXT     : %.8x (%.8x)", address_next, address_next<<2); 
84        log_printf(TRACE,Context_State,FUNCTION,"    * ADDRESS_NEXT_VAL : %d", address_next_val);
85        log_printf(TRACE,Context_State,FUNCTION,"    * IS_DS_TAKE       : %d", is_ds_take);
86        log_printf(TRACE,Context_State,FUNCTION,"    * TYPE             : %d", type);
87        log_printf(TRACE,Context_State,FUNCTION,"    * DEPTH            : %d", depth);
88        log_printf(TRACE,Context_State,FUNCTION,"    * FLUSH_ONLY       : %d", flush_only);
89      }
90
91    // -------------------------------------------------------------------
92    // -----[ SPR_EVENT ]-------------------------------------------------
93    // -------------------------------------------------------------------
94    for (uint32_t i=0; i<_param->_nb_context; i++)
95      {
96        context_state_t state = reg_STATE [i];
97
98        internal_SPR_EVENT_VAL [i] = (state == CONTEXT_STATE_KO_EXCEP_SPR  );
99
100        PORT_WRITE(out_SPR_EVENT_EPCR      [i], reg_EVENT_ADDRESS_EPCR     [i]);
101        PORT_WRITE(out_SPR_EVENT_EEAR      [i], reg_EVENT_ADDRESS_EEAR     [i]);
102        PORT_WRITE(out_SPR_EVENT_EEAR_WEN  [i], reg_EVENT_ADDRESS_EEAR_VAL [i]);
103        PORT_WRITE(out_SPR_EVENT_SR_DSX    [i], reg_EVENT_IS_DELAY_SLOT    [i]);
104        PORT_WRITE(out_SPR_EVENT_SR_TO_ESR [i], 1);
105      }
106
107    // -------------------------------------------------------------------
108    // -----[ CONTEXT ]---------------------------------------------------
109    // -------------------------------------------------------------------
110    for (uint32_t i=0; i<_param->_nb_context; i++)
111      {
112        context_state_t state = reg_STATE [i];
113
114//      PORT_WRITE(out_CONTEXT_DECOD_ENABLE [i], ((state==CONTEXT_STATE_OK            ) or
115//                                                (state==CONTEXT_STATE_KO_MSYNC_ISSUE) or
116//                                                (state==CONTEXT_STATE_KO_SPR_ISSUE  )));
117        PORT_WRITE(out_CONTEXT_DECOD_ENABLE [i], (state==CONTEXT_STATE_OK));
118      }
119      }
120    else
121      {
122        for (uint32_t i=0; i<_param->_nb_context; i++)
123          {
124            internal_EVENT_VAL     [i] = 0;
125            internal_SPR_EVENT_VAL [i] = 0;
126
127            PORT_WRITE(out_CONTEXT_DECOD_ENABLE [i], 0);
128          }
129      }
130
131    // Write output
132    for (uint32_t i=0; i<_param->_nb_context; i++)
133      {
134        PORT_WRITE(out_EVENT_VAL     [i], internal_EVENT_VAL     [i]);
135        PORT_WRITE(out_SPR_EVENT_VAL [i], internal_SPR_EVENT_VAL [i]);
136      }
137
138    log_end(Context_State,FUNCTION);
139  };
140
141}; // end namespace context_state
142}; // end namespace front_end
143}; // end namespace multi_front_end
144}; // end namespace core
145
146}; // end namespace behavioural
147}; // end namespace morpheo             
148#endif
Note: See TracBrowser for help on using the repository browser.