⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pipeex.v

📁 别处下载的sarm9
💻 V
字号:
/********************************************************************************//* Copyright @ 2006 by SOME of SJTU                                             *//* All rights are reserved. Reproduction in whole or in part is                 *//* prohibited without the written consent of the copyright owner.               *//* SJTU reserves the right to make changes without notice at                    *//* any time. The software is provided as is and SJTU makes                      *//* no warranty, expressed, implied or statutory, including but not limited to   *//* any implied warranty of merchantability or fitness for any particular        *//* purpose, or that the use will not infringe any third party patent, copyright *//* or trademark. SJTU should not be liable for any loss or damage arising from  *//* its use. you can redistribute it and/or                                      *//*  modify it under the terms of the GNU Lesser General Public                  *//*  License as published by the Free Software Foundation; either                *//*  version 2 of the License, or (at your option) any later version.            *//********************************************************************************//** *        PROJECT: Simple ARM Core *      COPYRIGHT: SOME of SJTU 2006 *       $RCSfile: ,v $ *      $Revision:  $ *         AUTHOR: Thomas.Luo *         E_MAIL: microbear@sjtu.edu.cn *       LANGUAGE: V *    DESCRIPTION:  * *      DOCUMENTS:  **/`include "sarm9h.v"module pipeex(clk,rst,ien,status,op,opt,rs1,rs2,rs2op,rs2sf,rda,rdata,rsf,rs1r,rs2r,rs2sfr,rdatar,sbit , opout,aluout,rdaout,rdataout);   input clk;   input rst;   input ien;   output[1:0] status;   reg[1:0] status;   input[7:0] op;   input[3:0] opt;   input[31:0] rs1;   input[31:0] rs2;   input[3:0] rs2op;   input[31:0] rs2sf;   input[4:0] rda;   input[31:0] rdata;   input[3:0] rsf;   input[`RENAMEREGWIDTH-1:0] rs1r;   input[`RENAMEREGWIDTH-1:0] rs2r;   input[`RENAMEREGWIDTH-1:0] rs2sfr;   input[`RENAMEREGWIDTH-1:0] rdatar;   input sbit;   output[1:0] opout;   reg [1:0] opout;   output[31:0] aluout;   reg [31:0] aluout;   output[4:0] rdaout;   reg[4:0] rdaout;   output[31:0] rdataout;   reg[31:0] rdataout;      reg[1:0] iopout;   reg[32:0] ialuout;   reg[4:0] irdaout;         reg[1:0]  istatus;   reg[7:0]  iop;   reg[3:0]  iopt;   reg[31:0] irs1;   reg[31:0] irs2;   reg[31:0] irs2o;   reg[3:0]  irs2op;   reg[31:0] irs2sf;   reg[4:0] irda;   reg[31:0] irdata;   reg[3:0] irsf;   reg[`RENAMEREGWIDTH-1:0] irs1r;   reg[`RENAMEREGWIDTH-1:0] irs2r;   reg[`RENAMEREGWIDTH-1:0] irs2sfr;   reg[`RENAMEREGWIDTH-1:0] irdatar;   reg isbit;   wire[3:0]  ivalid;   wire[3:0]  valid;   integer i;      wire nflags = ialuout[31];   wire zflags = ~(| ialuout[31:0]);   wire cflags = ialuout[32];   wire vflags = irs1[31]^irs2o[31]^ialuout[31]^ialuout[32];      assign ivalid[0] = armrf.valid[irs1r];   assign ivalid[1] = armrf.valid[irs2r];   assign ivalid[2] = armrf.valid[irs2sfr];   assign ivalid[3] = armrf.valid[irdatar];      assign valid[0] = armrf.valid[rs1r];   assign valid[1] = armrf.valid[rs2r];   assign valid[2] = armrf.valid[rs2sfr];   assign valid[3] = armrf.valid[rdatar];     always @(posedge clk or negedge rst)begin   if (~rst)   begin		  status <=0; 		  istatus<=0;   end  else   begin		   if ((status ==2'b00)||(status ==2'b01))		   begin				if (ien)					begin						 iop <=op;						 iopt<=opt;						 irs2op<=rs2op;						 irda <= rda;						 isbit<=sbit;												  if (!(({armrf.busy[rdatar],armrf.busy[rs2sfr],armrf.busy[rs2r],armrf.busy[rs1r]}& rsf) == rsf))							 $display("ERROR!");						   if (!((valid & rsf) == rsf))							begin								istatus <= 2'b10;								irs1r<= rs1r;								 irs2r <= rs2r;								 irs2sfr <=rs2sfr;								 ialuout <=0;								 irsf <=rsf;								 irdatar<= rdatar;								 irdata<= rdata;								 irs1<=rs1;								 irs2<=rs2;								 irs2sf <= rs2sf;							end							else							begin								 istatus <= 2'b01;							if (rsf[0])							begin								if (armrf.req[rs1r])								armrf.req[rs1r] <= armrf.req[rs1r] -1;								irs1 <= armrf.data[rs1r];							end							else							  irs1 <= rs1;							   							if (rsf[1])							begin							#1							if (armrf.req[rs2r])								armrf.req[rs2r] <= armrf.req[rs2r] -1;								irs2 <= armrf.data[rs2r];							end							else							   irs2<= rs2;							if (rsf[2])							begin							#1							if (armrf.req[rs2sfr])								armrf.req[rs2sfr] <= armrf.req[rs2sfr] -1;								irs2sf <= armrf.data[rs2sfr];							end							else							  irs2sf<= rs2sf;														if (rsf[3])							begin							#1							if (armrf.req[rdatar])								armrf.req[rdatar] <= armrf.req[rdatar] -1;								irdata <= armrf.data[rdatar];							end							else							   irdata <= irdata;														irsf <=0;							end					end				else					begin					 ;					end		   end		   else // else status		   begin		   				if (!(({armrf.busy[irdatar],armrf.busy[irs2sfr],armrf.busy[irs2r],armrf.busy[irs1r]}& rsf) == rsf))					  $display("ERROR!");													if (!((ivalid & rsf) == rsf))							 istatus <= 2'b10;						else						begin							istatus <= 2'b01;							if (irsf[0])							begin								if (armrf.req[irs1r])								armrf.req[irs1r] <= armrf.req[irs1r] -1;								irs1 <= armrf.data[irs1r];							end							if (irsf[1])							begin							#1							if (armrf.req[irs2r])								armrf.req[irs2r] <= armrf.req[irs2r] -1;								irs2 <= armrf.data[irs2r];							end							if (irsf[2])							begin							#1							if (armrf.req[irs2sfr])								armrf.req[irs2sfr] <= armrf.req[irs2sfr] -1;								irs2sf <= armrf.data[irs2sfr];							end														if (irsf[3])							begin							#1							if (armrf.req[irdatar])								armrf.req[irdatar] <= armrf.req[irdatar] -1;								irdata <= armrf.data[irdatar];							end							irsf <=0;						end		   		   		   end	   endendalways @(posedge clk)begin#5 if ((istatus == 2'b01) && (isbit))	begin		   armrf.cpsr[31:28] <={nflags,zflags,cflags,vflags};		   armrf.cpsrws<=0;	end  if ((istatus == 2'b01) && (isbit))  begin     if (iop == `MSR)	begin		iopout =`MAOPNOP;		if (irs1 & 4'b1000)		 armrf.cpsr[31:28] <= irs2[31:28];    end    endendalways @(iop or iopt or irs1 or irs2 or irs2op or irsf orirs2sf or istatus or ivalid)begin		if (istatus == 2'b01)	begin	///////////////////////////////////////////////////////////////////////////////	  	 case(irs2op)		 `SFROR:		   begin		   /////////////////////////////////////////		   for(i=31;i>=0;i=i-1)		   begin   //			irs2[i] = irs2[(31+i-irs2sf) %32];		   end		   		   /////////////////////////////////////////		   end		 `SFLSL:		   begin			irs2 = irs2<< irs2sf;		   end		 `SFLSR:		   begin			irs2 = irs2>> irs2sf;		   end		 `SFASR:		   begin		   irs2 = irs2>> irs2sf;		   end		 `SFMUL:		   begin		   irs2 = irs2 * irs2sf;		   end		 default:		   begin		   		   end		 	  endcase	//////////////////////////////////////////////////////////////////////////////						case(iop)			   `NOP:				begin					istatus = 0;				end			   `LD:				begin				  iopout =`MAOPLD;				  ialuout = irs1+irs2;				end 			   `ST:				begin				  iopout =`MAOPST;				  ialuout = irs1+irs2;				  				end 			   `MOV:				begin				 iopout =`MAOPWB;				 ialuout = {1'b0,irs1+irs2};				 irs2o = irs2;				end			   `ORR:				begin				 iopout =`MAOPWB;				 ialuout = {1'b0,irs1|irs2};				  irs2o = irs2;				end			   `AND:				begin				 iopout =`MAOPWB;				 ialuout = {1'b0,irs1&irs2};				  irs2o = irs2;				end			   `ADD:				begin				iopout =`MAOPWB;				ialuout = irs1+irs2;				 irs2o = irs2;				end			   `ADC:				begin				iopout =`MAOPWB;					ialuout = irs1+irs2 + armrf.cpsr[29];				end			   `SUB:				begin				 iopout =`MAOPWB;				  ialuout = irs1+(~irs2)+1;				  irs2o = ~irs2;				end			   `MVN:				begin				 iopout =`MAOPWB;				   ialuout = ~irs2;					irs2o = ~irs2;				end			   `CMP:				begin				 iopout =`MAOPNOP;				   ialuout = irs1+(~irs2)+1;					irs2o = ~irs2;				end			   `CMN:				begin				 iopout =`MAOPNOP;				   ialuout = irs1+irs2;					irs2o = irs2;				end			   `MLA:				begin				   iopout =`MAOPWB;				   ialuout = irs1+irs2;					irs2o = irs2;				end			   `MUL:				begin				 iopout =`MAOPWB;				 ialuout = irs2;				 irs2o = irs2;				end				`MRS:				begin				 iopout =`MAOPWB;				 ialuout = armrf.cpsr;				 irs2o =0;				end				`MSR:				begin				 iopout =`MAOPNOP;				 if (irs1 & 4'b1000)				 begin					irs2o =0;				 end				 				end				default:				  istatus =0;			   endcase			   			  			   		   endendalways @(posedge clk or negedge rst)begin   if (~rst)   begin		  status <=0; 		  istatus<=0;   end  else   begin   #5		   if (istatus ==2'b01)		   begin				if (ien)					begin					   if ((iop!= `LD) && ( iop !=`ST)&& ( iop !=`NOP))					   begin						//////////////////////////////////////////////////////////								if (armrf.writealloc[irda])								 begin									armrf.data[armrf.reqNaddr[irda]] <= ialuout;									armrf.valid[armrf.reqNaddr[irda]] <=1;								 end					  /////////////////////////////////////////////////////////						end							else						begin												end					end				else					begin					 ;					end		   end		   else // else status		   begin		  		   end   endendalways @(negedge clk)begin  status<= istatus;  opout<= iopout;  aluout<=ialuout;  rdaout<= irda;  rdataout<= irdata;endalways @(negedge clk)begin	endendmodule

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -