assign outstall = (waiting && !inbubble && !flush) || stall;
 
        reg delayedflush = 0;
-       always @(posedge clk)
-               if (flush && outstall /* halp! I can't do it now, maybe later? */)
+       always @(posedge clk/* or negedge Nrst*/)
+               if (!Nrst)
+                       delayedflush <= 0;
+               else if (flush && outstall /* halp! I can't do it now, maybe later? */)
                        delayedflush <= 1;
                else if (!outstall /* anything has been handled this time around */)
                        delayedflush <= 0;
 
        /* Actually do the issue. */
-       always @(posedge clk)
+       always @(posedge clk or negedge Nrst)
        begin
                if (waiting)
                        $display("ISSUE: Stalling instruction %08x because %d/%d", insn, waiting_cpsr, waiting_regs);
 
-               if (!stall)
+               if (!Nrst) begin
+                       cpsr_inflight[0] <= 0;
+                       cpsr_inflight[1] <= 0;
+                       regs_inflight[0] <= 0;
+                       regs_inflight[1] <= 0;
+                       outbubble <= 1;
+               end else if (!stall)
                begin
                        cpsr_inflight[0] <= cpsr_inflight[1];   /* I'm not sure how well selects work with arrays, and that seems like a dumb thing to get anusulated by. */
                        cpsr_inflight[1] <= (waiting || inbubble || !condition_met) ? 0 : def_cpsr;
 
 module RegFile(
        input clk,
+       input Nrst,
        input [3:0] read_0,
        output wire [31:0] rdata_0,
        input [3:0] read_1,
        );
        
        reg [31:0] regfile [0:15];
+       integer i;
        
        initial begin
-               regfile[4'h0] = 32'h00000005;
-               regfile[4'h1] = 32'h00000050;
-               regfile[4'h2] = 32'h00000500;
-               regfile[4'h3] = 32'h00005000;
-               regfile[4'h4] = 32'h00050000;
-               regfile[4'h5] = 32'h00500000;
-               regfile[4'h6] = 32'h05000000;
-               regfile[4'h7] = 32'h50000000;
-               regfile[4'h8] = 32'hA0000000;
-               regfile[4'h9] = 32'h0A000000;
-               regfile[4'hA] = 32'h00A00000;
-               regfile[4'hB] = 32'h000A0000;
-               regfile[4'hC] = 32'h0000A000;
-               regfile[4'hD] = 32'h00000A00;
-               regfile[4'hE] = 32'h000000A0;
-               regfile[4'hF] = 32'h00000000;   /* Start off claiming we are in user mode. */
+               for (i = 0; i < 16; i = i + 1)
+                       regfile[i] = 0;
        end
        
        assign rdata_0 = ((read_0 == write_reg) && write) ? write_data : regfile[read_0];
        assign rdata_3 = ((read_3 == write_reg) && write) ? write_data : regfile[read_3];
        assign spsr = regfile[4'hF];
        
-       always @(posedge clk)
-               if (write)
+       always @(posedge clk or negedge Nrst)
+               if (!Nrst) begin
+                       for (i = 0; i < 16; i = i + 1)
+                               regfile[i] <= 0;
+               end else if (write)
                        regfile[write_reg] <= write_data;
 endmodule
 
 `define BUS_ICACHE 1
 `define BUS_DCACHE 0
 
-module System(input clk
+module System(input clk, input rst
 `ifdef verilator
 `else
        , output wire [8:0] sys_odata,
 
        Fetch fetch(
                .clk(clk),
-               .Nrst(1'b1 /* XXX */),
+               .Nrst(~rst),
                .rd_addr(icache_rd_addr), .rd_req(icache_rd_req),
                .rd_wait(icache_rd_wait), .rd_data(icache_rd_data),
                .stall(stall_cause_issue), .jmp(jmp), .jmppc(jmppc),
        
        Issue issue(
                .clk(clk),
-               .Nrst(1'b1 /* XXX */),
+               .Nrst(~rst),
                .stall(stall_cause_execute), .flush(execute_out_backflush | writeback_out_backflush),
                .inbubble(bubble_out_fetch), .insn(insn_out_fetch),
                .inpc(pc_out_fetch), .cpsr(writeback_out_cpsr),
                .outpc(pc_out_issue), .outinsn(insn_out_issue));
        
        RegFile regfile(
-               .clk(clk),
+               .clk(clk), .Nrst(~rst),
                .read_0(regfile_read_0), .read_1(regfile_read_1), .read_2(regfile_read_2), .read_3(regfile_read_3),
                .rdata_0(regfile_rdata_0), .rdata_1(regfile_rdata_1), .rdata_2(regfile_rdata_2), .rdata_3(regfile_rdata_3),
                .spsr(regfile_spsr),
                .rdata_0(regfile_rdata_0), .rdata_1(regfile_rdata_1), .rdata_2(regfile_rdata_2));
        
        Execute execute(
-               .clk(clk), .Nrst(1'b0),
+               .clk(clk), .Nrst(~rst),
                .stall(stall_cause_memory), .flush(writeback_out_backflush),
                .inbubble(bubble_out_issue), .pc(pc_out_issue), .insn(insn_out_issue),
                .cpsr(decode_out_cpsr), .spsr(decode_out_spsr), .op0(decode_out_op0), .op1(decode_out_op1),
        
        assign cp_insn = insn_out_execute;
        Memory memory(
-               .clk(clk), .Nrst(1'b0),
+               .clk(clk), .Nrst(~rst),
                /* stall? */ .flush(writeback_out_backflush),
                .busaddr(dcache_addr), .rd_req(dcache_rd_req), .wr_req(dcache_wr_req),
                .rw_wait(dcache_rw_wait), .wr_data(dcache_wr_data), .rd_data(dcache_rd_data),