// ************************************************************************** //
//                                                                            //
//    eses                   eses                                             //
//   eses                     eses                                            //
//  eses    eseses  esesese    eses   Embedded Systems Group                  //
//  ese    ese  ese ese         ese                                           //
//  ese    eseseses eseseses    ese   Department of Computer Science          //
//  eses   eses          ese   eses                                           //
//   eses   eseses  eseseses  eses    University of Kaiserslautern            //
//    eses                   eses                                             //
//                                                                            //
// ************************************************************************** //

                                                                           
macro DataWidth = 8;      // bit-width of registers 
                                                                           
module DataConflictsLD(bv{16} ?instr,nat pc) {                              
    event nat adrMem;                 // address for memory access         
    event bv{DataWidth} dataMem;      // data for memory access            
    event readMem,writeMem;           // flags for reading/writing         
    event reqMem,ackMem,doneMem;      // signals for memory transaction    
    // single CPU
    cpu: ScalarBehav(instr,pc,adrMem,dataMem,readMem,writeMem,reqMem,ackMem,doneMem);
    ||
    // connected to data memory
    memory: MainMemory(adrMem,dataMem,readMem,writeMem,reqMem,ackMem,doneMem);
}
drivenby DataConflictsLDDrv {
    [13]bv{16} Prog;
    Prog = [
        0b1000000010000001,  //   0:     mov R1,1
        0b1000000100000010,  //   1:     mov R2,2
        0b1000000110000011,  //   2:     mov R3,3
        0b1000001000000100,  //   3:     mov R4,4
        0b1000001010000101,  //   4:     mov R5,5
        0b0110100010100000,  //   5: I1:  ld R1,R2,0     
        0b0000001000011000,  //   6: I2: add R4,R1,R4    
        0b0000001010010010,  //   7: I3: add R5,R1,R1    
        0b0000001000010100,  //   8: I3: add R4,R1,R2    
        0b0000100000000000,  //   9:     nop
        0b0000100000000000,  //  10:     nop
        0b0000100000000000,  //  11:     nop
        0b0000100000000000   //  12:     nop
    ];
    pause;
    weak abort {
        loop {
            instr = Prog[pc];
            pause;
        }
    } when(pc>=12);
}