$fsm#

No help message for this cell type found.

Simulation model (Verilog)#

Listing 298 simlib.v:2290#
module \$fsm (CLK, ARST, CTRL_IN, CTRL_OUT);

    parameter NAME = "";

    parameter CLK_POLARITY = 1'b1;
    parameter ARST_POLARITY = 1'b1;

    parameter CTRL_IN_WIDTH = 1;
    parameter CTRL_OUT_WIDTH = 1;

    parameter STATE_BITS = 1;
    parameter STATE_NUM = 1;
    parameter STATE_NUM_LOG2 = 1;
    parameter STATE_RST = 0;
    parameter STATE_TABLE = 1'b0;

    parameter TRANS_NUM = 1;
    parameter TRANS_TABLE = 4'b0x0x;

    input CLK, ARST;
    input [CTRL_IN_WIDTH-1:0] CTRL_IN;
    output reg [CTRL_OUT_WIDTH-1:0] CTRL_OUT;

    wire pos_clk = CLK == CLK_POLARITY;
    wire pos_arst = ARST == ARST_POLARITY;

    reg [STATE_BITS-1:0] state;
    reg [STATE_BITS-1:0] state_tmp;
    reg [STATE_BITS-1:0] next_state;

    reg [STATE_BITS-1:0] tr_state_in;
    reg [STATE_BITS-1:0] tr_state_out;
    reg [CTRL_IN_WIDTH-1:0] tr_ctrl_in;
    reg [CTRL_OUT_WIDTH-1:0] tr_ctrl_out;

    integer i;

    task tr_fetch;
        input [31:0] tr_num;
        reg [31:0] tr_pos;
        reg [STATE_NUM_LOG2-1:0] state_num;
        begin
            tr_pos = (2*STATE_NUM_LOG2+CTRL_IN_WIDTH+CTRL_OUT_WIDTH)*tr_num;
            tr_ctrl_out = TRANS_TABLE >> tr_pos;
            tr_pos = tr_pos + CTRL_OUT_WIDTH;
            state_num = TRANS_TABLE >> tr_pos;
            tr_state_out = STATE_TABLE >> (STATE_BITS*state_num);
            tr_pos = tr_pos + STATE_NUM_LOG2;
            tr_ctrl_in = TRANS_TABLE >> tr_pos;
            tr_pos = tr_pos + CTRL_IN_WIDTH;
            state_num = TRANS_TABLE >> tr_pos;
            tr_state_in = STATE_TABLE >> (STATE_BITS*state_num);
            tr_pos = tr_pos + STATE_NUM_LOG2;
        end
    endtask

    always @(posedge pos_clk, posedge pos_arst) begin
        if (pos_arst) begin
            state_tmp = STATE_TABLE[STATE_BITS*(STATE_RST+1)-1:STATE_BITS*STATE_RST];
            for (i = 0; i < STATE_BITS; i = i+1)
                if (state_tmp[i] === 1'bz)
                    state_tmp[i] = 0;
            state <= state_tmp;
        end else begin
            state_tmp = next_state;
            for (i = 0; i < STATE_BITS; i = i+1)
                if (state_tmp[i] === 1'bz)
                    state_tmp[i] = 0;
            state <= state_tmp;
        end
    end

    always @(state, CTRL_IN) begin
        next_state <= STATE_TABLE[STATE_BITS*(STATE_RST+1)-1:STATE_BITS*STATE_RST];
        CTRL_OUT <= 'bx;
        // $display("---");
        // $display("Q: %b %b", state, CTRL_IN);
        for (i = 0; i < TRANS_NUM; i = i+1) begin
            tr_fetch(i);
            // $display("T: %b %b -> %b %b [%d]", tr_state_in, tr_ctrl_in, tr_state_out, tr_ctrl_out, i);
            casez ({state, CTRL_IN})
                {tr_state_in, tr_ctrl_in}: begin
                    // $display("-> %b %b <-   MATCH", state, CTRL_IN);
                    {next_state, CTRL_OUT} <= {tr_state_out, tr_ctrl_out};
                end
            endcase
        end
    end

endmodule

Note

This page was auto-generated from the output of help $fsm.