Estoy diseñando una unidad JTAG para un procesador. Para eso, inicialmente he diseñado un controlador TAP mirando el FSM del TAP. Ahora, me han dado este fragmento de código:
reg ['IR_LENGTH-1:0] jtag_ir; // Instruction register
reg ['IR_LENGTH-1:0] latched_jtag_ir; // latched_jtag_ir_neg;
wire instruction_tdo;
always @ (posedge tck_pad_i or negedge trstn_pad_i)
begin
if(trstn_pad_i == 0)
jtag_ir['IR_LENGTH-1:0] <= 'IR_LENGTH'b0;
else if (test_logic_reset == 1)
jtag_ir['IR_LENGTH-1:0] <= 'IR_LENGTH'b0;
else if(capture_ir)
jtag_ir <= 4'b0101; // This value is fixed for easier fault detection
else if(shift_ir)
jtag_ir['IR_LENGTH-1:0] <= {tdi_pad_i, jtag_ir['IR_LENGTH-1:1]};
end
assign instruction_tdo = jtag_ir[0]; // This is latched on a negative TCK edge after the output MUX
// Updating jtag_ir (Instruction Register)
// jtag_ir should be latched on FALLING EDGE of TCK when capture_ir == 1
always @ (posedge s_clk_neg or negedge trstn_pad_i)
begin
if(trstn_pad_i == 0)
latched_jtag_ir <= 'IDCODE; // IDCODE selected after reset
else if (test_logic_reset)
latched_jtag_ir <= 'IDCODE; // IDCODE selected after reset
else if(update_ir)
latched_jtag_ir <= jtag_ir;
end
s_clk es el reloj invertido
No puedo entender esta parte del código. En primer lugar, los comentarios en varios puntos leen que los datos deben estar enganchados en el borde negativo del ciclo. ¿No puedo entender cómo lo hace la declaración de asignación? Además, ¿por qué ha usado 2 ir- 1) JTAG_ir 2) latched_jtag_ir.
He pasado por varios módulos. Todos dicen que el IR contiene algunas celdas y debe diseñarse de acuerdo con el estándar IEEE 1159.4. ¿Algunos podrían decirme cuál es el propósito de los dos registros?