// Behavioral level CPU blocks // // J. Wawrzynek // Nov 2001 //Behavioral model of 32-bit Register: // positive edge-triggered, // synchronous active-high reset. module reg32 (CLK,Q,D,RST); input [31:0] D; input CLK, RST; output [31:0] Q; // reg [31:0] Q; always @ (posedge CLK) if (RST) Q = 0; else Q = D; endmodule // Reg32 //Behavioral model of 32-bit adder. module add32 (S,A,B); input [31:0] A,B; output [31:0] S; reg [31:0] S; // always @ (A or B) S = A + B; endmodule // Add //Behavioral model of Read Only Memory: // 32-bit wide, 256 words deep, // asynchronous read-port, // initialize from file on positive // edge of reset signal, by reading // contents of "text.dat" interpeted // as hex. // module ROM (RST,address,readD); input RST; input [31:0] address; output [31:0] readD; reg [31:0] readD; // reg [31:0] memArray [0:255]; always @ (posedge RST) $readmemh("text.dat", memArray); always @ (address) readD = memArray[address[9:2]]; endmodule // RAM //Behavioral model of Random Access Memory: // 32-bit wide, 256 words deep, // asynchronous read-port if RD=1, // synchronous write-port if WR=1, // initialize from hex file ("data.dat") on positive // edge of reset signal, // dump to binary file ("dump.dat") on positive // edge of dump signal. // module mem (CLK,RST,DMP,WR,RD,address,writeD,readD); input CLK, RST, DMP, WR, RD; input [31:0] address, writeD; output [31:0] readD; reg [31:0] readD; // parameter memSize=256; reg [31:0] memArray [0:memSize-1]; integer chann,i; always @ (posedge RST) $readmemh("data.dat", memArray); always @ (posedge CLK) if (WR) memArray[address[9:2]] = writeD; always @ (address or RD) if (RD) begin readD = memArray[address[9:2]]; $display("Getting address %h containing %h", address[9:2], readD); end always @ (posedge DMP) begin chann = $fopen("dump.dat"); if (chann==0) begin $display("$fopen of dump.dat failed."); $finish; end for (i=0; i