📄 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 state
always @ (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 state
always @ (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 state
always @ (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 state
always @ (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 state
always @ (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 state
always @ (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 state
always @ (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 state
always @ (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 state
always @ (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 register
reg [`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'b0000; // 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]};
end
always @ (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;
end
always @ (negedge tck_pad_i)
begin
idcode_tdo <= #1 idcode_reg;//idcode_tdo<=#1 idcode_reg[0];
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;
end
always @ (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
endcase
end
/**********************************************************************************
* *
* 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
end
end
// Tristate control for tdo_pad_o pin
always @ (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;
end
endmodule
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -