OpenCores
URL https://opencores.org/ocsvn/Aquarius/Aquarius/trunk

Subversion Repositories Aquarius

[/] [Aquarius/] [trunk/] [verification/] [tools/] [genrom.c] - Rev 12

Compare with Previous | Blame | View Log

/*=======================================================================*/
/* Generate ROM from S-Format (4K byte)                                  */
/*-----------------------------------------------------------------------*/
/* Rev.1 August    14,2002 by Thorn Aitch                                */
/* Rev.2 September 22,2002 by Thorn Aitch : Modify Verilog Descriptions  */
/* Rev.3 October   07,2002 by Thorn Aitch : 4K byte version              */
/* Rev.4 January   21,2003 by Thorn Aitch : 8K byte + RAM signals        */
/*                                                                       */
/*(1) Usage:                                                             */
/*    genrom [filename]                                                  */
/*        [filename] : (Input ) Binary File Name of Motolora S-Format.   */
/*        rom.v      : (Output) Verilog ROM description.                 */
/*        rom.dat    : (Output) ROM data file.                           */
/*                                                                       */
/*(2) ROM Specification:                                                 */
/*    8192 byte (32bit x 2048word) : address = 00000000~00001FFF         */
/*=======================================================================*/
 
#include <stdio.h>
#include <string.h>
#include <malloc.h>
#include <stdlib.h>
 
