📄 tap_top.v
字号:
if(~tms_pad_i & (exit1_dr | pause_dr)) pause_dr<=#1 1'b1; else pause_dr<=#1 1'b0;end// exit2_dr statealways @ (posedge tck_pad_i or posedge trst_pad_i)begin if(trst_pad_i) exit2_dr<=#1 1'b0; else if (tms_reset) exit2_dr<=#1 1'b0; else if(tms_pad_i & pause_dr) exit2_dr<=#1 1'b1; else exit2_dr<=#1 1'b0;end// update_dr statealways @ (posedge tck_pad_i or posedge trst_pad_i)begin if(trst_pad_i) update_dr<=#1 1'b0; else if (tms_reset) update_dr<=#1 1'b0; else if(tms_pad_i & (exit1_dr | exit2_dr)) update_dr<=#1 1'b1; else update_dr<=#1 1'b0;end// select_ir_scan statealways @ (posedge tck_pad_i or posedge trst_pad_i)begin if(trst_pad_i) select_ir_scan<=#1 1'b0; else if (tms_reset) select_ir_scan<=#1 1'b0; else if(tms_pad_i & select_dr_scan) select_ir_scan<=#1 1'b1; else select_ir_scan<=#1 1'b0;end// capture_ir statealways @ (posedge tck_pad_i or posedge trst_pad_i)begin if(trst_pad_i) capture_ir<=#1 1'b0; else if (tms_reset) capture_ir<=#1 1'b0; else if(~tms_pad_i & select_ir_scan) capture_ir<=#1 1'b1; else capture_ir<=#1 1'b0;end// shift_ir statealways @ (posedge tck_pad_i or posedge trst_pad_i)begin if(trst_pad_i) shift_ir<=#1 1'b0; else if (tms_reset) shift_ir<=#1 1'b0; else if(~tms_pad_i & (capture_ir | shift_ir | exit2_ir)) shift_ir<=#1 1'b1; else shift_ir<=#1 1'b0;end// exit1_ir statealways @ (posedge tck_pad_i or posedge trst_pad_i)begin if(trst_pad_i) exit1_ir<=#1 1'b0; else if (tms_reset) exit1_ir<=#1 1'b0; else if(tms_pad_i & (capture_ir | shift_ir)) exit1_ir<=#1 1'b1; else exit1_ir<=#1 1'b0;end// pause_ir statealways @ (posedge tck_pad_i or posedge trst_pad_i)begin if(trst_pad_i) pause_ir<=#1 1'b0; else if (tms_reset) pause_ir<=#1 1'b0; else if(~tms_pad_i & (exit1_ir | pause_ir)) pause_ir<=#1 1'b1; else pause_ir<=#1 1'b0;end// exit2_ir statealways @ (posedge tck_pad_i or posedge trst_pad_i)begin if(trst_pad_i) exit2_ir<=#1 1'b0; else if (tms_reset) exit2_ir<=#1 1'b0; else if(tms_pad_i & pause_ir) exit2_ir<=#1 1'b1; else exit2_ir<=#1 1'b0;end// update_ir statealways @ (posedge tck_pad_i or posedge trst_pad_i)begin if(trst_pad_i) update_ir<=#1 1'b0; else if (tms_reset) update_ir<=#1 1'b0; else if(tms_pad_i & (exit1_ir | exit2_ir)) update_ir<=#1 1'b1; else update_ir<=#1 1'b0;end/*********************************************************************************** ** End: TAP State Machine ** ***********************************************************************************//*********************************************************************************** ** jtag_ir: JTAG Instruction Register ** ***********************************************************************************/reg [`IR_LENGTH-1:0] jtag_ir; // Instruction registerreg [`IR_LENGTH-1:0] latched_jtag_ir, latched_jtag_ir_neg;reg instruction_tdo;always @ (posedge tck_pad_i or posedge trst_pad_i)begin if(trst_pad_i) jtag_ir[`IR_LENGTH-1:0] <= #1 `IR_LENGTH'b0; else if(capture_ir) jtag_ir <= #1 4'b0101; // This value is fixed for easier fault detection else if(shift_ir) jtag_ir[`IR_LENGTH-1:0] <= #1 {tdi_pad_i, jtag_ir[`IR_LENGTH-1:1]};endalways @ (negedge tck_pad_i)begin instruction_tdo <= #1 jtag_ir[0];end/*********************************************************************************** ** End: jtag_ir ** ***********************************************************************************//*********************************************************************************** ** idcode logic ** ***********************************************************************************/reg [31:0] idcode_reg;reg idcode_tdo;always @ (posedge tck_pad_i)begin if(idcode_select & shift_dr) idcode_reg <= #1 {tdi_pad_i, idcode_reg[31:1]}; else idcode_reg <= #1 `IDCODE_VALUE;endalways @ (negedge tck_pad_i)begin idcode_tdo <= #1 idcode_reg;end/*********************************************************************************** ** End: idcode logic ** ***********************************************************************************//*********************************************************************************** ** Bypass logic ** ***********************************************************************************/reg bypassed_tdo;reg bypass_reg;always @ (posedge tck_pad_i or posedge trst_pad_i)begin if (trst_pad_i) bypass_reg<=#1 1'b0; else if(shift_dr) bypass_reg<=#1 tdi_pad_i;endalways @ (negedge tck_pad_i)begin bypassed_tdo <=#1 bypass_reg;end/*********************************************************************************** ** End: Bypass logic ** ***********************************************************************************//*********************************************************************************** ** Activating Instructions ** ***********************************************************************************/// Updating jtag_ir (Instruction Register)always @ (posedge tck_pad_i or posedge trst_pad_i)begin if(trst_pad_i) latched_jtag_ir <=#1 `IDCODE; // IDCODE selected after reset else if (tms_reset) latched_jtag_ir <=#1 `IDCODE; // IDCODE selected after reset else if(update_ir) latched_jtag_ir <=#1 jtag_ir;end/*********************************************************************************** ** End: Activating Instructions ** ***********************************************************************************/// Updating jtag_ir (Instruction Register)always @ (latched_jtag_ir)begin extest_select = 1'b0; sample_preload_select = 1'b0; idcode_select = 1'b0; mbist_select = 1'b0; debug_select = 1'b0; bypass_select = 1'b0; case(latched_jtag_ir) /* synthesis parallel_case */ `EXTEST: extest_select = 1'b1; // External test `SAMPLE_PRELOAD: sample_preload_select = 1'b1; // Sample preload `IDCODE: idcode_select = 1'b1; // ID Code `MBIST: mbist_select = 1'b1; // Mbist test `DEBUG: debug_select = 1'b1; // Debug `BYPASS: bypass_select = 1'b1; // BYPASS default: bypass_select = 1'b1; // BYPASS endcaseend/*********************************************************************************** ** Multiplexing TDO data ** ***********************************************************************************/always @ (shift_ir_neg or exit1_ir or instruction_tdo or latched_jtag_ir_neg or idcode_tdo or debug_tdi_i or bs_chain_tdi_i or mbist_tdi_i or bypassed_tdo)begin if(shift_ir_neg) tdo_pad_o = instruction_tdo; else begin case(latched_jtag_ir_neg) // synthesis parallel_case `IDCODE: tdo_pad_o = idcode_tdo; // Reading ID code `DEBUG: tdo_pad_o = debug_tdi_i; // Debug `SAMPLE_PRELOAD: tdo_pad_o = bs_chain_tdi_i; // Sampling/Preloading `EXTEST: tdo_pad_o = bs_chain_tdi_i; // External test `MBIST: tdo_pad_o = mbist_tdi_i; // Mbist test default: tdo_pad_o = bypassed_tdo; // BYPASS instruction endcase endend// Tristate control for tdo_pad_o pinalways @ (negedge tck_pad_i)begin tdo_padoe_o <= #1 shift_ir | shift_dr | (pause_dr & debug_select);end/*********************************************************************************** ** End: Multiplexing TDO data ** ***********************************************************************************/always @ (negedge tck_pad_i)begin shift_ir_neg <= #1 shift_ir; latched_jtag_ir_neg <= #1 latched_jtag_ir;endendmodule
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -