From 1d97a0955e863b7dc7bbe4350bcef8c2047768d8 Mon Sep 17 00:00:00 2001 From: Joshua Wise Date: Fri, 9 Jan 2009 01:19:12 -0500 Subject: [PATCH] Add terminal --- Terminal.v | 33 +++++++++++++++++++++++++++++++++ system.v | 17 ++++++++++++++--- testbench.cpp | 22 ++++++++++++++++++++++ 3 files changed, 69 insertions(+), 3 deletions(-) create mode 100644 Terminal.v 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/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 () -- 2.39.2