#define ROMSIZE 8192 /* unit : byte */
#define MAXLINE 1000
#define MAXWORD 100
 
 
/*=============*/
/* main routine*/
/*=============*/
int main(int argc, char *argv[])
{
	FILE	*memFp;
	FILE	*romvFp;
	FILE	*romdFp;
	char	memLine[MAXLINE];
	char	hex[MAXWORD];
	char	*pMemLine, *pHex, *SkipSpace();
	int	i, errStx, recType, numCode;
	unsigned long	rom[ROMSIZE];
	unsigned long	addr;
	unsigned long data;
 
	if (argc != 2)
	{
 
 		printf("\n");
		printf("====================================\n");
		printf("==== Generate ROM from S-Format ====\n");
		printf("====================================\n");
		printf("[Command Usage]\n");
		printf("    genrom [filename]\n");
		printf("\n");
		printf("        [filename] : (input ) Binary File Name of Motorola S-Format.\n");
		printf("        rom.v      : (output) Verilog ROM description.\n");
		printf("        rom.dat    : (output) ROM data file for $readmemh.\n");
		printf("\n");
		printf("[ROM Specification]\n");
		printf("    -8192byte (32bit x 2048word)\n");
		printf("    -module rom(CLK, CE, WE, SEL, ADR, DATI, DATO);\n");
		printf("        input  CLK;         : clock\n");
		printf("        input  CE;          : chip enable\n");
        printf("        input  WE;          : write enable (ignored)\n");
        printf("        input  [ 3:0] SEL;  : byte lane (ignored)\n");
		printf("        input  [12:0] ADR;  : address input\n");
        printf("        input  [31:0] DATI; : data input (ignored)\n");
		printf("        output [31:0] DATO; : data output\n");
		printf("    -CE and ADR are latched at posedge of CLK,\n");
		printf("    -From the negedge of CLK, DAT will be out.\n");
		printf("    -If CE is 0, DAT will be 32'h00000000.\n");
		printf("    -ADR[1:0] are ignored.\n");
		printf("\n");
		return(1);
	}
 
	/*------------------*/
	/* initialize rom[] */
	/*------------------*/
	for (i = 0 ; i < ROMSIZE ; i++)
	{
		rom[i] = 255; /* init values are all FF */
	}
 
	/*-----------------------------*/
	/* read s-format file to rom[] */
	/*-----------------------------*/
	if ((memFp = fopen(argv[1], "r")) == NULL)
	{
 		printf("ERROR:cant open the file.\n");
		return(2);
	}
	errStx = 0;
	pHex = hex;
	while (fgets(memLine, MAXLINE, memFp) != NULL)
	{
		pMemLine = memLine;
		pMemLine = SkipSpace(pMemLine);
 
		if (*pMemLine++ != 'S') /* start mark ? */
		{
			errStx = 1;
			break;
		}
 
		if ((*pMemLine == '0') || (*pMemLine == '5')) continue;	/* if comment ? */
 
		if (*pMemLine == '1') recType = 1;						/* record type */
		else if (*pMemLine == '2') recType = 2;
		else if (*pMemLine == '3') recType = 3;
		else if (*pMemLine == '7') break;
		else if (*pMemLine == '8') break;
		else if (*pMemLine == '9') break;
		else
		{
		errStx = 1;
		break;
		}
		pMemLine++;
 
		pHex = strncpy(pHex,pMemLine,2);				/* the number of code */
		pMemLine = pMemLine + 2;
		*(pHex + 2) = '\0';
		if ((ChkHex(pHex) == 0) || (sscanf(pHex,"%X",&numCode) == EOF))
		{
			errStx = 1;
			break;
		}
 
		if (recType == 1)								/* load address */
		{
			pHex = strncpy(pHex,pMemLine,4);
			pMemLine = pMemLine + 4;
			numCode = numCode - 2;
			*(pHex + 4) = '\0';
			if (strlen(pHex) != 4)
			{
				errStx = 1;
				break;
			}
		}
		if (recType == 2)
		{
			pHex = strncpy(pHex,pMemLine,6);
			pMemLine = pMemLine + 6;
			numCode = numCode - 3;
			*(pHex + 6) = '\0';
			if (strlen(pHex) != 6)
			{
				errStx = 1;
				break;
			}
		}
		if (recType == 3)
		{
			pHex = strncpy(pHex,pMemLine,8);
			pMemLine = pMemLine + 8;
			numCode = numCode - 4;
			*(pHex + 8) = '\0';
			if (strlen(pHex) != 8)
			{
				errStx = 1;
				break;
			}
		}
 
		if ((ChkHex(pHex) == 0) || (sscanf(pHex,"%lX",&addr) == EOF))
		{
			errStx = 1;
			break;
		}
 
		for (i = 0 ; i < numCode - 1 ; i++)				/* code */
		{
			pHex = strncpy(pHex,pMemLine,2);
			pMemLine = pMemLine + 2;
			*(pHex + 2) = '\0';
			if (strlen(pHex) != 2)
			{
				errStx = 1;
				break;
			}
			if ((ChkHex(pHex) == 0) || (sscanf(pHex,"%X",&data) == EOF))
			{
				errStx = 1;
				break;
			}
			if (addr <= ROMSIZE)
			{
				rom[addr] = data;
				addr++;
			}
			else
			{
				errStx = 2;
				break;
			}
		}
		if (errStx != 0) break;
	}
 
	if (errStx == 1)
	{ 
		printf("ERROR:syntax error in object file.\n");
		return(2);
	}
	if (errStx == 2)
	{
		printf("ERROR:rom address out of range.\n");
		return(2);
	}
	if (fclose(memFp) == EOF)
	{
 		printf("ERROR:file close error.\n");
		return(2);
	}
 
	/*------------------*/
	/* write rom.v file */
	/*------------------*/
	if ((romvFp = fopen("rom.v", "w")) == NULL)
	{
 		printf("ERROR:cant open rom.v.\n");
		return(3);
	}
 
    fprintf(romvFp, "//--------------------\n");
	fprintf(romvFp, "// Verilog ROM : rom.v\n");
    fprintf(romvFp, "//--------------------\n");
	fprintf(romvFp, "// ROM Specification\n");
	fprintf(romvFp, "//    -8192byte (32bit x 2048word)\n");
	fprintf(romvFp, "//    -module rom(CLK, CE, WE, SEL, ADR, DATI, DATO);\n");
	fprintf(romvFp, "//        input  CLK;         : clock\n");
	fprintf(romvFp, "//        input  CE;          : chip enable\n");
    fprintf(romvFp, "//        input  WE;          : write enable (ignored)\n");
    fprintf(romvFp, "//        input  [ 3:0] SEL;  : byte lane (ignored)\n");
	fprintf(romvFp, "//        input  [12:0] ADR;  : address input\n");
    fprintf(romvFp, "//        input  [31:0] DATI; : data input (ignored)\n");
	fprintf(romvFp, "//        output [31:0] DATO; : data output\n");
	fprintf(romvFp, "//    -CE and ADR are latched at posedge of CLK,\n");
	fprintf(romvFp, "//    -From the negedge of CLK, DAT will be out.\n");
	fprintf(romvFp, "//    -If CE is 0, DAT will be 32'h00000000.\n");
	fprintf(romvFp, "//    -ADR[1:0] are ignored.\n");
	fprintf(romvFp, "\n");
    fprintf(romvFp, "`include \"timescale.v\"\n");
	fprintf(romvFp, "\n");
	fprintf(romvFp, "module rom (CLK, CE, WE, SEL, ADR, DATI, DATO);\n");
	fprintf(romvFp, "    input  CLK, CE, WE;\n");
	fprintf(romvFp, "    input  [ 3:0] SEL;\n");
	fprintf(romvFp, "    input  [12:0] ADR;\n");
	fprintf(romvFp, "    input  [31:0] DATI;\n");
	fprintf(romvFp, "    output [31:0] DATO;\n");
	fprintf(romvFp, "\n");
	fprintf(romvFp, "    reg [31:0] DATO;\n");
	fprintf(romvFp, "\n");
	fprintf(romvFp, "    always @(negedge CLK) begin\n");
	fprintf(romvFp, "        if (CE == 1'b0)\n");
	fprintf(romvFp, "            DATO <= 32'h00000000;\n");
	fprintf(romvFp, "        else\n");
	fprintf(romvFp, "            begin\n");
	fprintf(romvFp, "                case(ADR[12:2])\n");
 
	for (i = 0 ; i < ROMSIZE / 4 ; i++)
	{
	fprintf(romvFp, "                    11'h%03X : DATO <= 32'h", i);
	fprintf(romvFp, "%02X", rom[i*4]);
	fprintf(romvFp, "%02X", rom[i*4+1]);
	fprintf(romvFp, "%02X", rom[i*4+2]);
	fprintf(romvFp, "%02X;\n", rom[i*4+3]);
	}
 
	fprintf(romvFp, "                    default : DATO <= 32'hxxxxxxxx;\n");
	fprintf(romvFp, "                endcase\n");
	fprintf(romvFp, "            end\n");
	fprintf(romvFp, "    end\n");
	fprintf(romvFp, "endmodule\n");
 
	if (fclose(romvFp) == EOF)
	{
 		printf("ERROR:file close error.\n");
		return(3);
	}
 
	/*--------------------*/
	/* write rom.dat file */
	/*--------------------*/
	if ((romdFp = fopen("rom.dat", "w")) == NULL)
	{
 		printf("ERROR:cant open rom.dat.\n");
		return(4);
	}
 
	for (i = 0 ; i < ROMSIZE ; i = i + 4)
	{
		fprintf(romdFp, "%02X", rom[i]);
		fprintf(romdFp, "%02X", rom[i + 1]);
		fprintf(romdFp, "%02X", rom[i + 2]);
		fprintf(romdFp, "%02X", rom[i + 3]);
		/* fprintf(romdFp, " %d", i); [DEBUG] */
		fprintf(romdFp, "\n");
	}
 
	if (fclose(romdFp) == EOF)
	{
 		printf("ERROR:file close error.\n");
		return(4);
	}
 
	/*-----------------------------------------*/
	return(0);
}
 
/*============*/
/* skip space */
/*============*/
char *SkipSpace(pStr)
	char	*pStr;
{
	while(isspace((int) *pStr)) pStr++;
	return(pStr);
}
 
/*===========*/
/* check hex */
/*===========*/
int ChkHex(str)
	char	*str;
{
	int		result;
 
	result = 0;
	while(*str != '\0')
	{
		result = isxdigit(*(str++));
		if (result == 0) break;
	}
	return(result);
}
 
/* end of source file */
 
 
 

Compare with Previous | Blame | View Log

powered by: WebSVN 2.1.0

© copyright 1999-2025 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.