RISC-V MCU中文社区

【分享】 蜂鸟NICE协处理器状态机部分分析

发表于 开源蜂鸟E203 2022-05-20 14:51:57
0
208
0

parameter NICE_FSM_WIDTH = 2; //状态机位宽—2,共有4个状态
parameter IDLE = 2’d0; //闲暇状态
parameter LBUF = 2’d1; //load buf 01
parameter SBUF = 2’d2; //store buf 10
parameter ROWSUM = 2’d3; //rowsum 11

wire [NICE_FSM_WIDTH-1:0] state_r; //状态寄存器(当前状态)
wire [NICE_FSM_WIDTH-1:0] nxt_state; //下一状态(状态寄存器的输入)
//下一状态预判信号,配合是否能离开当前状态的信号生成下一状态
wire [NICE_FSM_WIDTH-1:0] state_idle_nxt; //下一状态 — 由指令译码custom3_lbuf、sbuf、rowsum的1/0决定
wire [NICE_FSM_WIDTH-1:0] state_lbuf_nxt; // = IDLE
wire [NICE_FSM_WIDTH-1:0] state_sbuf_nxt; // = IDLE
wire [NICE_FSM_WIDTH-1:0] state_rowsum_nxt; // = IDLE
assign state_idle_nxt = custom3_lbuf ? LBUF :
custom3_sbuf ? SBUF :
custom3_rowsum ? ROWSUM :
IDLE;
assign state_lbuf_nxt = IDLE;
assign state_sbuf_nxt = IDLE;
assign state_rowsum_nxt = IDLE;

//握手和非法指令表示
wire nice_req_hsked; //= nice_req_valid & nice_req_ready;请求通道 成功握手 handshaked
wire nice_rsp_hsked; //= nice_rsp_valid & nice_rsp_ready;反馈通道 成功握手
wire nice_icb_rsp_hsked; //= nice_icb_rsp_valid & nice_icb_rsp_ready;存储器反馈通道 成功握手
wire illgel_instr = ~(custom_multi_cyc_op); //是否为非法指令

//当前状态 1/0 表示
wire state_is_idle = (state_r == IDLE);
wire state_is_lbuf = (state_r == LBUF);
wire state_is_sbuf = (state_r == SBUF);
wire state_is_rowsum = (state_r == ROWSUM);

//状态跳转使能位
wire state_idle_exit_ena; //离开ILDE状态的使能位
assign state_idle_exit_ena = state_is_idle & nice_req_hsked & ~illgel_instr;

wire state_lbuf_exit_ena; //离开LBUF状态的使能位
assign state_lbuf_exit_ena = state_is_lbuf & lbuf_icb_rsp_hsked_last;

wire state_sbuf_exit_ena; //离开SBUF状态的使能位
assign state_sbuf_exit_ena = state_is_sbuf & sbuf_icb_rsp_hsked_last;

wire state_rowsum_exit_ena; //离开ROWSUM状态的使能位
assign state_rowsum_exit_ena = state_is_rowsum & rowsum_done;

wire state_ena; //离开当前状态的使能位,使能状态机状态跳转
assign state_ena = state_idle_exit_ena | state_lbuf_exit_ena //状态跳转的使能位,离开当前状态
| state_sbuf_exit_ena | state_rowsum_exit_ena;

//
//各个指令执行结束标志
wire lbuf_icb_rsp_hsked_last;
wire sbuf_icb_rsp_hsked_last;
wire rowsum_done;

//下一状态判定,是否能离开当前状态 & 下一状态预判值;再将四种结果或运算
assign nxt_state = ({NICE_FSM_WIDTH{state_idle_exit_ena }} & state_idle_nxt )
| ({NICE_FSM_WIDTH{state_lbuf_exit_ena }} & state_lbuf_nxt )
| ({NICE_FSM_WIDTH{state_sbuf_exit_ena }} & state_sbuf_nxt )
| ({NICE_FSM_WIDTH{state_rowsum_exit_ena }} & state_rowsum_nxt )
;

//状态寄存器 #(寄存器位数) (使能,输入,输出,时钟,复位)
sirv_gnrl_dfflr #(NICE_FSM_WIDTH) state_dfflr (state_ena, nxt_state, state_r, nice_clk, nice_rst_n);

喜欢0
用户评论
CC2197

CC2197 未通过实名认证

二白

积分
问答
粉丝
关注
  • RV-STAR 开发板
  • RISC-V处理器设计系列课程
  • 培养RISC-V大学土壤 共建RISC-V教育生态
RV-STAR 开发板