First configuration of the XSPNController
This commit is contained in:
		@@ -49,17 +49,7 @@ void configure_irq(size_t irq_num, function_ptr_t handler, unsigned char prio=1)
 | 
			
		||||
 | 
			
		||||
static void msi_interrupt_handler(){
 | 
			
		||||
    int * local_mem_base = (int *) 0x80000100;
 | 
			
		||||
    int hartid = read_csr(mhartid);
 | 
			
		||||
 | 
			
		||||
	int val_a = *local_mem_base;
 | 
			
		||||
	int val_b = *(local_mem_base+1);
 | 
			
		||||
	int sum = val_a + val_b;
 | 
			
		||||
	*(local_mem_base+100) = sum;
 | 
			
		||||
	if (sum == 0xF)
 | 
			
		||||
		printf("HW thread ID %d: sum of A+B=0x%x\n", hartid, sum);
 | 
			
		||||
	else {
 | 
			
		||||
		printf("HW thread ID %d: sum of A+B is not 0x%x. Test FAILED!!!\n", hartid, sum);
 | 
			
		||||
	}
 | 
			
		||||
    printf("INterrupt handler call\n");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*!\brief initializes platform
 | 
			
		||||
@@ -94,16 +84,22 @@ void platform_init(){
 | 
			
		||||
int main() {
 | 
			
		||||
    platform_init();
 | 
			
		||||
 | 
			
		||||
    printf("Configure SPN HW accelerator\n");
 | 
			
		||||
    spn::mode_reg() = 0;
 | 
			
		||||
    spn::input_length_reg() = 1;
 | 
			
		||||
    spn::input_addr_reg() = 0x80000000;
 | 
			
		||||
    spn::output_addr_reg() = 0x80001000;
 | 
			
		||||
    spn::num_of_in_beats_reg() = 1;
 | 
			
		||||
    spn::num_of_out_beats_reg() = 1;
 | 
			
		||||
    spn::mode_reg() = 1;
 | 
			
		||||
    spn::start_reg() = 1;
 | 
			
		||||
    printf("READOUT reuslt:0x%x\n", spn::readout_reg());
 | 
			
		||||
    spn::interrupt_reg() = 1;
 | 
			
		||||
 | 
			
		||||
    spn::input_length_reg() = 5;
 | 
			
		||||
    spn::input_addr_reg() = 0x80000000;
 | 
			
		||||
    spn::output_addr_reg() = 0x80100000;
 | 
			
		||||
    spn::num_of_in_beats_reg() = 5;
 | 
			
		||||
    spn::num_of_out_beats_reg() = 1;
 | 
			
		||||
    spn::mode_reg() = 0;
 | 
			
		||||
 | 
			
		||||
    uint32_t result_addr = spn::output_addr_reg();
 | 
			
		||||
 | 
			
		||||
    spn::start_reg() = 1;
 | 
			
		||||
    printf("Start SPN HW accelerator\n");
 | 
			
		||||
    spn::start_reg()=1;
 | 
			
		||||
 | 
			
		||||
    delayUS(100);
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -40,23 +40,25 @@
 | 
			
		||||
#include <cstdint>
 | 
			
		||||
 | 
			
		||||
#define SPN_REG_START               0x00
 | 
			
		||||
#define SPN_REG_RET_VAL             0x10
 | 
			
		||||
#define SPN_REG_READOUT             0x10
 | 
			
		||||
#define SPN_REG_MODE                0x20
 | 
			
		||||
#define SPN_REG_INPUT_LENGTH        0x30
 | 
			
		||||
#define SPN_REG_INPUT_ADDR          0x40
 | 
			
		||||
#define SPN_REG_OUTPUT_ADDR         0x50
 | 
			
		||||
#define SPN_REG_NUM_OF_INPUT_BEATS  0x60
 | 
			
		||||
#define SPN_REG_NUM_OF_OUTPUT_BEATS 0x70
 | 
			
		||||
#define SPN_REG_INTERRUPT           0x0C
 | 
			
		||||
 | 
			
		||||
template<uint32_t BASE_ADDR>
 | 
			
		||||
class spn_regs {
 | 
			
		||||
public:
 | 
			
		||||
    // storage declarations
 | 
			
		||||
    BEGIN_BF_DECL(start_t, uint32_t);
 | 
			
		||||
        BF_FIELD(start, 0, 1);
 | 
			
		||||
    END_BF_DECL() r_start;
 | 
			
		||||
//    BEGIN_BF_DECL(start_t, uint32_t);
 | 
			
		||||
//        BF_FIELD(start, 0, 1);
 | 
			
		||||
//    END_BF_DECL() r_start;
 | 
			
		||||
    uint32_t r_start;
 | 
			
		||||
 | 
			
		||||
    uint32_t r_ret_val;
 | 
			
		||||
    uint32_t r_readout;
 | 
			
		||||
 | 
			
		||||
    uint32_t r_mode;
 | 
			
		||||
 | 
			
		||||
@@ -70,8 +72,15 @@ public:
 | 
			
		||||
 | 
			
		||||
    uint32_t r_num_of_output_beats;
 | 
			
		||||
 | 
			
		||||
    static inline start_t& start_reg(){
 | 
			
		||||
        return *reinterpret_cast<start_t*>(BASE_ADDR+SPN_REG_START);
 | 
			
		||||
//    static inline start_t& start_reg(){
 | 
			
		||||
//        return *reinterpret_cast<start_t*>(BASE_ADDR+SPN_REG_START);
 | 
			
		||||
//    }
 | 
			
		||||
    static inline uint32_t& start_reg(){
 | 
			
		||||
        return *reinterpret_cast<uint32_t*>(BASE_ADDR+SPN_REG_START);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    static inline uint32_t & readout_reg(){
 | 
			
		||||
        return *reinterpret_cast<uint32_t*>(BASE_ADDR+SPN_REG_READOUT);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    static inline uint32_t & mode_reg(){
 | 
			
		||||
@@ -97,6 +106,11 @@ public:
 | 
			
		||||
    static inline uint32_t & num_of_out_beats_reg(){
 | 
			
		||||
        return *reinterpret_cast<uint32_t*>(BASE_ADDR+SPN_REG_NUM_OF_OUTPUT_BEATS);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    static inline uint32_t & interrupt_reg(){
 | 
			
		||||
        return *reinterpret_cast<uint32_t*>(BASE_ADDR+SPN_REG_INTERRUPT);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#endif // _SPN_REGS_H_
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user