diff --git a/Makefile b/Makefile
index 97d4f63ee41e9821b690a07ca2f22f9e1f40ea3c..d1a716428ba877d3d18ad89e1c0c2d4b1d693ffa 100644
--- a/Makefile
+++ b/Makefile
@@ -488,7 +488,7 @@ $(addsuffix -verilator,$(riscv-fp-tests)): verilate
 $(addsuffix -verilator,$(riscv-benchmarks)): verilate
 	$(ver-library)/Variane_testharness $(riscv-benchmarks-dir)/$(subst -verilator,,$@)
 
-run-asm-tests-verilator: $(addsuffix -verilator, $(riscv-asm-tests)) $(addsuffix -verilator, $(riscv-amo-tests)) $(addsuffix -verilator, $(riscv-fp-tests)) $(addsuffix -verilator, $(riscv-fp-tests))
+run-asm-tests-verilator: $(addsuffix -verilator, $(riscv-asm-tests)) $(addsuffix -verilator, $(riscv-amo-tests)) $(addsuffix -verilator, $(run-mul-verilator)) $(addsuffix -verilator, $(riscv-fp-tests))
 
 # split into smaller travis jobs (otherwise they will time out)
 riscv-asm-rv64ui-v := $(filter rv64ui-v-%, $(riscv-asm-tests))
diff --git a/bootrom/bootrom.S b/bootrom/bootrom.S
index ed6b6e977f6336a5a2932abd16129a51ea969fed..03127b094f65e52c71d873e3341001f64cde61b6 100644
--- a/bootrom/bootrom.S
+++ b/bootrom/bootrom.S
@@ -1,9 +1,8 @@
-#define DRAM_BASE 0x80000000
-
 .section .text.start, "ax", @progbits
 .globl _start
 _start:
-  li s0, DRAM_BASE
+  li s0, 1
+  slli s0, s0, 31
   csrr a0, mhartid
   la a1, _dtb
   jr s0
diff --git a/bootrom/bootrom.h b/bootrom/bootrom.h
index e3228c2560637c21a8f0e6da667e66aee80c6b75..3ed0758669bc18867de500915532736d9ba3ca37 100644
--- a/bootrom/bootrom.h
+++ b/bootrom/bootrom.h
@@ -1,13 +1,12 @@
 // Auto-generated code
 
