All pastes #484133 Raw Edit

Mazz

public text v1 · immutable
·published 2007-05-12 01:36 UTC
rendered paste body
module pc_comp(nxt_pc, cur_pc, clock, reset, startPC, nPCsel, zero, jump, immed, inst);

	input [31:0] startPC;
	input [31:0] cur_pc;
	input reset, clock, nPCsel, zero, jump;
	input [31:0] immed; //already extended for branch
	input [31:0] inst;  //needed for jump

	output [31:0] nxt_pc;

	reg [31:0] nxt_pc, immed_reg;
	reg branch;
	reg [27:0] shifted_inst;

	always@(negedge reset)
		nxt_pc = startPC;

	always@(negedge clock)
	begin
		if( reset == 1)
		begin
			branch = nPCsel & zero;
			immed_reg = immed;
			nxt_pc = cur_pc+4;	//always happens if reset = 1

			if (jump ==1)	//jump signal takes precedence over branch
			begin
				shifted_inst[27:2] = inst[25:0];
				shifted_inst[1] = 0;
				shifted_inst[0] = 0;
				nxt_pc[27:0] = shifted_inst[27:0];
			end //end jump=1
			
			else
			begin
				if (branch == 1) //if nPCsel and zero = 1
				begin
					immed_reg = immed_reg << 2;
					nxt_pc = nxt_pc + immed_reg;
				end //end branch

			end //end else
		end //end reset == 1
	end //end negedge clock
endmodule


/*module m555 (CLK);
   parameter StartTime = 0, Ton = 50, Toff = 50, Tcc = Ton+Toff; // 
 
   output CLK;
   reg 	  CLK;
   
   initial begin
      #StartTime CLK = 0;
   end
   
   // The following is correct if clock starts at LOW level at StartTime //
   always begin
      #Toff CLK = ~CLK;
      #Ton CLK = ~CLK;
   end
endmodule


module testPC ( nxt_pc, cur_pc, clock, reset, startPC, nPCsel, zero, jump, immed, inst);
	input [31:0] nxt_pc;
	input clock;

	output [31:0] startPC, cur_pc;
	output reset, nPCsel, zero, jump;
	output [31:0] immed;
	output [31:0] inst;

	reg [31:0] startPC, cur_pc;
	reg reset, nPCsel, zero, jump;
	reg [31:0] immed;
	reg [31:0] inst;

	initial begin
		$monitor ( $time, " clock=%b, nxt_pc=%8h, cur_pc=%8h, reset=%b, startPC=%8h, nPCsel=%b, zero=%b, jump=%b, immed=%8h, inst=%8h",
			 clock, nxt_pc, cur_pc, reset, startPC, nPCsel, zero, jump, immed, inst);

		#200
		cur_pc = 32'h00000000; reset = 1; startPC = 32'hFFFFFFFF; nPCsel = 0; zero = 0; jump = 0;
		immed = 32'h0000000; inst = 32'h00000000; //should return 4

		#200
		cur_pc = 32'h00000004; reset = 1; startPC = 32'hFFFFFFFF; nPCsel = 1; zero = 1; jump = 0;
		immed = 32'h00000002; inst = 32'h10000002; //should return 16

		#200
		cur_pc = 32'h00000004; reset = 1; startPC = 32'hFFFFFFFF; nPCsel = 1; zero = 0; jump = 0;
		immed = 32'h00000002; inst = 32'h10000002; //should return 8

		#200
		cur_pc = 32'h00000004; reset = 1; startPC = 32'hFFFFFFFF; nPCsel = 0; zero = 1; jump = 0;
		immed = 32'h00000002; inst = 32'h10000002; //should return 8

		#200
		cur_pc = 32'h1000000C; reset = 1; startPC = 32'hFFFFFFFF; nPCsel = 0; zero = 0; jump = 1;
		immed = 32'h00000002; inst = 32'h08000002; //should return 8

		#200
		cur_pc = 32'h00000004; reset = 0; startPC = 32'hFFFFFFFF; nPCsel = 1; zero = 1; jump = 0;
		immed = 32'h00000002; inst = 32'h10000002; //should return all 1s

		#200
		$finish;
	end
endmodule

module testBench;
	wire clock;
	wire [31:0] startPC, cur_pc, nxt_pc;
	wire reset, nPCsel, zero, jump;
	wire [31:0] immed;
	wire [31:0] inst;
	
	m555(clock);
	pc_comp(nxt_pc, cur_pc, clock, reset, startPC, nPCsel, zero, jump, immed, inst);
	testPC(nxt_pc, cur_pc, clock, reset, startPC, nPCsel, zero, jump, immed, inst);
endmodule*/