Add terminal
authorJoshua Wise <joshua@rebirth.joshuawise.com>
Fri, 9 Jan 2009 06:19:12 +0000 (01:19 -0500)
committerJoshua Wise <joshua@rebirth.joshuawise.com>
Fri, 9 Jan 2009 06:19:12 +0000 (01:19 -0500)
Terminal.v [new file with mode: 0644]
system.v
testbench.cpp

diff --git a/Terminal.v b/Terminal.v
new file mode 100644 (file)
index 0000000..9dc5a21
--- /dev/null
@@ -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
index f8479f4..ddbe0b7 100644 (file)
--- 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)
index 4188d71..53be841 100644 (file)
@@ -1,8 +1,30 @@
 #include "Vsystem.h"
 #include <stdio.h>
+#define _XOPEN_SOURCE
+#include <stdlib.h>
+#include <fcntl.h>
 
 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 ()
This page took 0.024132 seconds and 4 git commands to generate.