Add Verilog MMIO GCD peripheral example
This commit is contained in:
42
tests/gcd.c
Normal file
42
tests/gcd.c
Normal file
@@ -0,0 +1,42 @@
|
||||
#include "mmio.h"
|
||||
|
||||
#define GCD_STATUS 0x2000
|
||||
#define GCD_X 0x2004
|
||||
#define GCD_Y 0x2008
|
||||
#define GCD_GCD 0x200C
|
||||
|
||||
unsigned int gcd_ref(unsigned int x, unsigned int y) {
|
||||
while (y != 0) {
|
||||
if (x > y)
|
||||
x = x - y;
|
||||
else
|
||||
y = y - x;
|
||||
}
|
||||
return x;
|
||||
}
|
||||
|
||||
// DOC include start: GCD test
|
||||
int main(void)
|
||||
{
|
||||
uint32_t result, ref, x = 20, y = 15;
|
||||
|
||||
// wait for peripheral to be ready
|
||||
while ((reg_read8(GCD_STATUS) & 0x2) == 0) ;
|
||||
|
||||
reg_write32(GCD_X, x);
|
||||
reg_write32(GCD_Y, y);
|
||||
|
||||
|
||||
// wait for peripheral to complete
|
||||
while ((reg_read8(GCD_STATUS) & 0x1) == 0) ;
|
||||
|
||||
result = reg_read32(GCD_GCD);
|
||||
ref = gcd_ref(x, y);
|
||||
|
||||
if (result != ref) {
|
||||
printf("Hardware result %d does not match reference value %d\n", result, ref);
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
// DOC include end: GCD test
|
||||
Reference in New Issue
Block a user