diff --git a/api/test/loopback.cpp b/api/test/loopback.cpp
index bff99b7938704a56b2e5f77cf7b92e82d9095925..a1f9fce7c99a78478731e175c0d66e6c41a91542 100644
--- a/api/test/loopback.cpp
+++ b/api/test/loopback.cpp
@@ -78,6 +78,18 @@ Record::Record(width_t width_) {
   
   width_t addrw = width_ >> 4;
   width_t dataw = width_ & EB_DATAX;
+  
+  if ((seed & 31) == 0) {
+    /* Perform sub-word access */
+    if ((seed &  32) != 0) dataw /= 2;
+    if ((seed &  64) != 0) dataw /= 2;
+    if ((seed & 128) != 0) dataw /= 2;
+    if (dataw == 0) dataw = 1;
+    seed >>= 8;
+  } else {
+    seed >>= 5;
+  }
+  
   width = (addrw<<4) | dataw;
   
   address = rand();
@@ -240,11 +252,13 @@ void TestCycle::launch(Device device, int length, int* success_) {
   for (int op = 0; op < length; ++op) {
     Record r(device.width());
     
+    format_t format = (r.width & EB_DATAX) | EB_BIG_ENDIAN;
+    
     switch (r.type) {
-    case READ_BUS:  cycle.read        (r.address, r.width, 0);      break;
-    case READ_CFG:  cycle.read_config (r.address, r.width, 0);      break;
-    case WRITE_BUS: cycle.write       (r.address, r.width, r.data); break;
-    case WRITE_CFG: cycle.write_config(r.address, r.width, r.data); break;
+    case READ_BUS:  cycle.read        (r.address, format, 0);      break;
+    case READ_CFG:  cycle.read_config (r.address, format, 0);      break;
+    case WRITE_BUS: cycle.write       (r.address, format, r.data); break;
+    case WRITE_CFG: cycle.write_config(r.address, format, r.data); break;
     }
     records.push_back(r);