From: Christopher Lu Date: Fri, 9 Jan 2009 06:24:18 +0000 (-0500) Subject: Merge branch 'master' of nyus.joshuawise.com:/git/firearm X-Git-Url: http://git.joshuawise.com/firearm.git/commitdiff_plain/ff2b4c9dcaa802e67d12d7b0f84baf0bb2f971dc?hp=666ceb038eeeb0125af3797e6cf76d0954b9431f Merge branch 'master' of nyus.joshuawise.com:/git/firearm --- diff --git a/Memory.v b/Memory.v index eeec5a3..0a5cd99 100644 --- a/Memory.v +++ b/Memory.v @@ -397,8 +397,9 @@ module Memory( next_outbubble = 1; end if (!cp_ack) begin - $display("WARNING: Possible MRCMCR undefined instruction"); + $display("WARNING: Possible MRCMCR undefined instruction: cp_ack %d, cp_busy %d",cp_ack, cp_busy); end + $display("MRCMCR: ack %d, busy %d", cp_ack, cp_busy); end default: begin end endcase diff --git a/Terminal.v b/Terminal.v new file mode 100644 index 0000000..9dc5a21 --- /dev/null +++ b/Terminal.v @@ -0,0 +1,33 @@ +module Terminal( + input clk, + + input cp_req, + input [31:0] cp_insn, + output reg cp_ack, + output reg cp_busy, + input cp_rnw, + output reg [31:0] cp_read = 0, + input [31:0] cp_write); + + /* Terminal pretends to be cp5. */ + reg towrite = 0; + reg [7:0] data = 0; + + always @(*) + begin + towrite = 0; + data = 8'hxx; + cp_ack = 0; + cp_busy = 0; + if (cp_req && (cp_rnw == 0) && (cp_insn[27:24] == 4'b1110) && (cp_insn[19:16] == 4'b0000) && (cp_insn[11:8] == 4'h5)) + begin + towrite = 1; + data = cp_write[7:0]; + cp_ack = 1; + end + end + + always @(posedge clk) + if (towrite) + $c("{extern void term_output(unsigned char d); term_output(",data,");}"); +endmodule diff --git a/ram.comments.hex b/ram.comments.hex index 99712b3..ebefed7 100644 --- a/ram.comments.hex +++ b/ram.comments.hex @@ -1,3 +1,4 @@ +EE001510 // mcr 5, 0, r1, c0, c0 E59E0000 // ldr r0, [r14] E02DE190 // mla r13, r0, r1, r14 -- r13 := r0*r1 + r14 E1800001 // orr r0, r0, r1 @@ -26,8 +27,9 @@ E0017361 // and r7, r1, r1, ror #6 E180F081 E180F081 E180F081 -EA000000 // jump forward -EAFFFFFE // whirrr, skipped the first time +EA000001 // jump forward +EE001510 // mcr 5, 0, r1, c0, c0 +EAFFFFFD // whirrr, skipped the first time E1A00000 // nop EBFFFFFC // jump back E0000000 diff --git a/ram.hex b/ram.hex index c4acfd7..6c74e2d 100644 --- a/ram.hex +++ b/ram.hex @@ -1,3 +1,4 @@ +EE001510 E59E0000 E02DE190 E1800001 @@ -21,8 +22,9 @@ E0017361 E180F081 E180F081 E180F081 -EA000000 -EAFFFFFE +EA000001 +EE001510 +EAFFFFFD E1A00000 EBFFFFFC E0000000 diff --git a/system.v b/system.v index f8479f4..ddbe0b7 100644 --- a/system.v +++ b/system.v @@ -63,12 +63,17 @@ module System(input clk); wire memory_out_write_reg; wire [3:0] memory_out_write_num; wire [31:0] memory_out_write_data; + + wire cp_ack_terminal; + wire cp_busy_terminal; + wire [31:0] cp_read_terminal; wire cp_req; - wire cp_ack = 0; - wire cp_busy = 0; + wire [31:0] cp_insn; + wire cp_ack = cp_ack_terminal; + wire cp_busy = cp_busy_terminal; wire cp_rnw; - wire [31:0] cp_read = 0; + wire [31:0] cp_read = cp_read_terminal; wire [31:0] cp_write; wire stall_cause_issue; @@ -163,6 +168,7 @@ module System(input clk); .outcpsr(execute_out_cpsr), .outspsr(execute_out_spsr)); assign execute_out_backflush = jmp; + assign cp_insn = insn_out_execute; Memory memory( .clk(clk), .Nrst(1'b0), /* stall? flush? */ @@ -178,6 +184,11 @@ module System(input clk); .out_write_reg(memory_out_write_reg), .out_write_num(memory_out_write_num), .out_write_data(memory_out_write_data), .cp_req(cp_req), .cp_ack(cp_ack), .cp_busy(cp_busy), .cp_rnw(cp_rnw), .cp_read(cp_read), .cp_write(cp_write)); + + Terminal terminal( + .clk(clk), + .cp_req(cp_req), .cp_insn(cp_insn), .cp_ack(cp_ack_terminal), .cp_busy(cp_busy_terminal), .cp_rnw(cp_rnw), + .cp_read(cp_read_terminal), .cp_write(cp_write)); reg [31:0] clockno = 0; always @(posedge clk) diff --git a/testbench.cpp b/testbench.cpp index 4188d71..53be841 100644 --- a/testbench.cpp +++ b/testbench.cpp @@ -1,8 +1,30 @@ #include "Vsystem.h" #include +#define _XOPEN_SOURCE +#include +#include Vsystem *top; +void term_output(unsigned char d) +{ + int fd = posix_openpt(O_RDWR); + static int fd2 = -1; + char b[128]; + + if (fd2 == -1) + { + grantpt(fd); + fcntl(fd, F_SETFD, 0); /* clear close-on-exec */ + sprintf(b, "rxvt -pty-fd %d -bg black -fg white -title \"Output terminal\" &", fd); + system(b); + unlockpt(fd); + fd2 = open(ptsname(fd), O_RDWR); + close(fd); + } + write(fd2, &d, 1); +} + unsigned int main_time = 0; double sc_time_stamp ()