From 43d3ffd6855cf4736afdc2f6f70e5beb426c6d77 Mon Sep 17 00:00:00 2001 From: Dolu1990 Date: Thu, 4 Jan 2018 17:37:23 +0100 Subject: [PATCH] CsrPlugin : Now wait that the whole pipeline (including writeback) is empty before executing interruptions. This make the separation between context switching clear and avoid on atomic instructions failure --- .../scala/vexriscv/plugin/CsrPlugin.scala | 6 +- src/test/cpp/custom/atomic/build/atomic.asm | 394 ++++++++++-------- src/test/cpp/custom/atomic/build/atomic.elf | Bin 5200 -> 5460 bytes src/test/cpp/custom/atomic/build/atomic.hex | 100 +++-- src/test/cpp/custom/atomic/build/atomic.map | 14 +- src/test/cpp/custom/atomic/build/atomic.v | 92 ++-- src/test/cpp/custom/atomic/src/crt.S | 62 ++- src/test/cpp/regression/atomic.gtkw | 32 +- src/test/cpp/regression/main.cpp | 2 +- 9 files changed, 432 insertions(+), 270 deletions(-) diff --git a/src/main/scala/vexriscv/plugin/CsrPlugin.scala b/src/main/scala/vexriscv/plugin/CsrPlugin.scala index 6256645..6549166 100644 --- a/src/main/scala/vexriscv/plugin/CsrPlugin.scala +++ b/src/main/scala/vexriscv/plugin/CsrPlugin.scala @@ -335,7 +335,7 @@ class CsrPlugin(config : CsrPluginConfig) extends Plugin[VexRiscv] with Exceptio val pipelineLiberator = new Area{ val enable = False.noBackendCombMerge //Verilator Perf prefetch.arbitration.haltByOther setWhen(enable) - val done = ! List(fetch, decode, execute, memory).map(_.arbitration.isValid).orR + val done = ! List(fetch, decode, execute, memory, writeBack).map(_.arbitration.isValid).orR } @@ -395,7 +395,7 @@ class CsrPlugin(config : CsrPluginConfig) extends Plugin[VexRiscv] with Exceptio val interrupt = ((mip.MSIP && mie.MSIE) || (mip.MEIP && mie.MEIE) || (mip.MTIP && mie.MTIE)) && mstatus.MIE && allowInterrupts val exception = if(exceptionPortCtrl != null) exceptionPortCtrl.exceptionValids.last && allowException else False - val writeBackWfi = if(wfiGen) writeBack.arbitration.isValid && writeBack.input(ENV_CTRL) === EnvCtrlEnum.WFI else False + val writeBackWasWfi = if(wfiGen) RegNext(writeBack.arbitration.isFiring && writeBack.input(ENV_CTRL) === EnvCtrlEnum.WFI) init(False) else False //Interrupt/Exception entry logic pipelineLiberator.enable setWhen(interrupt) @@ -407,7 +407,7 @@ class CsrPlugin(config : CsrPluginConfig) extends Plugin[VexRiscv] with Exceptio mstatus.MPP := privilege mepc := exception mux( True -> writeBack.input(PC), - False -> (writeBackWfi ? (writeBack.input(PC) + 4) | prefetch.input(PC_CALC_WITHOUT_JUMP)) //TODO ? WFI could emulate J PC + 4 + False -> (writeBackWasWfi ? writeBack.input(PC) | prefetch.input(PC_CALC_WITHOUT_JUMP)) ) mcause.interrupt := interrupt diff --git a/src/test/cpp/custom/atomic/build/atomic.asm b/src/test/cpp/custom/atomic/build/atomic.asm index a7c0b51..b2e9937 100644 --- a/src/test/cpp/custom/atomic/build/atomic.asm +++ b/src/test/cpp/custom/atomic/build/atomic.asm @@ -5,7 +5,7 @@ build/atomic.elf: file format elf32-littleriscv Disassembly of section .crt_section: 00000000 : - 0: 0300006f j 30 <_start> + 0: 04c0006f j 4c <_start> 4: 00000013 nop 8: 00000013 nop c: 00000013 nop @@ -15,174 +15,232 @@ Disassembly of section .crt_section: 1c: 00000013 nop 00000020 : - 20: 34102ef3 csrr t4,mepc - 24: 004e8e93 addi t4,t4,4 - 28: 341e9073 csrw mepc,t4 - 2c: 30200073 mret + 20: 30002ef3 csrr t4,mstatus + 24: 080efe93 andi t4,t4,128 + 28: 000e8a63 beqz t4,3c + 2c: 00002eb7 lui t4,0x2 + 30: 800e8e93 addi t4,t4,-2048 # 1800 + 34: 300e9073 csrw mstatus,t4 + 38: 30200073 mret -00000030 <_start>: - 30: 00100e13 li t3,1 - 34: 10000537 lui a0,0x10000 - 38: 06400593 li a1,100 - 3c: 06500613 li a2,101 - 40: 06600693 li a3,102 - 44: 00d52023 sw a3,0(a0) # 10000000 - 48: 18b5262f sc.w a2,a1,(a0) - 4c: 00100713 li a4,1 - 50: 22e61663 bne a2,a4,27c - 54: 00052703 lw a4,0(a0) - 58: 22e69263 bne a3,a4,27c - 5c: 00200e13 li t3,2 - 60: 10000537 lui a0,0x10000 - 64: 00450513 addi a0,a0,4 # 10000004 - 68: 06700593 li a1,103 - 6c: 06800613 li a2,104 - 70: 06900693 li a3,105 - 74: 00d52023 sw a3,0(a0) - 78: 18b5262f sc.w a2,a1,(a0) - 7c: 00100713 li a4,1 - 80: 1ee61e63 bne a2,a4,27c - 84: 00052703 lw a4,0(a0) - 88: 1ee69a63 bne a3,a4,27c - 8c: 00300e13 li t3,3 - 90: 10000537 lui a0,0x10000 - 94: 00450513 addi a0,a0,4 # 10000004 - 98: 06700593 li a1,103 - 9c: 06800613 li a2,104 - a0: 06900693 li a3,105 - a4: 18b5262f sc.w a2,a1,(a0) - a8: 00100713 li a4,1 - ac: 1ce61863 bne a2,a4,27c - b0: 00052703 lw a4,0(a0) - b4: 1ce69463 bne a3,a4,27c - b8: 00400e13 li t3,4 - bc: 10000537 lui a0,0x10000 - c0: 00850513 addi a0,a0,8 # 10000008 - c4: 06a00593 li a1,106 - c8: 06b00613 li a2,107 - cc: 06c00693 li a3,108 - d0: 00d52023 sw a3,0(a0) - d4: 100527af lr.w a5,(a0) - d8: 18b5262f sc.w a2,a1,(a0) - dc: 1ad79063 bne a5,a3,27c - e0: 18061e63 bnez a2,27c - e4: 00052703 lw a4,0(a0) - e8: 18e59a63 bne a1,a4,27c - ec: 00500e13 li t3,5 - f0: 10000537 lui a0,0x10000 - f4: 00850513 addi a0,a0,8 # 10000008 - f8: 06d00593 li a1,109 - fc: 06e00613 li a2,110 - 100: 06f00693 li a3,111 - 104: 00d52023 sw a3,0(a0) - 108: 18b5262f sc.w a2,a1,(a0) - 10c: 16061863 bnez a2,27c - 110: 00052703 lw a4,0(a0) - 114: 16e59463 bne a1,a4,27c - 118: 00600e13 li t3,6 - 11c: 10000537 lui a0,0x10000 - 120: 00c50513 addi a0,a0,12 # 1000000c - 124: 07000593 li a1,112 - 128: 07100613 li a2,113 - 12c: 07200693 li a3,114 - 130: 10000437 lui s0,0x10000 - 134: 01040413 addi s0,s0,16 # 10000010 - 138: 07300493 li s1,115 - 13c: 07400913 li s2,116 - 140: 07500993 li s3,117 - 144: 00d52023 sw a3,0(a0) - 148: 01342023 sw s3,0(s0) - 14c: 100527af lr.w a5,(a0) - 150: 10042aaf lr.w s5,(s0) - 154: 18b5262f sc.w a2,a1,(a0) - 158: 1894292f sc.w s2,s1,(s0) - 15c: 12d79063 bne a5,a3,27c - 160: 10061e63 bnez a2,27c - 164: 00052703 lw a4,0(a0) - 168: 10e59a63 bne a1,a4,27c - 16c: 113a9863 bne s5,s3,27c - 170: 10091663 bnez s2,27c - 174: 00042a03 lw s4,0(s0) - 178: 11449263 bne s1,s4,27c - 17c: 00700e13 li t3,7 - 180: 10000537 lui a0,0x10000 - 184: 01450513 addi a0,a0,20 # 10000014 - 188: 07800593 li a1,120 - 18c: 07900613 li a2,121 - 190: 07a00693 li a3,122 - 194: 01000e93 li t4,16 +0000003c : + 3c: 34102ef3 csrr t4,mepc + 40: 004e8e93 addi t4,t4,4 + 44: 341e9073 csrw mepc,t4 + 48: 30200073 mret -00000198 : - 198: 00d52023 sw a3,0(a0) - 19c: 100527af lr.w a5,(a0) - 1a0: 18b5262f sc.w a2,a1,(a0) - 1a4: 0cd79c63 bne a5,a3,27c - 1a8: 0c061a63 bnez a2,27c - 1ac: 00052703 lw a4,0(a0) - 1b0: 0ce59663 bne a1,a4,27c - 1b4: fffe8e93 addi t4,t4,-1 - 1b8: 00450513 addi a0,a0,4 - 1bc: 00358593 addi a1,a1,3 - 1c0: 00360613 addi a2,a2,3 - 1c4: 00368693 addi a3,a3,3 - 1c8: fc0e98e3 bnez t4,198 - 1cc: 00800e13 li t3,8 - 1d0: 10000537 lui a0,0x10000 - 1d4: 01850513 addi a0,a0,24 # 10000018 - 1d8: 07800593 li a1,120 - 1dc: 07900613 li a2,121 - 1e0: 07a00693 li a3,122 - 1e4: 00052783 lw a5,0(a0) - 1e8: 18b5262f sc.w a2,a1,(a0) - 1ec: 00100713 li a4,1 - 1f0: 08e61663 bne a2,a4,27c - 1f4: 00052703 lw a4,0(a0) - 1f8: 08e79263 bne a5,a4,27c - 1fc: 00900e13 li t3,9 - 200: 10000537 lui a0,0x10000 - 204: 10050513 addi a0,a0,256 # 10000100 - 208: 07b00593 li a1,123 - 20c: 07c00613 li a2,124 - 210: 07d00693 li a3,125 - 214: 00d52023 sw a3,0(a0) - 218: 100527af lr.w a5,(a0) - 21c: 00000073 ecall - 220: 18b5262f sc.w a2,a1,(a0) - 224: 00100713 li a4,1 - 228: 04e61a63 bne a2,a4,27c - 22c: 00052703 lw a4,0(a0) - 230: 04e69663 bne a3,a4,27c - 234: 00900e13 li t3,9 - 238: 10000537 lui a0,0x10000 - 23c: 20050513 addi a0,a0,512 # 10000200 - 240: 10000837 lui a6,0x10000 - 244: 20480813 addi a6,a6,516 # 10000204 - 248: 07e00593 li a1,126 - 24c: 07f00613 li a2,127 - 250: 08000693 li a3,128 - 254: 08100893 li a7,129 - 258: 00d52023 sw a3,0(a0) - 25c: 01182023 sw a7,0(a6) - 260: 100827af lr.w a5,(a6) - 264: 18b5262f sc.w a2,a1,(a0) - 268: 00100713 li a4,1 - 26c: 00e61863 bne a2,a4,27c - 270: 00082703 lw a4,0(a6) - 274: 00e89463 bne a7,a4,27c - 278: 0100006f j 288 +0000004c <_start>: + 4c: 00100e13 li t3,1 + 50: 10000537 lui a0,0x10000 + 54: 06400593 li a1,100 + 58: 06500613 li a2,101 + 5c: 06600693 li a3,102 + 60: 00d52023 sw a3,0(a0) # 10000000 + 64: 18b5262f sc.w a2,a1,(a0) + 68: 00100713 li a4,1 + 6c: 2ee61863 bne a2,a4,35c + 70: 00052703 lw a4,0(a0) + 74: 2ee69463 bne a3,a4,35c + 78: 00200e13 li t3,2 + 7c: 10000537 lui a0,0x10000 + 80: 00450513 addi a0,a0,4 # 10000004 + 84: 06700593 li a1,103 + 88: 06800613 li a2,104 + 8c: 06900693 li a3,105 + 90: 00d52023 sw a3,0(a0) + 94: 18b5262f sc.w a2,a1,(a0) + 98: 00100713 li a4,1 + 9c: 2ce61063 bne a2,a4,35c + a0: 00052703 lw a4,0(a0) + a4: 2ae69c63 bne a3,a4,35c + a8: 00300e13 li t3,3 + ac: 10000537 lui a0,0x10000 + b0: 00450513 addi a0,a0,4 # 10000004 + b4: 06700593 li a1,103 + b8: 06800613 li a2,104 + bc: 06900693 li a3,105 + c0: 18b5262f sc.w a2,a1,(a0) + c4: 00100713 li a4,1 + c8: 28e61a63 bne a2,a4,35c + cc: 00052703 lw a4,0(a0) + d0: 28e69663 bne a3,a4,35c + d4: 00400e13 li t3,4 + d8: 10000537 lui a0,0x10000 + dc: 00850513 addi a0,a0,8 # 10000008 + e0: 06a00593 li a1,106 + e4: 06b00613 li a2,107 + e8: 06c00693 li a3,108 + ec: 00d52023 sw a3,0(a0) + f0: 100527af lr.w a5,(a0) + f4: 18b5262f sc.w a2,a1,(a0) + f8: 26d79263 bne a5,a3,35c + fc: 26061063 bnez a2,35c + 100: 00052703 lw a4,0(a0) + 104: 24e59c63 bne a1,a4,35c + 108: 00500e13 li t3,5 + 10c: 10000537 lui a0,0x10000 + 110: 00850513 addi a0,a0,8 # 10000008 + 114: 06d00593 li a1,109 + 118: 06e00613 li a2,110 + 11c: 06f00693 li a3,111 + 120: 00d52023 sw a3,0(a0) + 124: 18b5262f sc.w a2,a1,(a0) + 128: 22061a63 bnez a2,35c + 12c: 00052703 lw a4,0(a0) + 130: 22e59663 bne a1,a4,35c + 134: 00600e13 li t3,6 + 138: 10000537 lui a0,0x10000 + 13c: 00c50513 addi a0,a0,12 # 1000000c + 140: 07000593 li a1,112 + 144: 07100613 li a2,113 + 148: 07200693 li a3,114 + 14c: 10000437 lui s0,0x10000 + 150: 01040413 addi s0,s0,16 # 10000010 + 154: 07300493 li s1,115 + 158: 07400913 li s2,116 + 15c: 07500993 li s3,117 + 160: 00d52023 sw a3,0(a0) + 164: 01342023 sw s3,0(s0) + 168: 100527af lr.w a5,(a0) + 16c: 10042aaf lr.w s5,(s0) + 170: 18b5262f sc.w a2,a1,(a0) + 174: 1894292f sc.w s2,s1,(s0) + 178: 1ed79263 bne a5,a3,35c + 17c: 1e061063 bnez a2,35c + 180: 00052703 lw a4,0(a0) + 184: 1ce59c63 bne a1,a4,35c + 188: 1d3a9a63 bne s5,s3,35c + 18c: 1c091863 bnez s2,35c + 190: 00042a03 lw s4,0(s0) + 194: 1d449463 bne s1,s4,35c + 198: 00700e13 li t3,7 + 19c: 10000537 lui a0,0x10000 + 1a0: 01450513 addi a0,a0,20 # 10000014 + 1a4: 07800593 li a1,120 + 1a8: 07900613 li a2,121 + 1ac: 07a00693 li a3,122 + 1b0: 01000e93 li t4,16 -0000027c : - 27c: f0100137 lui sp,0xf0100 - 280: f2410113 addi sp,sp,-220 # f00fff24 - 284: 01c12023 sw t3,0(sp) +000001b4 : + 1b4: 00d52023 sw a3,0(a0) + 1b8: 100527af lr.w a5,(a0) + 1bc: 18b5262f sc.w a2,a1,(a0) + 1c0: 18d79e63 bne a5,a3,35c + 1c4: 18061c63 bnez a2,35c + 1c8: 00052703 lw a4,0(a0) + 1cc: 18e59863 bne a1,a4,35c + 1d0: fffe8e93 addi t4,t4,-1 + 1d4: 00450513 addi a0,a0,4 + 1d8: 00358593 addi a1,a1,3 + 1dc: 00360613 addi a2,a2,3 + 1e0: 00368693 addi a3,a3,3 + 1e4: fc0e98e3 bnez t4,1b4 + 1e8: 00800e13 li t3,8 + 1ec: 10000537 lui a0,0x10000 + 1f0: 01850513 addi a0,a0,24 # 10000018 + 1f4: 07800593 li a1,120 + 1f8: 07900613 li a2,121 + 1fc: 07a00693 li a3,122 + 200: 00052783 lw a5,0(a0) + 204: 18b5262f sc.w a2,a1,(a0) + 208: 00100713 li a4,1 + 20c: 14e61863 bne a2,a4,35c + 210: 00052703 lw a4,0(a0) + 214: 14e79463 bne a5,a4,35c + 218: 00900e13 li t3,9 + 21c: 10000537 lui a0,0x10000 + 220: 10050513 addi a0,a0,256 # 10000100 + 224: 07b00593 li a1,123 + 228: 07c00613 li a2,124 + 22c: 07d00693 li a3,125 + 230: 00d52023 sw a3,0(a0) + 234: 100527af lr.w a5,(a0) + 238: 00000073 ecall + 23c: 18b5262f sc.w a2,a1,(a0) + 240: 00100713 li a4,1 + 244: 10e61c63 bne a2,a4,35c + 248: 00052703 lw a4,0(a0) + 24c: 10e69863 bne a3,a4,35c + 250: 00a00e13 li t3,10 + 254: 10000537 lui a0,0x10000 + 258: 20050513 addi a0,a0,512 # 10000200 + 25c: 10000837 lui a6,0x10000 + 260: 20480813 addi a6,a6,516 # 10000204 + 264: 07e00593 li a1,126 + 268: 07f00613 li a2,127 + 26c: 08000693 li a3,128 + 270: 08100893 li a7,129 + 274: 00d52023 sw a3,0(a0) + 278: 01182023 sw a7,0(a6) + 27c: 100827af lr.w a5,(a6) + 280: 18b5262f sc.w a2,a1,(a0) + 284: 00100713 li a4,1 + 288: 0ce61a63 bne a2,a4,35c + 28c: 00082703 lw a4,0(a6) + 290: 0ce89663 bne a7,a4,35c + 294: 00b00e13 li t3,11 + 298: 10000537 lui a0,0x10000 + 29c: 30050513 addi a0,a0,768 # 10000300 + 2a0: 08200593 li a1,130 + 2a4: 08300613 li a2,131 + 2a8: 08400693 li a3,132 + 2ac: 00d52023 sw a3,0(a0) + 2b0: 00001eb7 lui t4,0x1 + 2b4: 800e8e93 addi t4,t4,-2048 # 800 + 2b8: 304e9073 csrw mie,t4 + 2bc: 00800e93 li t4,8 + 2c0: 100527af lr.w a5,(a0) + 2c4: 300e9073 csrw mstatus,t4 + 2c8: 00000013 nop + 2cc: 00000013 nop + 2d0: 00000013 nop + 2d4: 00000013 nop + 2d8: 00000013 nop + 2dc: 00000013 nop + 2e0: 18b5262f sc.w a2,a1,(a0) + 2e4: 00100713 li a4,1 + 2e8: 06e61a63 bne a2,a4,35c + 2ec: 00052703 lw a4,0(a0) + 2f0: 06e69663 bne a3,a4,35c + 2f4: 00c00e13 li t3,12 + 2f8: 10000537 lui a0,0x10000 + 2fc: 40050513 addi a0,a0,1024 # 10000400 + 300: 08c00593 li a1,140 + 304: 08d00613 li a2,141 + 308: 08e00693 li a3,142 + 30c: 00d52023 sw a3,0(a0) + 310: 00001eb7 lui t4,0x1 + 314: 800e8e93 addi t4,t4,-2048 # 800 + 318: 304e9073 csrw mie,t4 + 31c: 00002eb7 lui t4,0x2 + 320: 808e8e93 addi t4,t4,-2040 # 1808 + 324: 100527af lr.w a5,(a0) + 328: 300e9073 csrw mstatus,t4 + 32c: 00000013 nop + 330: 00000013 nop + 334: 00000013 nop + 338: 00000013 nop + 33c: 00000013 nop + 340: 00000013 nop + 344: 18b5262f sc.w a2,a1,(a0) + 348: 00100713 li a4,1 + 34c: 00e61863 bne a2,a4,35c + 350: 00052703 lw a4,0(a0) + 354: 00e69463 bne a3,a4,35c + 358: 0100006f j 368 -00000288 : - 288: f0100137 lui sp,0xf0100 - 28c: f2010113 addi sp,sp,-224 # f00fff20 - 290: 00012023 sw zero,0(sp) - 294: 00000013 nop - 298: 00000013 nop - 29c: 00000013 nop - 2a0: 00000013 nop - 2a4: 00000013 nop - 2a8: 00000013 nop +0000035c : + 35c: f0100137 lui sp,0xf0100 + 360: f2410113 addi sp,sp,-220 # f00fff24 + 364: 01c12023 sw t3,0(sp) + +00000368 : + 368: f0100137 lui sp,0xf0100 + 36c: f2010113 addi sp,sp,-224 # f00fff20 + 370: 00012023 sw zero,0(sp) + 374: 00000013 nop + 378: 00000013 nop + 37c: 00000013 nop + 380: 00000013 nop + 384: 00000013 nop + 388: 00000013 nop diff --git a/src/test/cpp/custom/atomic/build/atomic.elf b/src/test/cpp/custom/atomic/build/atomic.elf index 2ac8edb0c81dba4bea94e6fb80a3042020f2a480..a67f244ee1cb9db21c9de33f2f7ad9377838574d 100755 GIT binary patch delta 674 zcma)4&ubG=5T3Z%*R3fpFMTUK!X~cUHi^;3El3Ncg&tZ^@y9>Vi);l2iPA*$Aegf( zC3Z>>k<$Ob3YGSlQ_nrLspr%u6&w4^?61^5&pSn)0c} z2|mo10yXLw^(^&SF5&CK)%^BA1rAfO=KWCNUSW~$V#j>zn~lE;)7;S_IoCq+9h@7V zeN)t9M%99#_kB$AU6?aLNYnJubS=qz3)zx2;hw;LIUV)BkGun)s-}p>K5I=kDqoZw z5fBtLi(B?Ilf0kSUqZ7_^^dFv$iDv9Ald6i=iE({hGb5SFUOzUTcGz#ECUq+tMs@j zzeZp$^Ow&MeEiS(Eb-{qh)h5R7O^BYU6o*g#G{h!t?#)d?h#}fQX)P5h76-ASqKm78qeCWFCkF?|jc=oBIZ*R8) zuGVv|vUZ9W_FmKHp!9S|=3jWpt|xcmZ*@uFi6)c&I27&l-@GGub(vKWkf4t(XA@7H o8+>zIIhXOniCei1a4!T!M8j`qy)k3}yLjv}9J)llVtD9!Kk}qbE&u=k diff --git a/src/test/cpp/custom/atomic/build/atomic.hex b/src/test/cpp/custom/atomic/build/atomic.hex index 29f28e2..593eef7 100644 --- a/src/test/cpp/custom/atomic/build/atomic.hex +++ b/src/test/cpp/custom/atomic/build/atomic.hex @@ -1,45 +1,59 @@ -:100000006F00000313000000130000001300000045 +:100000006F00C00413000000130000001300000084 :100010001300000013000000130000001300000094 -:10002000F32E1034938E4E0073901E3473002030E4 -:10003000130E1000370500109305400613065006F6 -:10004000930660062320D5002F26B518130710004D -:100050006316E622032705006392E622130E2000B2 -:10006000370500101305450093057006130680063A -:10007000930690062320D5002F26B51813071000ED -:10008000631EE61E03270500639AE61E130E30006A -:10009000370500101305450093057006130680060A -:1000A000930690062F26B518130710006318E61C58 -:1000B000032705006394E61C130E4000370500106B -:1000C000130585009305A0061306B0069306C00627 -:1000D0002320D500AF2705102F26B5186390D71A17 -:1000E000631E061803270500639AE518130E5000D7 -:1000F00037050010130585009305D0061306E006AA -:100100009306F0062320D5002F26B518631806168F -:10011000032705006394E516130E600037050010F1 -:100120001305C50093050007130610079306200763 -:100130003704001013040401930430071309400727 -:10014000930950072320D50023203401AF27051041 -:10015000AF2A04102F26B5182F2994186390D712B0 -:10016000631E061003270500639AE51063983A1191 -:1001700063160910032A040063924411130E7000E1 -:1001800037050010130545019305800713069007F6 -:100190009306A007930E00012320D500AF2705107A -:1001A0002F26B518639CD70C631A060C032705008D -:1001B0006396E50C938EFEFF13054500938535008D -:1001C0001306360093863600E3980EFC130E80006B -:1001D0003705001013058501930580071306900766 -:1001E0009306A007832705002F26B51813071000D4 -:1001F0006316E608032705006392E708130E9000D4 -:1002000037050010130505109305B0071306C00746 -:100210009306D0072320D500AF27051073000000F8 -:100220002F26B51813071000631AE60403270500EC -:100230006396E604130E90003705001013050520A1 -:1002400037080010130848209305E0071306F0074D -:1002500093060008930810082320D50023201801D6 -:10026000AF2708102F26B518130710006318E600F3 -:10027000032708006394E8006F000001370110F0C5 -:10028000130141F22320C101370110F0130101F2E3 -:1002900023200100130000001300000013000000E1 -:0C02A00013000000130000001300000019 -:0400000300000030C9 +:10002000F32E003093FE0E08638A0E00B72E0000F8 +:10003000938E0E8073900E3073002030F32E1034A8 +:10004000938E4E0073901E3473002030130E1000F8 +:100050003705001093054006130650069306600608 +:100060002320D5002F26B518130710006318E62E9D +:10007000032705006394E62E130E200037050010B9 +:100080001305450093057006130680069306900637 +:100090002320D5002F26B518130710006310E62C77 +:1000A00003270500639CE62A130E30003705001075 +:1000B0001305450093057006130680069306900607 +:1000C0002F26B51813071000631AE628032705002A +:1000D0006396E628130E40003705001013058500CF +:1000E0009305A0061306B0069306C0062320D5008C +:1000F000AF2705102F26B5186392D7266310062662 +:1001000003270500639CE524130E500037050010FB +:10011000130585009305D0061306E0069306F00646 +:100120002320D5002F26B518631A062203270500C1 +:100130006396E522130E6000370500101305C50015 +:1001400093050007130610079306200737040010D5 +:10015000130404019304300713094007930950075F +:100160002320D50023203401AF270510AF2A041027 +:100170002F26B5182F2994186392D71E6310061ED8 +:1001800003270500639CE51C639A3A1D6318091C4C +:10019000032A04006394441D130E700037050010F9 +:1001A0001305450193058007130690079306A007E2 +:1001B000930E00012320D500AF2705102F26B51878 +:1001C000639ED718631C0618032705006398E5187B +:1001D000938EFEFF13054500938535001306360008 +:1001E00093863600E3980EFC130E8000370500104E +:1001F0001305850193058007130690079306A00752 +:10020000832705002F26B518130710006318E6147E +:10021000032705006394E714130E900037050010C0 +:10022000130505109305B0071306C0079306D00702 +:100230002320D500AF270510730000002F26B51826 +:1002400013071000631CE610032705006398E610EF +:10025000130EA00037050010130505203708001005 +:10026000130848209305E0071306F00793060008DB +:10027000930810082320D50023201801AF27081069 +:100280002F26B51813071000631AE60C0327080081 +:100290006396E80C130EB000370500101305053007 +:1002A0009305200813063008930640082320D50044 +:1002B000B71E0000938E0E8073904E30930E800018 +:1002C000AF27051073900E301300000013000000DC +:1002D00013000000130000001300000013000000D2 +:1002E0002F26B51813071000631AE606032705002A +:1002F0006396E606130EC00037050010130505408F +:100300009305C0081306D0089306E0082320D50003 +:10031000B71E0000938E0E8073904E30B72E0000F3 +:10032000938E8E80AF27051073900E30130000005F +:100330001300000013000000130000001300000071 +:10034000130000002F26B518130710006318E600ED +:10035000032705006394E6006F000001370110F0E9 +:10036000130141F22320C101370110F0130101F202 +:100370002320010013000000130000001300000000 +:0C03800013000000130000001300000038 +:040000030000004CAD :00000001FF diff --git a/src/test/cpp/custom/atomic/build/atomic.map b/src/test/cpp/custom/atomic/build/atomic.map index dcb1d9c..5c6ed9f 100644 --- a/src/test/cpp/custom/atomic/build/atomic.map +++ b/src/test/cpp/custom/atomic/build/atomic.map @@ -16,16 +16,16 @@ END GROUP LOAD /opt/riscv/bin/../lib/gcc/riscv64-unknown-elf/7.1.1/libgcc.a 0x0000000000000000 . = 0x0 -.crt_section 0x0000000000000000 0x2ac +.crt_section 0x0000000000000000 0x38c 0x0000000000000000 . = ALIGN (0x4) *crt.o(.text) - .text 0x0000000000000000 0x2ac build/src/crt.o + .text 0x0000000000000000 0x38c build/src/crt.o 0x0000000000000020 trap_entry - 0x0000000000000030 _start + 0x000000000000004c _start OUTPUT(build/atomic.elf elf32-littleriscv) -.data 0x00000000000002ac 0x0 - .data 0x00000000000002ac 0x0 build/src/crt.o +.data 0x000000000000038c 0x0 + .data 0x000000000000038c 0x0 build/src/crt.o -.bss 0x00000000000002ac 0x0 - .bss 0x00000000000002ac 0x0 build/src/crt.o +.bss 0x000000000000038c 0x0 + .bss 0x000000000000038c 0x0 build/src/crt.o diff --git a/src/test/cpp/custom/atomic/build/atomic.v b/src/test/cpp/custom/atomic/build/atomic.v index 95e4ab6..1d8d7a8 100755 --- a/src/test/cpp/custom/atomic/build/atomic.v +++ b/src/test/cpp/custom/atomic/build/atomic.v @@ -1,44 +1,58 @@ @00000000 -6F 00 00 03 13 00 00 00 13 00 00 00 13 00 00 00 +6F 00 C0 04 13 00 00 00 13 00 00 00 13 00 00 00 13 00 00 00 13 00 00 00 13 00 00 00 13 00 00 00 -F3 2E 10 34 93 8E 4E 00 73 90 1E 34 73 00 20 30 -13 0E 10 00 37 05 00 10 93 05 40 06 13 06 50 06 -93 06 60 06 23 20 D5 00 2F 26 B5 18 13 07 10 00 -63 16 E6 22 03 27 05 00 63 92 E6 22 13 0E 20 00 -37 05 00 10 13 05 45 00 93 05 70 06 13 06 80 06 -93 06 90 06 23 20 D5 00 2F 26 B5 18 13 07 10 00 -63 1E E6 1E 03 27 05 00 63 9A E6 1E 13 0E 30 00 -37 05 00 10 13 05 45 00 93 05 70 06 13 06 80 06 -93 06 90 06 2F 26 B5 18 13 07 10 00 63 18 E6 1C -03 27 05 00 63 94 E6 1C 13 0E 40 00 37 05 00 10 -13 05 85 00 93 05 A0 06 13 06 B0 06 93 06 C0 06 -23 20 D5 00 AF 27 05 10 2F 26 B5 18 63 90 D7 1A -63 1E 06 18 03 27 05 00 63 9A E5 18 13 0E 50 00 -37 05 00 10 13 05 85 00 93 05 D0 06 13 06 E0 06 -93 06 F0 06 23 20 D5 00 2F 26 B5 18 63 18 06 16 -03 27 05 00 63 94 E5 16 13 0E 60 00 37 05 00 10 -13 05 C5 00 93 05 00 07 13 06 10 07 93 06 20 07 -37 04 00 10 13 04 04 01 93 04 30 07 13 09 40 07 -93 09 50 07 23 20 D5 00 23 20 34 01 AF 27 05 10 -AF 2A 04 10 2F 26 B5 18 2F 29 94 18 63 90 D7 12 -63 1E 06 10 03 27 05 00 63 9A E5 10 63 98 3A 11 -63 16 09 10 03 2A 04 00 63 92 44 11 13 0E 70 00 -37 05 00 10 13 05 45 01 93 05 80 07 13 06 90 07 -93 06 A0 07 93 0E 00 01 23 20 D5 00 AF 27 05 10 -2F 26 B5 18 63 9C D7 0C 63 1A 06 0C 03 27 05 00 -63 96 E5 0C 93 8E FE FF 13 05 45 00 93 85 35 00 -13 06 36 00 93 86 36 00 E3 98 0E FC 13 0E 80 00 -37 05 00 10 13 05 85 01 93 05 80 07 13 06 90 07 -93 06 A0 07 83 27 05 00 2F 26 B5 18 13 07 10 00 -63 16 E6 08 03 27 05 00 63 92 E7 08 13 0E 90 00 -37 05 00 10 13 05 05 10 93 05 B0 07 13 06 C0 07 -93 06 D0 07 23 20 D5 00 AF 27 05 10 73 00 00 00 -2F 26 B5 18 13 07 10 00 63 1A E6 04 03 27 05 00 -63 96 E6 04 13 0E 90 00 37 05 00 10 13 05 05 20 -37 08 00 10 13 08 48 20 93 05 E0 07 13 06 F0 07 -93 06 00 08 93 08 10 08 23 20 D5 00 23 20 18 01 -AF 27 08 10 2F 26 B5 18 13 07 10 00 63 18 E6 00 -03 27 08 00 63 94 E8 00 6F 00 00 01 37 01 10 F0 +F3 2E 00 30 93 FE 0E 08 63 8A 0E 00 B7 2E 00 00 +93 8E 0E 80 73 90 0E 30 73 00 20 30 F3 2E 10 34 +93 8E 4E 00 73 90 1E 34 73 00 20 30 13 0E 10 00 +37 05 00 10 93 05 40 06 13 06 50 06 93 06 60 06 +23 20 D5 00 2F 26 B5 18 13 07 10 00 63 18 E6 2E +03 27 05 00 63 94 E6 2E 13 0E 20 00 37 05 00 10 +13 05 45 00 93 05 70 06 13 06 80 06 93 06 90 06 +23 20 D5 00 2F 26 B5 18 13 07 10 00 63 10 E6 2C +03 27 05 00 63 9C E6 2A 13 0E 30 00 37 05 00 10 +13 05 45 00 93 05 70 06 13 06 80 06 93 06 90 06 +2F 26 B5 18 13 07 10 00 63 1A E6 28 03 27 05 00 +63 96 E6 28 13 0E 40 00 37 05 00 10 13 05 85 00 +93 05 A0 06 13 06 B0 06 93 06 C0 06 23 20 D5 00 +AF 27 05 10 2F 26 B5 18 63 92 D7 26 63 10 06 26 +03 27 05 00 63 9C E5 24 13 0E 50 00 37 05 00 10 +13 05 85 00 93 05 D0 06 13 06 E0 06 93 06 F0 06 +23 20 D5 00 2F 26 B5 18 63 1A 06 22 03 27 05 00 +63 96 E5 22 13 0E 60 00 37 05 00 10 13 05 C5 00 +93 05 00 07 13 06 10 07 93 06 20 07 37 04 00 10 +13 04 04 01 93 04 30 07 13 09 40 07 93 09 50 07 +23 20 D5 00 23 20 34 01 AF 27 05 10 AF 2A 04 10 +2F 26 B5 18 2F 29 94 18 63 92 D7 1E 63 10 06 1E +03 27 05 00 63 9C E5 1C 63 9A 3A 1D 63 18 09 1C +03 2A 04 00 63 94 44 1D 13 0E 70 00 37 05 00 10 +13 05 45 01 93 05 80 07 13 06 90 07 93 06 A0 07 +93 0E 00 01 23 20 D5 00 AF 27 05 10 2F 26 B5 18 +63 9E D7 18 63 1C 06 18 03 27 05 00 63 98 E5 18 +93 8E FE FF 13 05 45 00 93 85 35 00 13 06 36 00 +93 86 36 00 E3 98 0E FC 13 0E 80 00 37 05 00 10 +13 05 85 01 93 05 80 07 13 06 90 07 93 06 A0 07 +83 27 05 00 2F 26 B5 18 13 07 10 00 63 18 E6 14 +03 27 05 00 63 94 E7 14 13 0E 90 00 37 05 00 10 +13 05 05 10 93 05 B0 07 13 06 C0 07 93 06 D0 07 +23 20 D5 00 AF 27 05 10 73 00 00 00 2F 26 B5 18 +13 07 10 00 63 1C E6 10 03 27 05 00 63 98 E6 10 +13 0E A0 00 37 05 00 10 13 05 05 20 37 08 00 10 +13 08 48 20 93 05 E0 07 13 06 F0 07 93 06 00 08 +93 08 10 08 23 20 D5 00 23 20 18 01 AF 27 08 10 +2F 26 B5 18 13 07 10 00 63 1A E6 0C 03 27 08 00 +63 96 E8 0C 13 0E B0 00 37 05 00 10 13 05 05 30 +93 05 20 08 13 06 30 08 93 06 40 08 23 20 D5 00 +B7 1E 00 00 93 8E 0E 80 73 90 4E 30 93 0E 80 00 +AF 27 05 10 73 90 0E 30 13 00 00 00 13 00 00 00 +13 00 00 00 13 00 00 00 13 00 00 00 13 00 00 00 +2F 26 B5 18 13 07 10 00 63 1A E6 06 03 27 05 00 +63 96 E6 06 13 0E C0 00 37 05 00 10 13 05 05 40 +93 05 C0 08 13 06 D0 08 93 06 E0 08 23 20 D5 00 +B7 1E 00 00 93 8E 0E 80 73 90 4E 30 B7 2E 00 00 +93 8E 8E 80 AF 27 05 10 73 90 0E 30 13 00 00 00 +13 00 00 00 13 00 00 00 13 00 00 00 13 00 00 00 +13 00 00 00 2F 26 B5 18 13 07 10 00 63 18 E6 00 +03 27 05 00 63 94 E6 00 6F 00 00 01 37 01 10 F0 13 01 41 F2 23 20 C1 01 37 01 10 F0 13 01 01 F2 23 20 01 00 13 00 00 00 13 00 00 00 13 00 00 00 13 00 00 00 13 00 00 00 13 00 00 00 diff --git a/src/test/cpp/custom/atomic/src/crt.S b/src/test/cpp/custom/atomic/src/crt.S index 2561941..1462dd2 100644 --- a/src/test/cpp/custom/atomic/src/crt.S +++ b/src/test/cpp/custom/atomic/src/crt.S @@ -12,6 +12,14 @@ .global trap_entry trap_entry: + csrr x29, mstatus + and x29, x29, 0x080 + beqz x29, notExternalInterrupt + li x29, 0x1800 //000 disable interrupts + csrw mstatus,x29 + mret + +notExternalInterrupt: csrr x29, mepc addi x29, x29, 4 csrw mepc, x29 @@ -167,7 +175,7 @@ test7: //Test 10 SC should fail if the address doesn't match - li x28, 9 + li x28, 10 li a0, 0x10000200 li a6, 0x10000204 li a1, 126 @@ -184,6 +192,58 @@ test7: bne a7, a4, fail + +//Test 11 SC should fail after a external interrupt context switching + li x28, 11 + li a0, 0x10000300 + li a1, 130 + li a2, 131 + li a3, 132 + sw a3, 0(a0) + li x29, 0x800 //800 external interrupts + csrw mie,x29 + li x29, 0x008 //008 enable interrupts + lr.w a5, (a0) + csrw mstatus,x29 //Enable external interrupt (will jump instantly due to testbench setup) + nop + nop + nop + nop + nop + nop + sc.w a2, a1, (a0) + li a4, 1 + bne a2, a4, fail + lw a4, 0(a0) + bne a3, a4, fail + + +//Test 12 SC should fail after a external interrupt context switching (callback on lr) + li x28, 12 + li a0, 0x10000400 + li a1, 140 + li a2, 141 + li a3, 142 + sw a3, 0(a0) + li x29, 0x800 //800 external interrupts + csrw mie,x29 + li x29, 0x1808 //008 enable interrupts + lr.w a5, (a0) + csrw mstatus,x29 //Enable external interrupt (will jump instantly due to testbench setup) + nop + nop + nop + nop + nop + nop + sc.w a2, a1, (a0) + li a4, 1 + bne a2, a4, fail + lw a4, 0(a0) + bne a3, a4, fail + + + j pass diff --git a/src/test/cpp/regression/atomic.gtkw b/src/test/cpp/regression/atomic.gtkw index 7b10699..26e6575 100644 --- a/src/test/cpp/regression/atomic.gtkw +++ b/src/test/cpp/regression/atomic.gtkw @@ -1,21 +1,21 @@ [*] [*] GTKWave Analyzer v3.3.58 (w)1999-2014 BSI -[*] Thu Jan 4 14:37:30 2018 +[*] Thu Jan 4 16:18:18 2018 [*] [dumpfile] "/home/spinalvm/hdl/VexRiscv/src/test/cpp/regression/atomic.vcd" -[dumpfile_mtime] "Thu Jan 4 14:36:32 2018" -[dumpfile_size] 1406668 +[dumpfile_mtime] "Thu Jan 4 16:18:11 2018" +[dumpfile_size] 19545269 [savefile] "/home/spinalvm/hdl/VexRiscv/src/test/cpp/regression/atomic.gtkw" -[timestart] 515 +[timestart] 1478 [size] 1784 950 -[pos] -383 -155 -*-7.000000 727 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 +[pos] -1 -1 +*-7.000000 1726 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 [treeopen] TOP. [treeopen] TOP.VexRiscv. [sst_width] 289 -[signals_width] 486 +[signals_width] 559 [sst_expanded] 1 -[sst_vpaned_height] 271 +[sst_vpaned_height] 191 @22 TOP.VexRiscv.writeBack_RegFilePlugin_regFileWrite_payload_address[4:0] TOP.VexRiscv.writeBack_RegFilePlugin_regFileWrite_payload_data[31:0] @@ -32,5 +32,21 @@ TOP.VexRiscv.dataCache_1.stageB_atomic_entries_1_address[31:0] @28 TOP.VexRiscv.dataCache_1.stageB_atomic_entries_1_size[1:0] TOP.VexRiscv.dataCache_1.stageB_atomic_entries_1_valid +@29 +[color] 1 +TOP.VexRiscv.writeBack_arbitration_isFiring +[color] 1 +TOP.VexRiscv.writeBack_arbitration_isValid +@23 +[color] 1 +TOP.VexRiscv.writeBack_PC[31:0] +@28 +TOP.VexRiscv.CsrPlugin_mstatus_MIE +TOP.VexRiscv.CsrPlugin_mstatus_MPIE +TOP.VexRiscv.CsrPlugin_mstatus_MPP[1:0] +@24 +TOP.VexRiscv.RegFilePlugin_regFile(28)[31:0] +@22 +TOP.VexRiscv.CsrPlugin_mepc[31:0] [pattern_trace] 1 [pattern_trace] 0 diff --git a/src/test/cpp/regression/main.cpp b/src/test/cpp/regression/main.cpp index 1f01ee6..879cb33 100644 --- a/src/test/cpp/regression/main.cpp +++ b/src/test/cpp/regression/main.cpp @@ -1727,7 +1727,7 @@ int main(int argc, char **argv, char **env) { #ifdef ATOMIC - redo(REDO,Workspace("atomic").loadHex("../custom/atomic/build/atomic.hex")->bootAt(0x00000000u)->run(50e3);); + redo(REDO,Workspace("atomic").loadHex("../custom/atomic/build/atomic.hex")->bootAt(0x00000000u)->run(10e3);); #endif #ifdef DHRYSTONE