SRAM.v
module SRAM (address, clock, resetj, write_enable, data_in, data_out);

// PARAMETERS

    // SMI INSTANCE NAME AND MEMORY DIMENSIONS

    parameter INSTANCE = "";
    parameter SIZE = 0;
    parameter WIDTH = 32;

// INTERFACE

    input   [SIZE-1:0] address;
    input              clock;
    input              resetj;
    input              write_enable;
    input  [WIDTH-1:0] data_in;
    output [WIDTH-1:0] data_out;

// CONSTANTS

    // MESSAGE TYPE IDENTIFIERS

    parameter MEM_CONFIG = 0;
    parameter MEM_WRITE = 1;
    parameter MEM_READ = 2;

// INTERNAL SIGNALS

    // REPLY DATA

    reg [WIDTH-1:0] data;

    // SMI MODEL IDENTIFIER

    integer id;

// IMPLEMENTATION

    initial
    begin
        // INITIALIZE THE REPLY DATA

        data = 0;

        // REGISTER THE MODEL INSTANCE WITH SMI

        $smi_initial(id, "SRAM", INSTANCE);

        // CONFIGURE THE MEMORY DIMENSIONS BY SENDING A "Configure" MESSAGE

        $smi_write(id, MEM_CONFIG, WIDTH);

        // PRINT THE CONFIGURATION

        $display("MODEL-%d: SRAM(%s)[WORD WIDTH=%d]", id, INSTANCE, WIDTH);
    end

    always @(posedge clock)

        // IF RESET IS NOT ASSERTED

        if (resetj)
        begin
            // IF A WRITE OPERATION IS REQUIRED

            if (write_enable)

                // PERFORM A WRITE OPERATION BY SENDING A "Read+Write" MESSAGE
                // AND SAVE THE REPLY

                $smi_read(id, MEM_WRITE, address, data_in, data);
            else
                // PERFORM A READ OPERATION BY SENDING A "Read" MESSAGE AND SAVE
                // THE REPLY

                $smi_read(id, MEM_READ, address, data);
        end

    // SET THE OUTPUT EQUAL TO THE REPLY DATA

    assign data_out = data;

endmodule

© Copyright 2000-2001 Adrian Lewis