-const int reset_vec_size = 374;
+const int reset_vec_size = 402;
 
 uint32_t reset_vec[reset_vec_size] = {
-    0x0010041b,
-    0x01f41413,
+    0x047e4405,
     0xf1402573,
     0x00000597,
-    0x07458593,
+    0x07858593,
     0x00008402,
     0x00000000,
     0x00000000,
@@ -19,6 +18,7 @@ uint32_t reset_vec[reset_vec_size] = {
     0x00000000,
     0x00000000,
     0x00000000,
+    0x00000000,
     0xf1402573,
     0x00000597,
     0x03c58593,
@@ -36,15 +36,15 @@ uint32_t reset_vec[reset_vec_size] = {
     0x00000000,
     0x00000000,
     0xedfe0dd0,
-    0x58050000,
+    0xc2050000,
     0x38000000,
-    0x4c040000,
+    0xbc040000,
     0x28000000,
     0x11000000,
     0x10000000,
     0x00000000,
-    0x0c010000,
-    0x14040000,
+    0x06010000,
+    0x84040000,
     0x00000000,
     0x00000000,
     0x00000000,
@@ -157,10 +157,6 @@ uint32_t reset_vec[reset_vec_size] = {
     0x04000000,
     0xa9000000,
     0x01000000,
-    0x03000000,
-    0x04000000,
-    0xaf000000,
-    0x01000000,
     0x02000000,
     0x02000000,
     0x02000000,
@@ -205,7 +201,7 @@ uint32_t reset_vec[reset_vec_size] = {
     0x00007375,
     0x03000000,
     0x00000000,
-    0xb7000000,
+    0xb1000000,
     0x01000000,
     0x6e696c63,
     0x30324074,
@@ -220,7 +216,7 @@ uint32_t reset_vec[reset_vec_size] = {
     0x00000000,
     0x03000000,
     0x10000000,
-    0xbe000000,
+    0xb8000000,
     0x01000000,
     0x03000000,
     0x01000000,
@@ -234,7 +230,7 @@ uint32_t reset_vec[reset_vec_size] = {
     0x00000c00,
     0x03000000,
     0x08000000,
-    0xd2000000,
+    0xcc000000,
     0x746e6f63,
     0x006c6f72,
     0x02000000,
@@ -253,7 +249,7 @@ uint32_t reset_vec[reset_vec_size] = {
     0x00333130,
     0x03000000,
     0x08000000,
-    0xbe000000,
+    0xb8000000,
     0x01000000,
     0xffff0000,
     0x03000000,
@@ -265,7 +261,7 @@ uint32_t reset_vec[reset_vec_size] = {
     0x00100000,
     0x03000000,
     0x08000000,
-    0xd2000000,
+    0xcc000000,
     0x746e6f63,
     0x006c6f72,
     0x02000000,
@@ -292,21 +288,53 @@ uint32_t reset_vec[reset_vec_size] = {
     0x80f0fa02,
     0x03000000,
     0x04000000,
-    0xdc000000,
+    0xd6000000,
     0x00c20100,
     0x03000000,
     0x04000000,
-    0xea000000,
+    0xe4000000,
     0x01000000,
     0x03000000,
     0x04000000,
-    0xf5000000,
+    0xef000000,
     0x02000000,
     0x03000000,
     0x04000000,
-    0xff000000,
+    0xf9000000,
     0x04000000,
     0x02000000,
+    0x01000000,
+    0x656d6974,
+    0x38314072,
+    0x30303030,
+    0x00003030,
+    0x03000000,
+    0x0f000000,
+    0x1b000000,
+    0x706c7570,
+    0x6270612c,
+    0x6d69745f,
+    0x00007265,
+    0x03000000,
+    0x10000000,
+    0xe4000000,
+    0x04000000,
+    0x05000000,
+    0x06000000,
+    0x07000000,
+    0x03000000,
+    0x10000000,
+    0x5b000000,
+    0x00000000,
+    0x00000018,
+    0x00000000,
+    0x00100000,
+    0x03000000,
+    0x08000000,
+    0xcc000000,
+    0x746e6f63,
+    0x006c6f72,
+    0x02000000,
     0x02000000,
     0x02000000,
     0x09000000,
@@ -352,29 +380,29 @@ uint32_t reset_vec[reset_vec_size] = {
     0x6f632d74,
     0x6f72746e,
     0x72656c6c,
-    0x6e696c00,
-    0x702c7875,
-    0x646e6168,
-    0x7200656c,
-    0x65676e61,
-    0x6e690073,
-    0x72726574,
-    0x73747075,
-    0x7478652d,
-    0x65646e65,
-    0x65720064,
-    0x616e2d67,
-    0x0073656d,
-    0x72727563,
-    0x2d746e65,
-    0x65657073,
-    0x6e690064,
-    0x72726574,
-    0x73747075,
+    0x61687000,
+    0x656c646e,
+    0x6e617200,
+    0x00736567,
+    0x65746e69,
+    0x70757272,
+    0x652d7374,
+    0x6e657478,
+    0x00646564,
+    0x2d676572,
+    0x656d616e,
+    0x75630073,
+    0x6e657272,
+    0x70732d74,
+    0x00646565,
+    0x65746e69,
+    0x70757272,
+    0x72007374,
+    0x732d6765,
+    0x74666968,
     0x67657200,
-    0x6968732d,
-    0x72007466,
-    0x692d6765,
-    0x69772d6f,
-    0x00687464
+    0x2d6f692d,
+    0x74646977,
+    0x00000068,
+    0x00000000
 };
diff --git a/bootrom/bootrom.img b/bootrom/bootrom.img
index 3883804890b2e1ee8d6fc3934e364d8611a937d1..d64b98d339b663767b8648111918faa70ef47ede 100644
Binary files a/bootrom/bootrom.img and b/bootrom/bootrom.img differ
diff --git a/bootrom/bootrom.sv b/bootrom/bootrom.sv
index e5efa9f4affa4167783dc732197a69e83efa3d63..81b2dc33f2e63a710955ab3ece978b2ac0e0a2ec 100644
--- a/bootrom/bootrom.sv
+++ b/bootrom/bootrom.sv
@@ -20,22 +20,22 @@ module bootrom (
    input  logic [63:0]  addr_i,
    output logic [63:0]  rdata_o
 );
-    localparam int RomSize = 187;
+    localparam int RomSize = 201;
 
     const logic [RomSize-1:0][63:0] mem = {
-        64'h00687464_69772d6f,
-        64'h692d6765_72007466,
-        64'h6968732d_67657200,
-        64'h73747075_72726574,
-        64'h6e690064_65657073,
-        64'h2d746e65_72727563,
-        64'h0073656d_616e2d67,
-        64'h65720064_65646e65,
-        64'h7478652d_73747075,
-        64'h72726574_6e690073,
-        64'h65676e61_7200656c,
-        64'h646e6168_702c7875,
-        64'h6e696c00_72656c6c,
+        64'h00000000_00000068,
+        64'h74646977_2d6f692d,
+        64'h67657200_74666968,
+        64'h732d6765_72007374,
+        64'h70757272_65746e69,
+        64'h00646565_70732d74,
+        64'h6e657272_75630073,
+        64'h656d616e_2d676572,
+        64'h00646564_6e657478,
+        64'h652d7374_70757272,
+        64'h65746e69_00736567,
+        64'h6e617200_656c646e,
+        64'h61687000_72656c6c,
         64'h6f72746e_6f632d74,
         64'h70757272_65746e69,
         64'h00736c6c_65632d74,
@@ -58,14 +58,30 @@ module bootrom (
         64'h6c65632d_73736572,
         64'h64646123_09000000,
         64'h02000000_02000000,
+        64'h02000000_006c6f72,
+        64'h746e6f63_cc000000,
+        64'h08000000_03000000,
+        64'h00100000_00000000,
+        64'h00000018_00000000,
+        64'h5b000000_10000000,
+        64'h03000000_07000000,
+        64'h06000000_05000000,
+        64'h04000000_e4000000,
+        64'h10000000_03000000,
+        64'h00007265_6d69745f,
+        64'h6270612c_706c7570,
+        64'h1b000000_0f000000,
+        64'h03000000_00003030,
+        64'h30303030_38314072,
+        64'h656d6974_01000000,
         64'h02000000_04000000,
-        64'hff000000_04000000,
+        64'hf9000000_04000000,
         64'h03000000_02000000,
-        64'hf5000000_04000000,
+        64'hef000000_04000000,
         64'h03000000_01000000,
-        64'hea000000_04000000,
+        64'he4000000_04000000,
         64'h03000000_00c20100,
-        64'hdc000000_04000000,
+        64'hd6000000_04000000,
         64'h03000000_80f0fa02,
         64'h3f000000_04000000,
         64'h03000000_00100000,
@@ -78,13 +94,13 @@ module bootrom (
         64'h30303030_30303140,
         64'h74726175_01000000,
         64'h02000000_006c6f72,
-        64'h746e6f63_d2000000,
+        64'h746e6f63_cc000000,
         64'h08000000_03000000,
         64'h00100000_00000000,
         64'h00000000_00000000,
         64'h5b000000_10000000,
         64'h03000000_ffff0000,
-        64'h01000000_be000000,
+        64'h01000000_b8000000,
         64'h08000000_03000000,
         64'h00333130_2d677562,
         64'h65642c76_63736972,
@@ -94,21 +110,21 @@ module bootrom (
         64'h6f632d67_75626564,
         64'h01000000_02000000,
         64'h006c6f72_746e6f63,
-        64'hd2000000_08000000,
+        64'hcc000000_08000000,
         64'h03000000_00000c00,
         64'h00000000_00000002,
         64'h00000000_5b000000,
         64'h10000000_03000000,
         64'h07000000_01000000,
         64'h03000000_01000000,
-        64'hbe000000_10000000,
+        64'hb8000000_10000000,
         64'h03000000_00000000,
         64'h30746e69_6c632c76,
         64'h63736972_1b000000,
         64'h0d000000_03000000,
         64'h00000030_30303030,
         64'h30324074_6e696c63,
-        64'h01000000_b7000000,
+        64'h01000000_b1000000,
         64'h00000000_03000000,
         64'h00007375_622d656c,
         64'h706d6973_00636f73,
@@ -131,8 +147,6 @@ module bootrom (
         64'h38407972_6f6d656d,
         64'h01000000_02000000,
         64'h02000000_02000000,
-        64'h01000000_af000000,
-        64'h04000000_03000000,
         64'h01000000_a9000000,
         64'h04000000_03000000,
         64'h00006374_6e692d75,
@@ -189,11 +203,11 @@ module bootrom (
         64'h00000000_01000000,
         64'h00000000_00000000,
         64'h00000000_00000000,
-        64'h14040000_0c010000,
+        64'h84040000_06010000,
         64'h00000000_10000000,
         64'h11000000_28000000,
-        64'h4c040000_38000000,
-        64'h58050000_edfe0dd0,
+        64'hbc040000_38000000,
+        64'hc2050000_edfe0dd0,
         64'h00000000_00000000,
         64'h00000000_00000000,
         64'h00000000_00000000,
@@ -207,9 +221,9 @@ module bootrom (
         64'h00000000_00000000,
         64'h00000000_00000000,
         64'h00000000_00000000,
-        64'h00008402_07458593,
-        64'h00000597_f1402573,
-        64'h01f41413_0010041b
+        64'h00000000_00008402,
+        64'h07858593_00000597,
+        64'hf1402573_047e4405
     };
 
     logic [$clog2(RomSize)-1:0] addr_q;
diff --git a/ci/riscv-asm-tests.list b/ci/riscv-asm-tests.list
index 7cf0e1136aa37ea4389e62448e1b275a31e24ea8..4465352052f46dd126bbda10994aed55a4addbd7 100644
--- a/ci/riscv-asm-tests.list
+++ b/ci/riscv-asm-tests.list
@@ -63,21 +63,49 @@ rv64ui-v-addi
 rv64ui-v-addiw
 rv64ui-v-addw
 rv64ui-v-and
+rv64ui-v-andi
 rv64ui-v-auipc
 rv64ui-v-beq
 rv64ui-v-bge
 rv64ui-v-bgeu
-rv64ui-v-andi
 rv64ui-v-blt
 rv64ui-v-bltu
 rv64ui-v-bne
-rv64ui-v-simple
+rv64ui-v-fence_i
 rv64ui-v-jal
 rv64ui-v-jalr
+rv64ui-v-lb
+rv64ui-v-lbu
+rv64ui-v-ld
+rv64ui-v-lh
+rv64ui-v-lhu
+rv64ui-v-lui
+rv64ui-v-lw
+rv64ui-v-lwu
 rv64ui-v-or
 rv64ui-v-ori
-rv64ui-v-sub
-rv64ui-v-subw
+rv64ui-v-sb
+rv64ui-v-sd
+rv64ui-v-sh
+rv64ui-v-simple
 rv64ui-v-sll
 rv64ui-v-slli
-rv64ui-v-lb
+rv64ui-v-slliw
+rv64ui-v-sllw
+rv64ui-v-slt
+rv64ui-v-slti
+rv64ui-v-sltiu
+rv64ui-v-sltu
+rv64ui-v-sra
+rv64ui-v-srai
+rv64ui-v-sraiw
+rv64ui-v-sraw
+rv64ui-v-srl
+rv64ui-v-srli
+rv64ui-v-srliw
+rv64ui-v-srlw
+rv64ui-v-sub
+rv64ui-v-subw
+rv64ui-v-sw
+rv64ui-v-xor
+rv64ui-v-xori
diff --git a/ci/riscv-mul-tests.list b/ci/riscv-mul-tests.list
index b7493ee3106d7f75e80b0972a3616b319b9b24d4..695e732247780f132c30b4e33f3d839b10d2bd28 100644
--- a/ci/riscv-mul-tests.list
+++ b/ci/riscv-mul-tests.list
@@ -1,26 +1,26 @@
+rv64um-p-div
+rv64um-p-divu
+rv64um-p-divuw
+rv64um-p-divw
 rv64um-p-mul
 rv64um-p-mulh
 rv64um-p-mulhsu
 rv64um-p-mulhu
-rv64um-p-div
-rv64um-p-divu
+rv64um-p-mulw
 rv64um-p-rem
 rv64um-p-remu
-rv64um-p-mulw
-rv64um-p-divw
-rv64um-p-divuw
-rv64um-p-remw
 rv64um-p-remuw
+rv64um-p-remw
+rv64um-v-div
+rv64um-v-divu
+rv64um-v-divuw
+rv64um-v-divw
 rv64um-v-mul
 rv64um-v-mulh
 rv64um-v-mulhsu
 rv64um-v-mulhu
-rv64um-v-div
-rv64um-v-divu
+rv64um-v-mulw
 rv64um-v-rem
 rv64um-v-remu
-rv64um-v-mulw
-rv64um-v-divw
-rv64um-v-divuw
-rv64um-v-remw
 rv64um-v-remuw
+rv64um-v-remw
diff --git a/tb/ariane_tb.cpp b/tb/ariane_tb.cpp
index 33ce024bccfe765bba6c18dbf4461dcc756582ab..dc62baf6b513ed510756ac29185ba4b6330666e1 100644
--- a/tb/ariane_tb.cpp
+++ b/tb/ariane_tb.cpp
@@ -32,7 +32,10 @@
 #include <unistd.h>
 
 #include <fesvr/dtm.h>
+#include <fesvr/htif_hexwriter.h>
+#include <fesvr/elfloader.h>
 #include "remote_bitbang.h"
+
 // This software is heavily based on Rocket Chip
 // Checkout this awesome project:
 // https://github.com/freechipsproject/rocket-chip/
@@ -102,6 +105,19 @@ EMULATOR DEBUG OPTIONS (only supported in debug build -- try `make debug`)\n",
          );
 }
 
+// In case we use the DTM we do not want to use the JTAG
+// to preload the data but only use the DTM to host fesvr functionality.
+class preload_aware_dtm_t : public dtm_t {
+  public:
+    preload_aware_dtm_t(int argc, char **argv) : dtm_t(argc, argv) {}
+    bool is_address_preloaded(addr_t taddr, size_t len) override { return true; }
+    // We do not want to reset the hart here as the reset function in `dtm_t` seems to disregard
+    // the privilege level and in general does not perform propper reset (despite the name).
+    // As all our binaries in preloading will always start at the base of DRAM this should not
+    // be such a big problem.
+    void reset() {}
+};
+
 int main(int argc, char **argv) {
   std::clock_t c_start = std::clock();
   auto t_start = std::chrono::high_resolution_clock::now();
@@ -263,12 +279,18 @@ done_processing:
 
 #ifndef DROMAJO
   jtag = new remote_bitbang_t(rbb_port);
-  dtm = new dtm_t(htif_argc, htif_argv);
+  dtm = new preload_aware_dtm_t(htif_argc, htif_argv);
   signal(SIGTERM, handle_sigterm);
 #endif
 
   std::unique_ptr<Variane_testharness> top(new Variane_testharness);
 
+  // Use an hitf hexwriter to read the binary data.
+  htif_hexwriter_t htif(0x0, 1, -1);
+  memif_t memif(&htif);
+  reg_t entry;
+  load_elf(htif_argv[1], &memif, &entry);
+
 #if VM_TRACE
   Verilated::traceEverOn(true); // Verilator must compute traced signals
   std::unique_ptr<VerilatedVcdFILE> vcdfd(new VerilatedVcdFILE(vcdfile));
@@ -296,6 +318,10 @@ done_processing:
   }
   top->rst_ni = 1;
 
+  // Preload memory.
+  size_t mem_size = 0x100000;
+  memif.read(0x80000000, mem_size, (void *) top->ariane_testharness__DOT__i_sram__DOT__genblk1__BRA__0__KET____DOT__genblk2__DOT__i_ram__DOT__Mem_DP);
+
 #ifndef DROMAJO
   while (!dtm->done() && !jtag->done()) {
 #else