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

📄 ramb4_s8_s8.v

📁 麻省理工的一个实验室实现的MIPS IP CORE
💻 V
字号:
/*FUNCTION       : 4x8x8 Block RAM with synchronous write capability*/`delay_mode_path`timescale  100 ps / 10 ps`celldefinemodule RAMB4_S8_S8 (DOA, DOB, ADDRA, DIA, ENA, CLKA, WEA, RSTA, ADDRB, DIB, ENB, CLKB, WEB, RSTB);    parameter cds_action = "ignore";    parameter [255:0] INIT_00 = 256'h0000000000000000000000000000000000000000000000000000000000000000;    parameter [255:0] INIT_01 = 256'h0000000000000000000000000000000000000000000000000000000000000000;    parameter [255:0] INIT_02 = 256'h0000000000000000000000000000000000000000000000000000000000000000;    parameter [255:0] INIT_03 = 256'h0000000000000000000000000000000000000000000000000000000000000000;    parameter [255:0] INIT_04 = 256'h0000000000000000000000000000000000000000000000000000000000000000;    parameter [255:0] INIT_05 = 256'h0000000000000000000000000000000000000000000000000000000000000000;    parameter [255:0] INIT_06 = 256'h0000000000000000000000000000000000000000000000000000000000000000;    parameter [255:0] INIT_07 = 256'h0000000000000000000000000000000000000000000000000000000000000000;    parameter [255:0] INIT_08 = 256'h0000000000000000000000000000000000000000000000000000000000000000;    parameter [255:0] INIT_09 = 256'h0000000000000000000000000000000000000000000000000000000000000000;    parameter [255:0] INIT_0A = 256'h0000000000000000000000000000000000000000000000000000000000000000;    parameter [255:0] INIT_0B = 256'h0000000000000000000000000000000000000000000000000000000000000000;    parameter [255:0] INIT_0C = 256'h0000000000000000000000000000000000000000000000000000000000000000;    parameter [255:0] INIT_0D = 256'h0000000000000000000000000000000000000000000000000000000000000000;    parameter [255:0] INIT_0E = 256'h0000000000000000000000000000000000000000000000000000000000000000;    parameter [255:0] INIT_0F = 256'h0000000000000000000000000000000000000000000000000000000000000000;    output [7:0] DOA;    reg [7:0] doa_out;    wire doa0_out, doa1_out, doa2_out, doa3_out, doa4_out, doa5_out, doa6_out, doa7_out;    input [8:0] ADDRA;    input [7:0] DIA;    input ENA, CLKA, WEA, RSTA;    output [7:0] DOB;    reg [7:0] dob_out;    wire dob0_out, dob1_out, dob2_out, dob3_out, dob4_out, dob5_out, dob6_out, dob7_out;    input [8:0] ADDRB;    input [7:0] DIB;    input ENB, CLKB, WEB, RSTB;    reg [4095:0] mem;    reg [8:0] count;    reg [5:0] mi, mj, ai, aj, bi, bj;    reg recovery_a, recovery_b;    wire [8:0] addra_int;    wire [7:0] dia_int;    wire ena_int, clka_int, wea_int, rsta_int;    wire [8:0] addrb_int;    wire [7:0] dib_int;    wire enb_int, clkb_int, web_int, rstb_int;`ifdef GSR_SIGNAL    wire gsr = `GSR_SIGNAL;`else    tri0 gsr;`endif    always @(gsr)	if (gsr)	    begin		assign doa_out = 0;	    end	else	    begin		deassign doa_out;	    end    always @(gsr)	if (gsr)	    begin		assign dob_out = 0;	    end	else	    begin		deassign dob_out;	    end    buf b_doa_out0 (doa_out0, doa_out[0]);    buf b_doa_out1 (doa_out1, doa_out[1]);    buf b_doa_out2 (doa_out2, doa_out[2]);    buf b_doa_out3 (doa_out3, doa_out[3]);    buf b_doa_out4 (doa_out4, doa_out[4]);    buf b_doa_out5 (doa_out5, doa_out[5]);    buf b_doa_out6 (doa_out6, doa_out[6]);    buf b_doa_out7 (doa_out7, doa_out[7]);    buf b_dob_out0 (dob_out0, dob_out[0]);    buf b_dob_out1 (dob_out1, dob_out[1]);    buf b_dob_out2 (dob_out2, dob_out[2]);    buf b_dob_out3 (dob_out3, dob_out[3]);    buf b_dob_out4 (dob_out4, dob_out[4]);    buf b_dob_out5 (dob_out5, dob_out[5]);    buf b_dob_out6 (dob_out6, dob_out[6]);    buf b_dob_out7 (dob_out7, dob_out[7]);    buf b_doa0 (DOA[0], doa_out0);    buf b_doa1 (DOA[1], doa_out1);    buf b_doa2 (DOA[2], doa_out2);    buf b_doa3 (DOA[3], doa_out3);    buf b_doa4 (DOA[4], doa_out4);    buf b_doa5 (DOA[5], doa_out5);    buf b_doa6 (DOA[6], doa_out6);    buf b_doa7 (DOA[7], doa_out7);    buf b_dob0 (DOB[0], dob_out0);    buf b_dob1 (DOB[1], dob_out1);    buf b_dob2 (DOB[2], dob_out2);    buf b_dob3 (DOB[3], dob_out3);    buf b_dob4 (DOB[4], dob_out4);    buf b_dob5 (DOB[5], dob_out5);    buf b_dob6 (DOB[6], dob_out6);    buf b_dob7 (DOB[7], dob_out7);    buf b_addra_0 (addra_int[0], ADDRA[0]);    buf b_addra_1 (addra_int[1], ADDRA[1]);    buf b_addra_2 (addra_int[2], ADDRA[2]);    buf b_addra_3 (addra_int[3], ADDRA[3]);    buf b_addra_4 (addra_int[4], ADDRA[4]);    buf b_addra_5 (addra_int[5], ADDRA[5]);    buf b_addra_6 (addra_int[6], ADDRA[6]);    buf b_addra_7 (addra_int[7], ADDRA[7]);    buf b_addra_8 (addra_int[8], ADDRA[8]);    buf b_dia_0 (dia_int[0], DIA[0]);    buf b_dia_1 (dia_int[1], DIA[1]);    buf b_dia_2 (dia_int[2], DIA[2]);    buf b_dia_3 (dia_int[3], DIA[3]);    buf b_dia_4 (dia_int[4], DIA[4]);    buf b_dia_5 (dia_int[5], DIA[5]);    buf b_dia_6 (dia_int[6], DIA[6]);    buf b_dia_7 (dia_int[7], DIA[7]);    buf b_ena (ena_int, ENA);    buf b_clka (clka_int, CLKA);    buf b_wea (wea_int, WEA);    buf b_rsta (rsta_int, RSTA);    buf b_addrb_0 (addrb_int[0], ADDRB[0]);    buf b_addrb_1 (addrb_int[1], ADDRB[1]);    buf b_addrb_2 (addrb_int[2], ADDRB[2]);    buf b_addrb_3 (addrb_int[3], ADDRB[3]);    buf b_addrb_4 (addrb_int[4], ADDRB[4]);    buf b_addrb_5 (addrb_int[5], ADDRB[5]);    buf b_addrb_6 (addrb_int[6], ADDRB[6]);    buf b_addrb_7 (addrb_int[7], ADDRB[7]);    buf b_addrb_8 (addrb_int[8], ADDRB[8]);    buf b_dib_0 (dib_int[0], DIB[0]);    buf b_dib_1 (dib_int[1], DIB[1]);    buf b_dib_2 (dib_int[2], DIB[2]);    buf b_dib_3 (dib_int[3], DIB[3]);    buf b_dib_4 (dib_int[4], DIB[4]);    buf b_dib_5 (dib_int[5], DIB[5]);    buf b_dib_6 (dib_int[6], DIB[6]);    buf b_dib_7 (dib_int[7], DIB[7]);    buf b_enb (enb_int, ENB);    buf b_clkb (clkb_int, CLKB);    buf b_web (web_int, WEB);    buf b_rstb (rstb_int, RSTB);    initial    begin	for (count = 0; count < 256; count = count + 1)	begin	    mem[count]		  = INIT_00[count];	    mem[256 * 1 + count]  = INIT_01[count];	    mem[256 * 2 + count]  = INIT_02[count];	    mem[256 * 3 + count]  = INIT_03[count];	    mem[256 * 4 + count]  = INIT_04[count];	    mem[256 * 5 + count]  = INIT_05[count];	    mem[256 * 6 + count]  = INIT_06[count];	    mem[256 * 7 + count]  = INIT_07[count];	    mem[256 * 8 + count]  = INIT_08[count];	    mem[256 * 9 + count]  = INIT_09[count];	    mem[256 * 10 + count] = INIT_0A[count];	    mem[256 * 11 + count] = INIT_0B[count];	    mem[256 * 12 + count] = INIT_0C[count];	    mem[256 * 13 + count] = INIT_0D[count];	    mem[256 * 14 + count] = INIT_0E[count];	    mem[256 * 15 + count] = INIT_0F[count];	end	recovery_a = 0;	recovery_b = 0;    end    always @(posedge recovery_a or posedge recovery_b) begin	if (wea_int == 1 && web_int == 1)	    for (mi = 0; mi < 8; mi = mi + 1) begin		for (mj = 0; mj < 8; mj = mj + 1) begin		    if ((addra_int * 8 + mi) == (addrb_int * 8 + mj)) begin			mem[addra_int * 8 + mi] = 1'bX;		    end		end	    end	recovery_a = 0;	recovery_b = 0;    end    always @(posedge recovery_a or posedge recovery_b) begin	if (web_int == 1)	    for (ai = 0; ai < 8; ai = ai + 1) begin		for (aj = 0; aj < 8; aj = aj + 1) begin		    if ((addra_int * 8 + ai) == (addrb_int * 8 + aj)) begin			doa_out[ai] = 1'bX;		    end		end	    end    end    always @(posedge recovery_a or posedge recovery_b) begin	if (wea_int == 1)	    for (bi = 0; bi < 8; bi = bi + 1) begin		for (bj = 0; bj < 8; bj = bj + 1) begin		    if ((addra_int * 8 + bi) == (addrb_int * 8 + bj)) begin			dob_out[bj] = 1'bX;		    end		end	    end    end    // b4_s8    always @(posedge clka_int) begin	if (ena_int == 1'b1)	    if (rsta_int == 1'b1)		begin		    doa_out[0] = 0;		    doa_out[1] = 0;		    doa_out[2] = 0;		    doa_out[3] = 0;		    doa_out[4] = 0;		    doa_out[5] = 0;		    doa_out[6] = 0;		    doa_out[7] = 0;		end	    else if (wea_int == 0)		begin		    doa_out[0] = mem[addra_int * 8 + 0];		    doa_out[1] = mem[addra_int * 8 + 1];		    doa_out[2] = mem[addra_int * 8 + 2];		    doa_out[3] = mem[addra_int * 8 + 3];		    doa_out[4] = mem[addra_int * 8 + 4];		    doa_out[5] = mem[addra_int * 8 + 5];		    doa_out[6] = mem[addra_int * 8 + 6];		    doa_out[7] = mem[addra_int * 8 + 7];		end	    else		begin		    doa_out[0] = dia_int[0];		    doa_out[1] = dia_int[1];		    doa_out[2] = dia_int[2];		    doa_out[3] = dia_int[3];		    doa_out[4] = dia_int[4];		    doa_out[5] = dia_int[5];		    doa_out[6] = dia_int[6];		    doa_out[7] = dia_int[7];		end    end    always @(posedge clka_int) begin	if (ena_int == 1'b1 && wea_int == 1'b1)	    begin		mem[addra_int * 8 + 0] = dia_int[0];		mem[addra_int * 8 + 1] = dia_int[1];		mem[addra_int * 8 + 2] = dia_int[2];		mem[addra_int * 8 + 3] = dia_int[3];		mem[addra_int * 8 + 4] = dia_int[4];		mem[addra_int * 8 + 5] = dia_int[5];		mem[addra_int * 8 + 6] = dia_int[6];		mem[addra_int * 8 + 7] = dia_int[7];	    end    end    // b4_s8    always @(posedge clkb_int) begin	if (enb_int == 1'b1)	    if (rstb_int == 1'b1)		begin		    dob_out[0] = 0;		    dob_out[1] = 0;		    dob_out[2] = 0;		    dob_out[3] = 0;		    dob_out[4] = 0;		    dob_out[5] = 0;		    dob_out[6] = 0;		    dob_out[7] = 0;		end	    else if (web_int == 0)		begin		    dob_out[0] = mem[addrb_int * 8 + 0];		    dob_out[1] = mem[addrb_int * 8 + 1];		    dob_out[2] = mem[addrb_int * 8 + 2];		    dob_out[3] = mem[addrb_int * 8 + 3];		    dob_out[4] = mem[addrb_int * 8 + 4];		    dob_out[5] = mem[addrb_int * 8 + 5];		    dob_out[6] = mem[addrb_int * 8 + 6];		    dob_out[7] = mem[addrb_int * 8 + 7];		end	    else		begin		    dob_out[0] = dib_int[0];		    dob_out[1] = dib_int[1];		    dob_out[2] = dib_int[2];		    dob_out[3] = dib_int[3];		    dob_out[4] = dib_int[4];		    dob_out[5] = dib_int[5];		    dob_out[6] = dib_int[6];		    dob_out[7] = dib_int[7];		end    end    always @(posedge clkb_int) begin	if (enb_int == 1'b1 && web_int == 1'b1)	    begin		mem[addrb_int * 8 + 0] = dib_int[0];		mem[addrb_int * 8 + 1] = dib_int[1];		mem[addrb_int * 8 + 2] = dib_int[2];		mem[addrb_int * 8 + 3] = dib_int[3];		mem[addrb_int * 8 + 4] = dib_int[4];		mem[addrb_int * 8 + 5] = dib_int[5];		mem[addrb_int * 8 + 6] = dib_int[6];		mem[addrb_int * 8 + 7] = dib_int[7];	    end    end    specify	(CLKA => DOA) = (1, 1);	(CLKB => DOB) = (1, 1);	$recovery (posedge CLKB, posedge CLKA, 1, recovery_b);	$recovery (posedge CLKA, posedge CLKB, 1, recovery_a);    endspecifyendmodule`endcelldefine

⌨️ 快捷键说明

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