OpenCores
URL https://opencores.org/ocsvn/bustap-jtag/bustap-jtag/trunk

Subversion Repositories bustap-jtag

Compare Revisions

  • This comparison shows the changes necessary to convert path
    /bustap-jtag
    from Rev 15 to Rev 16
    Reverse comparison

Rev 15 → Rev 16

/tags/v2p2/rtl/up_monitor.v
0,0 → 1,219
//**************************************************************
// Module : up_monitor.v
// Platform : Windows xp sp2
// Simulator : Modelsim 6.5b
// Synthesizer : QuartusII 10.1 sp1
// Place and Route : QuartusII 10.1 sp1
// Targets device : Cyclone III
// Author : Bibo Yang (ash_riple@hotmail.com)
// Organization : www.opencores.org
// Revision : 2.2
// Date : 2012/03/28
// Description : Top level glue logic to group together
// the JTAG input and output modules.
//**************************************************************
 
`timescale 1ns/1ns
 
module up_monitor (
input clk,
input wr_en,rd_en,
input [15:2] addr_in,
input [31:0] data_in
);
 
/////////////////////////////////////////////////
// Registers and wires announcment
/////////////////////////////////////////////////
 
// for CPU bus signal buffer
reg wr_en_d1,rd_en_d1;
reg [15:2] addr_in_d1;
reg [31:0] data_in_d1;
// for capture address mask
wire [35:0] addr_mask0,addr_mask1,addr_mask2 ,addr_mask3 ,addr_mask4 ,addr_mask5 ,addr_mask6 ,addr_mask7 , // inclusive
addr_mask8,addr_mask9,addr_mask10,addr_mask11,addr_mask12,addr_mask13,addr_mask14,addr_mask15; // exclusive
wire [15:0] addr_mask_en = {addr_mask15[32],addr_mask14[32],addr_mask13[32],addr_mask12[32],
addr_mask11[32],addr_mask10[32],addr_mask9 [32],addr_mask8 [32],
addr_mask7 [32],addr_mask6 [32],addr_mask5 [32],addr_mask4 [32],
addr_mask3 [32],addr_mask2 [32],addr_mask1 [32],addr_mask0 [32]};
wire addr_wren = addr_mask15[35];
wire addr_rden = addr_mask15[34];
reg addr_mask_ok;
// for capture address+data trigger
wire [55:0] trig_cond;
wire trig_aden = trig_cond[55];
wire trig_daen = trig_cond[54];
wire trig_wren = trig_cond[51];
wire trig_rden = trig_cond[50];
wire trig_en = trig_cond[49];
wire trig_set = trig_cond[48];
wire [15:0] trig_addr = trig_cond[47:32];
wire [31:0] trig_data = trig_cond[31:0];
reg trig_cond_ok,trig_cond_ok_d1;
// for capture storage
wire [81:0] capture_in;
wire capture_wr;
// for pretrigger capture
wire [9:0] pretrig_num;
reg [9:0] pretrig_cnt;
wire pretrig_full;
wire pretrig_wr;
reg pretrig_wr_d1,pretrig_rd;
// for inter capture timer
reg [31:0] inter_cap_cnt;
 
/////////////////////////////////////////////////
// Capture logic main
/////////////////////////////////////////////////
 
// bus input pipeline, allowing back-to-back/continuous bus access
always @(posedge clk)
begin
wr_en_d1 <= wr_en;
rd_en_d1 <= rd_en;
addr_in_d1 <= addr_in;
data_in_d1 <= data_in;
end
 
// address range based capture enable
always @(posedge clk)
begin
if (((addr_in[15:2]<=addr_mask0[31:18] && addr_in[15:2]>=addr_mask0[15:2] && addr_mask_en[ 0]) ||
(addr_in[15:2]<=addr_mask1[31:18] && addr_in[15:2]>=addr_mask1[15:2] && addr_mask_en[ 1]) ||
(addr_in[15:2]<=addr_mask2[31:18] && addr_in[15:2]>=addr_mask2[15:2] && addr_mask_en[ 2]) ||
(addr_in[15:2]<=addr_mask3[31:18] && addr_in[15:2]>=addr_mask3[15:2] && addr_mask_en[ 3]) ||
(addr_in[15:2]<=addr_mask4[31:18] && addr_in[15:2]>=addr_mask4[15:2] && addr_mask_en[ 4]) ||
(addr_in[15:2]<=addr_mask5[31:18] && addr_in[15:2]>=addr_mask5[15:2] && addr_mask_en[ 5]) ||
(addr_in[15:2]<=addr_mask6[31:18] && addr_in[15:2]>=addr_mask6[15:2] && addr_mask_en[ 6]) ||
(addr_in[15:2]<=addr_mask7[31:18] && addr_in[15:2]>=addr_mask7[15:2] && addr_mask_en[ 7])
) //inclusive address range set with individual enable: addr_mask 0 - 7
&&
((addr_in[15:2]>addr_mask8 [31:18] || addr_in[15:2]<addr_mask8 [15:2] || !addr_mask_en[ 8]) &&
(addr_in[15:2]>addr_mask9 [31:18] || addr_in[15:2]<addr_mask9 [15:2] || !addr_mask_en[ 9]) &&
(addr_in[15:2]>addr_mask10[31:18] || addr_in[15:2]<addr_mask10[15:2] || !addr_mask_en[10]) &&
(addr_in[15:2]>addr_mask11[31:18] || addr_in[15:2]<addr_mask11[15:2] || !addr_mask_en[11]) &&
(addr_in[15:2]>addr_mask12[31:18] || addr_in[15:2]<addr_mask12[15:2] || !addr_mask_en[12]) &&
(addr_in[15:2]>addr_mask13[31:18] || addr_in[15:2]<addr_mask13[15:2] || !addr_mask_en[13]) &&
(addr_in[15:2]>addr_mask14[31:18] || addr_in[15:2]<addr_mask14[15:2] || !addr_mask_en[14]) &&
(addr_in[15:2]>addr_mask15[31:18] || addr_in[15:2]<addr_mask15[15:2] || !addr_mask_en[15])
) //exclusive address range set with individual enable: addr_mask 8 - 15
)
addr_mask_ok <= (addr_rden && rd_en) || (addr_wren && wr_en);
else
addr_mask_ok <= 0;
end
 
// address+data based capture trigger
always @(posedge clk)
begin
if (trig_en==0) begin // trigger not enabled, trigger gate forced open
trig_cond_ok <= 1;
trig_cond_ok_d1 <= 1;
end
else if (trig_set==0) begin // trigger enabled and trigger stopped, trigger gate forced close
trig_cond_ok <= 0;
trig_cond_ok_d1 <= 0;
end
else begin // trigger enabled and trigger started, trigger gate conditional open
if ((trig_aden? trig_addr[15:2]==addr_in[15:2]: 1) && (trig_daen? trig_data==data_in: 1) &&
(trig_wren? wr_en : 1) && (trig_rden? rd_en : 1) &&
(rd_en || wr_en))
trig_cond_ok <= 1;
trig_cond_ok_d1 <= trig_cond_ok;
end
// trigger gate kept open until trigger stoped
end
wire trig_cond_ok_pulse = trig_cond_ok & !trig_cond_ok_d1;
 
// generate capture wr_in
assign capture_in = {trig_cond_ok_pulse,wr_en_d1,inter_cap_cnt,addr_in_d1[15:2],2'b00,data_in_d1[31:0]};
assign capture_wr = trig_cond_ok_pulse || (addr_mask_ok && trig_cond_ok);
 
// generate pre-trigger wr_in
assign pretrig_full = (pretrig_cnt >= pretrig_num) || trig_cond_ok;
assign pretrig_wr = (!trig_en || (trig_en && !trig_set))? 1'b0 : (trig_cond_ok? 1'b0 : addr_mask_ok);
always @(posedge clk)
begin
if (!trig_en || (trig_en && !trig_set)) begin
pretrig_cnt <= 10'd0;
pretrig_wr_d1<= 1'b0;
pretrig_rd <= 1'b0;
end
else if (!pretrig_full) begin
pretrig_cnt <= pretrig_cnt + addr_mask_ok;
pretrig_wr_d1<= 1'b0;
pretrig_rd <= 1'b0;
end
else if (pretrig_full) begin
pretrig_cnt <= pretrig_cnt;
pretrig_wr_d1<= pretrig_wr;
pretrig_rd <= pretrig_wr_d1;
end
end
 
// generate interval counter
always @(posedge clk)
begin
if (capture_wr || pretrig_wr)
inter_cap_cnt <= 32'd0;
else if (inter_cap_cnt[31])
inter_cap_cnt <= 32'd3000000000;
else
inter_cap_cnt <= inter_cap_cnt + 32'd1;
end
 
/////////////////////////////////////////////////
// Instantiate vendor specific JTAG functions
/////////////////////////////////////////////////
 
// index 0, instantiate capture fifo, as output
virtual_jtag_adda_fifo u_virtual_jtag_adda_fifo (
.clk(clk),
.wr_in(capture_wr || pretrig_wr),
.data_in(capture_in),
.rd_in(pretrig_rd)
);
defparam
u_virtual_jtag_adda_fifo.data_width = 82,
u_virtual_jtag_adda_fifo.fifo_depth = 512,
u_virtual_jtag_adda_fifo.addr_width = 9,
u_virtual_jtag_adda_fifo.al_full_val = 511,
u_virtual_jtag_adda_fifo.al_empt_val = 0;
 
// index 1, instantiate capture mask, as input
virtual_jtag_addr_mask u_virtual_jtag_addr_mask (
// inclusive
.mask_out0(addr_mask0),
.mask_out1(addr_mask1),
.mask_out2(addr_mask2),
.mask_out3(addr_mask3),
.mask_out4(addr_mask4),
.mask_out5(addr_mask5),
.mask_out6(addr_mask6),
.mask_out7(addr_mask7),
// exclusive
.mask_out8(addr_mask8),
.mask_out9(addr_mask9),
.mask_out10(addr_mask10),
.mask_out11(addr_mask11),
.mask_out12(addr_mask12),
.mask_out13(addr_mask13),
.mask_out14(addr_mask14),
.mask_out15(addr_mask15)
);
defparam
u_virtual_jtag_addr_mask.mask_index = 4,
u_virtual_jtag_addr_mask.mask_enabl = 4,
u_virtual_jtag_addr_mask.addr_width = 32;
 
// index 2, instantiate capture trigger, as input
virtual_jtag_adda_trig u_virtual_jtag_adda_trig (
.trig_out(trig_cond),
.pnum_out(pretrig_num)
);
defparam
u_virtual_jtag_adda_trig.trig_width = 56,
u_virtual_jtag_adda_trig.pnum_width = 10;
 
endmodule
/tags/v2p2/rtl/up_monitor_wrapper.v
0,0 → 1,76
//**************************************************************
// Module : up_monitor_wrapper.v
// Platform : Windows xp sp2
// Simulator : Modelsim 6.5b
// Synthesizer : QuartusII 10.1 sp1
// Place and Route : QuartusII 10.1 sp1
// Targets device : Cyclone III
// Author : Bibo Yang (ash_riple@hotmail.com)
// Organization : www.opencores.org
// Revision : 2.2
// Date : 2012/03/28
// Description : Common CPU interface to pipelined access
// interface converter.
// @Note: Implementation dependent.
//**************************************************************
 
`timescale 1ns/1ns
 
module up_monitor_wrapper (up_clk,up_wbe,up_csn,up_addr,up_data_io);
 
// common CPU bus interface
input up_clk;
input up_wbe,up_csn; // negative logic
input [15:2] up_addr;
input [31:0] up_data_io;
 
// filter out glitches on the line with extra 4 clocks
reg up_wbe_d1, up_wbe_d2, up_wbe_d3, up_wbe_d4;
reg up_csn_d1, up_csn_d2, up_csn_d3, up_csn_d4;
always @(posedge up_clk) begin
up_wbe_d1 <= up_wbe;
up_wbe_d2 <= up_wbe_d1;
up_wbe_d3 <= up_wbe_d2;
up_wbe_d4 <= up_wbe_d3;
up_csn_d1 <= up_csn;
up_csn_d2 <= up_csn_d1;
up_csn_d3 <= up_csn_d2;
up_csn_d4 <= up_csn_d3;
end
reg wr_en_filtered, wr_en_filtered_d1;
always @(posedge up_clk) begin
// negative logic changed to positive logic, with filter
wr_en_filtered <= (!up_wbe_d2 & !up_wbe_d3 & !up_wbe_d4) & (!up_csn_d2 & !up_csn_d3 & !up_csn_d4);
wr_en_filtered_d1 <= wr_en_filtered;
end
reg rd_en_filtered, rd_en_filtered_d1;
always @(posedge up_clk) begin
// negative logic changed to positive logic, with filter
rd_en_filtered <= (up_wbe_d2 & up_wbe_d3 & up_wbe_d4) & (!up_csn_d2 & !up_csn_d3 & !up_csn_d4);
rd_en_filtered_d1 <= rd_en_filtered;
end
 
// latch the data at rising edge of up_csn(negative logic)
reg [15:2] up_addr_latch;
reg [31:0] up_data_latch;
always @(posedge up_csn) begin
up_addr_latch <= up_addr;
up_data_latch <= up_data_io;
end
 
// map to pipelined access interface
wire clk = up_clk;
wire wr_en = !wr_en_filtered & wr_en_filtered_d1; // falling edge of write_enable(positive logic)
wire rd_en = !rd_en_filtered & rd_en_filtered_d1; // falling edge of read_enable(positive logic)
wire [15:2] addr_in = up_addr_latch;
wire [31:0] data_in = up_data_latch;
 
up_monitor inst (
.clk(clk),
.wr_en(wr_en),
.rd_en(rd_en),
.addr_in(addr_in),
.data_in(data_in)
);
 
endmodule
/tags/v2p2/rtl/altera/virtual_jtag_addr_mask.v
0,0 → 1,178
//**************************************************************
// Module : virtual_jtag_addr_mask.v
// Platform : Windows xp sp2
// Simulator : Modelsim 6.5b
// Synthesizer : QuartusII 10.1 sp1
// Place and Route : QuartusII 10.1 sp1
// Targets device : Cyclone III
// Author : Bibo Yang (ash_riple@hotmail.com)
// Organization : www.opencores.org
// Revision : 2.2
// Date : 2012/03/28
// Description : addr mask input from debug host via
// Virtual JTAG.
//**************************************************************
 
`include "jtag_sim_define.h"
`timescale 1ns/1ns
 
module virtual_jtag_addr_mask(mask_out0 ,mask_out1 ,mask_out2 ,mask_out3 ,
mask_out4 ,mask_out5 ,mask_out6 ,mask_out7 ,
mask_out8 ,mask_out9 ,mask_out10,mask_out11,
mask_out12,mask_out13,mask_out14,mask_out15
);
 
parameter mask_index = 4, //2**mask_index=mask_num
mask_enabl = 4,
addr_width = 32;
 
output [mask_enabl+addr_width-1:0] mask_out0;
output [mask_enabl+addr_width-1:0] mask_out1;
output [mask_enabl+addr_width-1:0] mask_out2;
output [mask_enabl+addr_width-1:0] mask_out3;
output [mask_enabl+addr_width-1:0] mask_out4;
output [mask_enabl+addr_width-1:0] mask_out5;
output [mask_enabl+addr_width-1:0] mask_out6;
output [mask_enabl+addr_width-1:0] mask_out7;
output [mask_enabl+addr_width-1:0] mask_out8;
output [mask_enabl+addr_width-1:0] mask_out9;
output [mask_enabl+addr_width-1:0] mask_out10;
output [mask_enabl+addr_width-1:0] mask_out11;
output [mask_enabl+addr_width-1:0] mask_out12;
output [mask_enabl+addr_width-1:0] mask_out13;
output [mask_enabl+addr_width-1:0] mask_out14;
output [mask_enabl+addr_width-1:0] mask_out15;
 
reg [mask_enabl+addr_width-1:0] mask_out0;
reg [mask_enabl+addr_width-1:0] mask_out1;
reg [mask_enabl+addr_width-1:0] mask_out2;
reg [mask_enabl+addr_width-1:0] mask_out3;
reg [mask_enabl+addr_width-1:0] mask_out4;
reg [mask_enabl+addr_width-1:0] mask_out5;
reg [mask_enabl+addr_width-1:0] mask_out6;
reg [mask_enabl+addr_width-1:0] mask_out7;
reg [mask_enabl+addr_width-1:0] mask_out8;
reg [mask_enabl+addr_width-1:0] mask_out9;
reg [mask_enabl+addr_width-1:0] mask_out10;
reg [mask_enabl+addr_width-1:0] mask_out11;
reg [mask_enabl+addr_width-1:0] mask_out12;
reg [mask_enabl+addr_width-1:0] mask_out13;
reg [mask_enabl+addr_width-1:0] mask_out14;
reg [mask_enabl+addr_width-1:0] mask_out15;
 
wire tdi, tck, cdr, cir, e1dr, e2dr, pdr, sdr, udr, uir;
reg tdo;
reg [mask_index+mask_enabl+addr_width-1:0] mask_instr_reg;
reg bypass_reg;
 
wire [1:0] ir_in;
wire mask_instr = ~ir_in[1] & ir_in[0]; // 1
 
wire [mask_index-1 :0] mask_id = mask_instr_reg[(mask_index+mask_enabl+addr_width-1):(mask_enabl+addr_width)];
wire [mask_enabl+addr_width-1:0] mask_is = mask_instr_reg[ (mask_enabl+addr_width-1):0];
 
always @(posedge tck)
begin
if (mask_instr && e1dr)
case (mask_id)
4'd0 :
mask_out0 <= mask_is;
4'd1 :
mask_out1 <= mask_is;
4'd2 :
mask_out2 <= mask_is;
4'd3 :
mask_out3 <= mask_is;
4'd4 :
mask_out4 <= mask_is;
4'd5 :
mask_out5 <= mask_is;
4'd6 :
mask_out6 <= mask_is;
4'd7 :
mask_out7 <= mask_is;
4'd8 :
mask_out8 <= mask_is;
4'd9 :
mask_out9 <= mask_is;
4'd10 :
mask_out10 <= mask_is;
4'd11 :
mask_out11 <= mask_is;
4'd12 :
mask_out12 <= mask_is;
4'd13 :
mask_out13 <= mask_is;
4'd14 :
mask_out14 <= mask_is;
4'd15 :
mask_out15 <= mask_is;
endcase
end
 
/* mask_instr Instruction Handler */
always @ (posedge tck)
if ( mask_instr && cdr )
mask_instr_reg <= mask_instr_reg;
else if ( mask_instr && sdr )
mask_instr_reg <= {tdi, mask_instr_reg[mask_index+mask_enabl+addr_width-1:1]};
 
/* Bypass register */
always @ (posedge tck)
bypass_reg = tdi;
 
/* Node TDO Output */
always @ ( mask_instr, mask_instr_reg, bypass_reg )
begin
if (mask_instr)
tdo <= mask_instr_reg[0];
else
tdo <= bypass_reg;// Used to maintain the continuity of the scan chain.
end
 
sld_virtual_jtag sld_virtual_jtag_component (
.ir_in (ir_in),
.ir_out (2'b0),
.tdo (tdo),
.tdi (tdi),
.tms (),
.tck (tck),
.virtual_state_cir (cir),
.virtual_state_pdr (pdr),
.virtual_state_uir (uir),
.virtual_state_sdr (sdr),
.virtual_state_cdr (cdr),
.virtual_state_udr (udr),
.virtual_state_e1dr (e1dr),
.virtual_state_e2dr (e2dr),
.jtag_state_rti (),
.jtag_state_e1dr (),
.jtag_state_e2dr (),
.jtag_state_pir (),
.jtag_state_tlr (),
.jtag_state_sir (),
.jtag_state_cir (),
.jtag_state_uir (),
.jtag_state_pdr (),
.jtag_state_sdrs (),
.jtag_state_sdr (),
.jtag_state_cdr (),
.jtag_state_udr (),
.jtag_state_sirs (),
.jtag_state_e1ir (),
.jtag_state_e2ir ());
defparam
sld_virtual_jtag_component.sld_auto_instance_index = "NO",
sld_virtual_jtag_component.sld_instance_index = 1,
sld_virtual_jtag_component.sld_ir_width = 2,
`ifdef USE_SIM_STIMULUS
sld_virtual_jtag_component.sld_sim_action = `ADDR_SLD_SIM_ACTION,
sld_virtual_jtag_component.sld_sim_n_scan = `ADDR_SLD_SIM_N_SCAN,
sld_virtual_jtag_component.sld_sim_total_length = `ADDR_SLD_SIM_T_LENG;
`else
sld_virtual_jtag_component.sld_sim_action = "((1,1,1,2))",
sld_virtual_jtag_component.sld_sim_n_scan = 1,
sld_virtual_jtag_component.sld_sim_total_length = 2;
`endif
endmodule
/tags/v2p2/rtl/altera/virtual_jtag_adda_fifo.v
0,0 → 1,180
//**************************************************************
// Module : virtual_jtag_adda_fifo.v
// Platform : Windows xp sp2
// Simulator : Modelsim 6.5b
// Synthesizer : QuartusII 10.1 sp1
// Place and Route : QuartusII 10.1 sp1
// Targets device : Cyclone III
// Author : Bibo Yang (ash_riple@hotmail.com)
// Organization : www.opencores.org
// Revision : 2.2
// Date : 2012/03/28
// Description : addr/data capture output to debug host
// via Virtual JTAG.
//**************************************************************
 
`include "jtag_sim_define.h"
`timescale 1ns/1ns
 
module virtual_jtag_adda_fifo(clk,wr_in,data_in,rd_in);
 
parameter data_width = 32,
fifo_depth = 256,
addr_width = 8,
al_full_val = 255,
al_empt_val = 0;
 
input clk;
input wr_in, rd_in;
input [data_width-1:0] data_in;
 
wire tdi, tck, cdr, cir, e1dr, e2dr, pdr, sdr, udr, uir;
reg tdo;
reg [addr_width-1:0] usedw_instr_reg;
reg reset_instr_reg;
reg [data_width-1:0] read_instr_reg;
reg bypass_reg;
 
wire [1:0] ir_in;
wire usedw_instr = ~ir_in[1] & ir_in[0]; // 1
wire reset_instr = ir_in[1] & ~ir_in[0]; // 2
wire read_instr = ir_in[1] & ir_in[0]; // 3
 
wire reset = reset_instr && e1dr;
 
wire [addr_width-1:0] usedw;
wire [data_width-1:0] data_out;
wire full;
wire al_full;
 
reg read_instr_d1;
reg read_instr_d2;
reg read_instr_d3;
wire rd_en = rd_in | (read_instr_d2 & !read_instr_d3);
wire wr_en = wr_in;
always @(posedge clk or posedge reset)
begin
if (reset)
begin
read_instr_d1 <= 1'b0;
read_instr_d2 <= 1'b0;
read_instr_d3 <= 1'b0;
end
else
begin
read_instr_d1 <= read_instr;
read_instr_d2 <= read_instr_d1;
read_instr_d3 <= read_instr_d2;
end
end
 
scfifo jtag_fifo (
.aclr (reset),
.clock (clk),
.wrreq (wr_en & !al_full),
.data (data_in),
.rdreq (rd_en),
.q (data_out),
.full (full),
.almost_full (al_full),
.empty (),
.almost_empty (),
.usedw (usedw),
.sclr ());
defparam
jtag_fifo.lpm_width = data_width,
jtag_fifo.lpm_numwords = fifo_depth,
jtag_fifo.lpm_widthu = addr_width,
jtag_fifo.intended_device_family = "Cyclone III",
jtag_fifo.almost_full_value = al_full_val,
jtag_fifo.almost_empty_value = al_empt_val,
jtag_fifo.lpm_type = "scfifo",
jtag_fifo.lpm_showahead = "OFF",
jtag_fifo.overflow_checking = "ON",
jtag_fifo.underflow_checking = "ON",
jtag_fifo.use_eab = "ON",
jtag_fifo.add_ram_output_register = "ON";
 
/* usedw_instr Instruction Handler */
always @ (posedge tck)
if ( usedw_instr && cdr )
usedw_instr_reg <= usedw;
else if ( usedw_instr && sdr )
usedw_instr_reg <= {tdi, usedw_instr_reg[addr_width-1:1]};
 
/* reset_instr Instruction Handler */
always @ (posedge tck)
if ( reset_instr && sdr )
reset_instr_reg <= tdi;//{tdi, reset_instr_reg[data_width-1:1]};
 
/* read_instr Instruction Handler */
always @ (posedge tck)
if ( read_instr && cdr )
read_instr_reg <= data_out;
else if ( read_instr && sdr )
read_instr_reg <= {tdi, read_instr_reg[data_width-1:1]};
 
/* Bypass register */
always @ (posedge tck)
bypass_reg = tdi;
 
/* Node TDO Output */
always @ ( usedw_instr, reset_instr, read_instr, usedw_instr_reg[0], reset_instr_reg/*[0]*/, read_instr_reg[0], bypass_reg )
begin
if (usedw_instr)
tdo <= usedw_instr_reg[0];
else if (reset_instr)
tdo <= reset_instr_reg/*[0]*/;
else if (read_instr)
tdo <= read_instr_reg[0];
else
tdo <= bypass_reg; // Used to maintain the continuity of the scan chain.
end
 
sld_virtual_jtag sld_virtual_jtag_component (
.ir_in (ir_in),
.ir_out (2'b0),
.tdo (tdo),
.tdi (tdi),
.tms (),
.tck (tck),
.virtual_state_cir (cir),
.virtual_state_pdr (pdr),
.virtual_state_uir (uir),
.virtual_state_sdr (sdr),
.virtual_state_cdr (cdr),
.virtual_state_udr (udr),
.virtual_state_e1dr (e1dr),
.virtual_state_e2dr (e2dr),
.jtag_state_rti (),
.jtag_state_e1dr (),
.jtag_state_e2dr (),
.jtag_state_pir (),
.jtag_state_tlr (),
.jtag_state_sir (),
.jtag_state_cir (),
.jtag_state_uir (),
.jtag_state_pdr (),
.jtag_state_sdrs (),
.jtag_state_sdr (),
.jtag_state_cdr (),
.jtag_state_udr (),
.jtag_state_sirs (),
.jtag_state_e1ir (),
.jtag_state_e2ir ());
defparam
sld_virtual_jtag_component.sld_auto_instance_index = "NO",
sld_virtual_jtag_component.sld_instance_index = 0,
sld_virtual_jtag_component.sld_ir_width = 2,
`ifdef USE_SIM_STIMULUS
sld_virtual_jtag_component.sld_sim_action = `FIFO_SLD_SIM_ACTION,
sld_virtual_jtag_component.sld_sim_n_scan = `FIFO_SLD_SIM_N_SCAN,
sld_virtual_jtag_component.sld_sim_total_length = `FIFO_SLD_SIM_T_LENG;
`else
sld_virtual_jtag_component.sld_sim_action = "((1,1,1,2))",
sld_virtual_jtag_component.sld_sim_n_scan = 1,
sld_virtual_jtag_component.sld_sim_total_length = 2;
`endif
endmodule
/tags/v2p2/rtl/altera/virtual_jtag_adda_trig.v
0,0 → 1,126
//**************************************************************
// Module : virtual_jtag_adda_trig.v
// Platform : Windows xp sp2
// Simulator : Modelsim 6.5b
// Synthesizer : QuartusII 10.1 sp1
// Place and Route : QuartusII 10.1 sp1
// Targets device : Cyclone III
// Author : Bibo Yang (ash_riple@hotmail.com)
// Organization : www.opencores.org
// Revision : 2.2
// Date : 2012/03/28
// Description : addr/data trigger input from debug host
// via Virtual JTAG.
//**************************************************************
 
`include "jtag_sim_define.h"
`timescale 1ns/1ns
 
module virtual_jtag_adda_trig(trig_out, pnum_out);
 
parameter trig_width = 32;
parameter pnum_width = 10;
 
output [trig_width-1:0] trig_out;
output [pnum_width-1:0] pnum_out;
 
reg [trig_width-1:0] trig_out;
reg [pnum_width-1:0] pnum_out;
 
wire tdi, tck, cdr, cir, e1dr, e2dr, pdr, sdr, udr, uir;
reg tdo;
reg [trig_width-1:0] trig_instr_reg;
reg [pnum_width-1:0] pnum_instr_reg;
reg bypass_reg;
 
wire [1:0] ir_in;
wire trig_instr = ~ir_in[1] & ir_in[0]; // 1
wire pnum_instr = ir_in[1] & ~ir_in[0]; // 2
 
always @(posedge tck)
begin
if (trig_instr && e1dr)
trig_out <= trig_instr_reg;
end
 
always @(posedge tck)
begin
if (pnum_instr && e1dr)
pnum_out <= pnum_instr_reg;
end
 
/* trig_instr Instruction Handler */
always @ (posedge tck)
if ( trig_instr && cdr )
trig_instr_reg <= trig_instr_reg;
else if ( trig_instr && sdr )
trig_instr_reg <= {tdi, trig_instr_reg[trig_width-1:1]};
 
/* pnum_instr Instruction Handler */
always @ (posedge tck)
if ( pnum_instr && cdr )
pnum_instr_reg <= pnum_instr_reg;
else if ( pnum_instr && sdr )
pnum_instr_reg <= {tdi, pnum_instr_reg[pnum_width-1:1]};
 
/* Bypass register */
always @ (posedge tck)
bypass_reg <= tdi;
 
/* Node TDO Output */
always @ ( trig_instr, trig_instr_reg, pnum_instr, pnum_instr_reg, bypass_reg )
begin
if (trig_instr)
tdo <= trig_instr_reg[0];
else if (pnum_instr)
tdo <= pnum_instr_reg[0];
else
tdo <= bypass_reg;// Used to maintain the continuity of the scan chain.
end
 
sld_virtual_jtag sld_virtual_jtag_component (
.ir_in (ir_in),
.ir_out (2'b0),
.tdo (tdo),
.tdi (tdi),
.tms (),
.tck (tck),
.virtual_state_cir (cir),
.virtual_state_pdr (pdr),
.virtual_state_uir (uir),
.virtual_state_sdr (sdr),
.virtual_state_cdr (cdr),
.virtual_state_udr (udr),
.virtual_state_e1dr (e1dr),
.virtual_state_e2dr (e2dr),
.jtag_state_rti (),
.jtag_state_e1dr (),
.jtag_state_e2dr (),
.jtag_state_pir (),
.jtag_state_tlr (),
.jtag_state_sir (),
.jtag_state_cir (),
.jtag_state_uir (),
.jtag_state_pdr (),
.jtag_state_sdrs (),
.jtag_state_sdr (),
.jtag_state_cdr (),
.jtag_state_udr (),
.jtag_state_sirs (),
.jtag_state_e1ir (),
.jtag_state_e2ir ());
defparam
sld_virtual_jtag_component.sld_auto_instance_index = "NO",
sld_virtual_jtag_component.sld_instance_index = 2,
sld_virtual_jtag_component.sld_ir_width = 2,
`ifdef USE_SIM_STIMULUS
sld_virtual_jtag_component.sld_sim_action = `TRIG_SLD_SIM_ACTION,
sld_virtual_jtag_component.sld_sim_n_scan = `TRIG_SLD_SIM_N_SCAN,
sld_virtual_jtag_component.sld_sim_total_length = `TRIG_SLD_SIM_T_LENG;
`else
sld_virtual_jtag_component.sld_sim_action = "((1,1,1,2))",
sld_virtual_jtag_component.sld_sim_n_scan = 1,
sld_virtual_jtag_component.sld_sim_total_length = 2;
`endif
endmodule
/tags/v2p2/rtl/altera/jtag_sim_define.h
0,0 → 1,16
`define USE_SIM_STIMULUS
 
`define FIFO_SLD_SIM_ACTION "((1,1,1,2))"
`define FIFO_SLD_SIM_N_SCAN 1
`define FIFO_SLD_SIM_T_LENG 2
 
`define ADDR_SLD_SIM_ACTION "((1,1,1,2))"
`define ADDR_SLD_SIM_N_SCAN 1
`define ADDR_SLD_SIM_T_LENG 2
 
`define TRIG_SLD_SIM_ACTION "((1,1,1,2))"
`define TRIG_SLD_SIM_N_SCAN 1
`define TRIG_SLD_SIM_T_LENG 2
 
 
 
/tags/v2p2/cmd/altera/virtual_jtag_console.tcl
0,0 → 1,444
##**************************************************************
## Module : virtual_jtag_console.tcl
## Platform : Windows xp sp2
## Author : Bibo Yang (ash_riple@hotmail.com)
## Organization : www.opencores.org
## Revision : 2.2
## Date : 2012/03/28
## Description : Tcl/Tk GUI for the up_monitor
##**************************************************************
 
proc reset_fifo {{jtag_index_0 0}} {
device_lock -timeout 5
device_virtual_ir_shift -instance_index $jtag_index_0 -ir_value 2 -no_captured_ir_value
device_virtual_dr_shift -instance_index $jtag_index_0 -length 32 -dr_value 00000000 -value_in_hex -no_captured_dr_value
device_unlock
return 0
}
 
proc query_usedw {{jtag_index_0 0}} {
global fifoUsedw
device_lock -timeout 5
device_virtual_ir_shift -instance_index $jtag_index_0 -ir_value 1 -no_captured_ir_value
set usedw [device_virtual_dr_shift -instance_index $jtag_index_0 -length 9 -value_in_hex]
device_unlock
set tmp 0x
append tmp $usedw
set usedw [format "%i" $tmp]
set fifoUsedw $usedw
return $usedw
}
 
proc read_fifo {{jtag_index_0 0}} {
device_lock -timeout 5
device_virtual_ir_shift -instance_index $jtag_index_0 -ir_value 1 -no_captured_ir_value
device_virtual_ir_shift -instance_index $jtag_index_0 -ir_value 3 -no_captured_ir_value
set fifo_data [device_virtual_dr_shift -instance_index $jtag_index_0 -length 82 -value_in_hex]
device_unlock
return $fifo_data
}
 
proc config_addr {{jtag_index_1 1} {mask 0100000000} {mask_id 1}} {
global log
set mask_leng [string length $mask]
if {$mask_leng!=10} {
$log insert end "\nError: Wrong address mask length @$mask_id: [expr $mask_leng-2]. Expects: 8.\n"
 
} else {
device_lock -timeout 5
device_virtual_ir_shift -instance_index $jtag_index_1 -ir_value 1 -no_captured_ir_value
set addr_mask [device_virtual_dr_shift -instance_index $jtag_index_1 -dr_value $mask -length 40 -value_in_hex]
device_unlock
return $addr_mask
}
}
 
proc config_trig {{jtag_index_2 2} {trig 00000000000000} {pnum 000}} {
global log
set trig_leng [string length $trig]
if {$trig_leng!=14} {
$log insert end "\nError: Wrong trigger condition length: [expr $trig_leng-2]. Expects: 4+8.\n"
} else {
device_lock -timeout 5
device_virtual_ir_shift -instance_index $jtag_index_2 -ir_value 1 -no_captured_ir_value
set addr_trig [device_virtual_dr_shift -instance_index $jtag_index_2 -dr_value $trig -length 56 -value_in_hex]
device_unlock
}
if {[format "%d" 0x$pnum]>=511} {
$log insert end "\nError: Wrong trigger pre-capture value: [format "%d" 0x$pnum]. Expects: 0~510.\n"
} else {
device_lock -timeout 5
device_virtual_ir_shift -instance_index $jtag_index_2 -ir_value 2 -no_captured_ir_value
set pnum_trig [device_virtual_dr_shift -instance_index $jtag_index_2 -dr_value $pnum -length 10 -value_in_hex]
device_unlock
}
return $addr_trig
}
 
proc open_jtag_device {{test_cable "USB-Blaster [USB-0]"} {test_device "@2: EP2SGX90 (0x020E30DD)"}} {
open_device -hardware_name $test_cable -device_name $test_device
# Retrieve device id code.
device_lock -timeout 5
device_ir_shift -ir_value 6 -no_captured_ir_value
set idcode "0x[device_dr_shift -length 32 -value_in_hex]"
device_unlock
return $idcode
}
 
proc close_jtag_device {} {
close_device
}
 
proc scan_chain {} {
global log
$log insert end "JTAG Chain Scanning report:\n"
$log insert end "****************************************\n"
set blaster_cables [get_hardware_names]
set cable_num 0
foreach blaster_cable $blaster_cables {
incr cable_num
$log insert end "@$cable_num: $blaster_cable\n"
}
$log insert end "\n****************************************\n"
global device_list
set device_list ""
foreach blaster_cable $blaster_cables {
$log insert end "$blaster_cable:\n"
lappend device_list $blaster_cable
if [catch {get_device_names -hardware_name $blaster_cable} error_msg] {
$log insert end $error_msg
lappend device_list $error_msg
} else {
foreach test_device [get_device_names -hardware_name $blaster_cable] {
$log insert end "$test_device\n"
}
lappend device_list [get_device_names -hardware_name $blaster_cable]
}
}
}
 
proc select_device {{cableNum 1} {deviceNum 1}} {
global log
global device_list
$log insert end "\n****************************************\n"
set test_cable [lindex $device_list [expr 2*$cableNum-2]]
$log insert end "Selected Cable : $test_cable\n"
set test_device [lindex [lindex $device_list [expr 2*$cableNum-1]] [expr $deviceNum-1]]
$log insert end "Selected Device: $test_device\n"
set jtagIdCode [open_jtag_device $test_cable $test_device]
$log insert end "Device ID code : $jtagIdCode\n"
reset_fifo 0
query_usedw 0
}
 
proc updateAddrConfig {} {
global address_span1
global address_span2
global address_span3
global address_span4
global address_span5
global address_span6
global address_span7
global address_span8
global address_span9
global address_span10
global address_span11
global address_span12
global address_span13
global address_span14
global address_span15
global address_span16
global address_span_en1
global address_span_en2
global address_span_en3
global address_span_en4
global address_span_en5
global address_span_en6
global address_span_en7
global address_span_en8
global address_span_en9
global address_span_en10
global address_span_en11
global address_span_en12
global address_span_en13
global address_span_en14
global address_span_en15
global address_span_en16
global addr_wren
global addr_rden
for {set i 1} {$i<=16} {incr i} {
set mask [format "%1X" [expr $i-1]]
append mask [format "%1X" [expr $addr_wren*8+$addr_rden*4+[set address_span_en$i]]]
append mask [set address_span$i]
config_addr 1 $mask $i
}
}
 
proc initAddrConfig {} {
global log
global address_span1
global address_span2
global address_span3
global address_span4
global address_span5
global address_span6
global address_span7
global address_span8
global address_span9
global address_span10
global address_span11
global address_span12
global address_span13
global address_span14
global address_span15
global address_span16
for {set i 1} {$i<=8} {incr i} {
if {[set address_span$i]==""} {
set address_span$i ffff0000
}
}
for {set i 9} {$i<=16} {incr i} {
if {[set address_span$i]==""} {
set address_span$i 00000000
}
}
}
 
proc initTrigConfig {} {
global triggerAddr
global triggerData
global triggerPnum
if {[set triggerAddr]==""} {
set triggerAddr ffff
}
if {[set triggerData]==""} {
set triggerData a5a5a5a5
}
if {[set triggerPnum]==""} {
set triggerPnum 0
}
}
 
proc updateTrigger {{trigCmd 0}} {
global triggerAddr
global triggerData
global triggerPnum
global trig_wren
global trig_rden
global trig_aden
global trig_daen
set triggerValue [format "%1X" [expr $trig_aden*8+$trig_daen*4+0]]
append triggerValue [format "%1X" [expr $trig_wren*8+$trig_rden*4+$trigCmd]]
append triggerValue $triggerAddr
append triggerValue $triggerData
config_trig 2 $triggerValue [format "%03X" $triggerPnum]
}
 
proc startTrigger {} {
global trig_wren
global trig_rden
global trig_aden
global trig_daen
set trigEnable [expr $trig_wren+$trig_rden+$trig_aden+$trig_daen]
if {$trigEnable>0} {
updateTrigger 2
reset_fifo 0
query_usedw 0
updateTrigger 3
} else {
updateTrigger 0
}
}
 
proc reset_fifo_ptr {} {
reset_fifo 0
query_usedw 0
}
 
proc query_fifo_usedw {} {
query_usedw 0
}
 
proc read_fifo_content {} {
global log
global fifoUsedw
$log insert end "\n****************************************\n"
for {set i 0} {$i<$fifoUsedw} {incr i} {
set fifoContent [read_fifo 0]
set ok_trig [expr [format "%d" 0x[string index $fifoContent 0]]/2]
set wr_cptr [expr [format "%d" 0x[string index $fifoContent 0]]%2]
set tm_cptr [format "%d" 0x[string range $fifoContent 1 8]]
set ad_cptr [string range $fifoContent 9 12]
set da_cptr [string range $fifoContent 13 20]
if $ok_trig {
$log insert end "@@@@@@@@@@@@@@@@@@@@\n"
}
if $wr_cptr {
$log insert end "wr $ad_cptr $da_cptr @$tm_cptr\n"
} else {
$log insert end "rd $ad_cptr $da_cptr @$tm_cptr\n"
}
}
query_usedw 0
}
 
proc clear_log {} {
global log
$log delete insert end
}
 
proc quit {} {
global exit_console
destroy .console
set exit_console 1
}
 
# set the QuartusII special Tk command
init_tk
set exit_console 0
 
# set the main window
toplevel .console
wm title .console "www.OpenCores.org: uP Transaction Monitor"
pack propagate .console true
 
# set the www.OpenCores.org logo
frame .console.fig -bg white
pack .console.fig -expand true -fill both
image create photo logo -format gif -file "../common/OpenCores.gif"
label .console.fig.logo -image logo -bg white
pack .console.fig.logo
 
# set the JTAG utility
frame .console.jtag -relief groove -borderwidth 5
pack .console.jtag
button .console.jtag.scan -text {Scan JTAG Chain} -command {scan_chain}
button .console.jtag.select -text {Select JTAG Device :} -command {select_device $cableNum $deviceNum}
button .console.jtag.deselect -text {DeSelect JTAG Device} -command {close_jtag_device}
label .console.jtag.cable -text {Cable @}
label .console.jtag.devic -text {Device @}
entry .console.jtag.cable_num -textvariable cableNum -width 5
entry .console.jtag.devic_num -textvariable deviceNum -width 5
pack .console.jtag.scan .console.jtag.select \
.console.jtag.cable .console.jtag.cable_num \
.console.jtag.devic .console.jtag.devic_num \
.console.jtag.deselect \
-side left -ipadx 0
 
# set the inclusive address entries
frame .console.f1 -relief groove -borderwidth 5
pack .console.f1
label .console.f1.incl_addr -text {Inclusive Addr:}
entry .console.f1.address_span1 -textvariable address_span1 -width 8
entry .console.f1.address_span2 -textvariable address_span2 -width 8
entry .console.f1.address_span3 -textvariable address_span3 -width 8
entry .console.f1.address_span4 -textvariable address_span4 -width 8
entry .console.f1.address_span5 -textvariable address_span5 -width 8
entry .console.f1.address_span6 -textvariable address_span6 -width 8
entry .console.f1.address_span7 -textvariable address_span7 -width 8
entry .console.f1.address_span8 -textvariable address_span8 -width 8
checkbutton .console.f1.address_span_en1 -variable address_span_en1
checkbutton .console.f1.address_span_en2 -variable address_span_en2
checkbutton .console.f1.address_span_en3 -variable address_span_en3
checkbutton .console.f1.address_span_en4 -variable address_span_en4
checkbutton .console.f1.address_span_en5 -variable address_span_en5
checkbutton .console.f1.address_span_en6 -variable address_span_en6
checkbutton .console.f1.address_span_en7 -variable address_span_en7
checkbutton .console.f1.address_span_en8 -variable address_span_en8
pack .console.f1.incl_addr \
.console.f1.address_span_en1 .console.f1.address_span1 \
.console.f1.address_span_en2 .console.f1.address_span2 \
.console.f1.address_span_en3 .console.f1.address_span3 \
.console.f1.address_span_en4 .console.f1.address_span4 \
.console.f1.address_span_en5 .console.f1.address_span5 \
.console.f1.address_span_en6 .console.f1.address_span6 \
.console.f1.address_span_en7 .console.f1.address_span7 \
.console.f1.address_span_en8 .console.f1.address_span8 \
-side left -ipadx 0
 
# set the exclusive address entries
frame .console.f2 -relief groove -borderwidth 5
pack .console.f2
label .console.f2.excl_addr -text {Exclusive Addr:}
entry .console.f2.address_span9 -textvariable address_span9 -width 8
entry .console.f2.address_span10 -textvariable address_span10 -width 8
entry .console.f2.address_span11 -textvariable address_span11 -width 8
entry .console.f2.address_span12 -textvariable address_span12 -width 8
entry .console.f2.address_span13 -textvariable address_span13 -width 8
entry .console.f2.address_span14 -textvariable address_span14 -width 8
entry .console.f2.address_span15 -textvariable address_span15 -width 8
entry .console.f2.address_span16 -textvariable address_span16 -width 8
checkbutton .console.f2.address_span_en9 -variable address_span_en9
checkbutton .console.f2.address_span_en10 -variable address_span_en10
checkbutton .console.f2.address_span_en11 -variable address_span_en11
checkbutton .console.f2.address_span_en12 -variable address_span_en12
checkbutton .console.f2.address_span_en13 -variable address_span_en13
checkbutton .console.f2.address_span_en14 -variable address_span_en14
checkbutton .console.f2.address_span_en15 -variable address_span_en15
checkbutton .console.f2.address_span_en16 -variable address_span_en16
pack .console.f2.excl_addr \
.console.f2.address_span_en9 .console.f2.address_span9 \
.console.f2.address_span_en10 .console.f2.address_span10 \
.console.f2.address_span_en11 .console.f2.address_span11 \
.console.f2.address_span_en12 .console.f2.address_span12 \
.console.f2.address_span_en13 .console.f2.address_span13 \
.console.f2.address_span_en14 .console.f2.address_span14 \
.console.f2.address_span_en15 .console.f2.address_span15 \
.console.f2.address_span_en16 .console.f2.address_span16 \
-side left -ipadx 0
initAddrConfig
 
# set the address configuration buttons
frame .console.addr_cnfg -relief groove -borderwidth 5
pack .console.addr_cnfg
checkbutton .console.addr_cnfg.wren -text {WR} -variable addr_wren
checkbutton .console.addr_cnfg.rden -text {RD} -variable addr_rden
button .console.addr_cnfg.config -text {Apply Address Filter} -command {updateAddrConfig}
pack .console.addr_cnfg.wren .console.addr_cnfg.rden .console.addr_cnfg.config \
-side left -ipadx 0
 
# set the transaction trigger controls
frame .console.trig -relief groove -borderwidth 5
pack .console.trig
button .console.trig.starttrig -text {Apply Trigger Condition} -command {startTrigger}
entry .console.trig.trigvalue_addr -textvar triggerAddr -width 4
entry .console.trig.trigvalue_data -textvar triggerData -width 8
checkbutton .console.trig.trigaddr -text {@Addr:} -variable trig_aden
checkbutton .console.trig.trigdata -text {@Data:} -variable trig_daen
checkbutton .console.trig.wren -text {@WR} -variable trig_wren
checkbutton .console.trig.rden -text {@RD} -variable trig_rden
label .console.trig.pnum -text {Pre-Capture:}
entry .console.trig.trigvalue_pnum -textvar triggerPnum -width 4
pack .console.trig.pnum .console.trig.trigvalue_pnum \
.console.trig.wren .console.trig.rden \
.console.trig.trigaddr .console.trig.trigvalue_addr \
.console.trig.trigdata .console.trig.trigvalue_data \
.console.trig.starttrig \
-side left -ipadx 0
initTrigConfig
 
# set the control buttons
frame .console.fifo -relief groove -borderwidth 5
pack .console.fifo
button .console.fifo.reset -text {Reset FIFO} -command {reset_fifo_ptr}
button .console.fifo.loop -text {Query Used Word} -command {query_fifo_usedw}
label .console.fifo.usedw -textvariable fifoUsedw -relief sunken -width 4
button .console.fifo.read -text {Read FIFO} -command {read_fifo_content}
button .console.fifo.clear -text {Clear Log} -command {clear_log}
button .console.fifo.quit -text {Quit} -command {quit}
pack .console.fifo.reset .console.fifo.loop .console.fifo.usedw .console.fifo.read .console.fifo.clear .console.fifo.quit \
-side left -ipadx 0
 
# set the log window
frame .console.log -relief groove -borderwidth 5
set log [text .console.log.text -width 80 -height 25 \
-borderwidth 2 -relief sunken -setgrid true \
-yscrollcommand {.console.log.scroll set}]
scrollbar .console.log.scroll -command {.console.log.text yview}
pack .console.log.scroll -side right -fill y
pack .console.log.text -side left -fill both -expand true
pack .console.log -side top -fill both -expand true
 
# make the program wait for exit signal
vwait exit_console
 
/tags/v2p2/cmd/altera/virtual_jtag_console.bat
0,0 → 1,2
quartus_stp -t virtual_jtag_console.tcl
pause
/tags/v2p2/cmd/common/OpenCores.gif Cannot display: file marked as a binary type. svn:mime-type = application/octet-stream
tags/v2p2/cmd/common/OpenCores.gif Property changes : Added: svn:mime-type ## -0,0 +1 ## +application/octet-stream \ No newline at end of property Index: tags/v2p2/sim/up_monitor_tb.v =================================================================== --- tags/v2p2/sim/up_monitor_tb.v (nonexistent) +++ tags/v2p2/sim/up_monitor_tb.v (revision 16) @@ -0,0 +1,70 @@ +//************************************************************** +// Module : up_monitor_tb.v +// Platform : Windows xp sp2 +// Simulator : Modelsim 6.5b +// Synthesizer : +// Place and Route : +// Targets device : +// Author : Bibo Yang (ash_riple@hotmail.com) +// Organization : www.opencores.org +// Revision : 2.2 +// Date : 2012/03/28 +// Description : up_monitor testbench at both pin level +// and transaction level +//************************************************************** + +`timescale 1ns/1ns + +module up_monitor_tb (); + +reg cpu_start; +reg up_clk; +wire up_wbe, up_csn; +wire [15:2] up_addr; +wire [31:0] up_data_io; +initial begin + up_clk = 1'b0; + forever #5 up_clk = !up_clk; +end + +// pin level DUT +up_monitor_wrapper MON_LO ( + .up_clk(up_clk), + .up_wbe(), // negative logic + .up_csn(), // negative logic + .up_addr(), + .up_data_io() +); + +up_bfm_sv CPU ( + .up_clk(up_clk), + .up_wbe(up_wbe), // negative logic + .up_csn(up_csn), // negative logic + .up_addr(up_addr), + .up_data_io(up_data_io) +); + +reg_bfm_sv REG ( + .up_clk(up_clk), + .up_wbe(up_wbe), // negative logic + .up_csn(up_csn), // negative logic + .up_addr({up_addr,2'b00}), + .up_data_io(up_data_io) +); + +jtag_bfm_sv JTAG ( +); + +assign MON_LO.up_wbe = up_wbe; +assign MON_LO.up_csn = up_csn; +assign MON_LO.up_addr = up_addr; +assign MON_LO.up_data_io = up_data_io; + +initial begin + up_monitor_tb.CPU.up_start = 0; + @(posedge up_monitor_tb.JTAG.jtag_sim_done); + up_monitor_tb.CPU.up_start = 1; + #100000000 $stop; +end + +endmodule Index: tags/v2p2/sim/altera/virtual_jtag_stimulus.tcl =================================================================== --- tags/v2p2/sim/altera/virtual_jtag_stimulus.tcl (nonexistent) +++ tags/v2p2/sim/altera/virtual_jtag_stimulus.tcl (revision 16) @@ -0,0 +1,576 @@ +##************************************************************** +## Module : virtual_jtag_console.tcl +## Platform : Windows xp sp2 +## Author : Bibo Yang (ash_riple@hotmail.com) +## Organization : www.opencores.org +## Revision : 2.2 +## Date : 2012/03/28 +## Description : Tcl/Tk GUI for the simulation stimulus +##************************************************************** + +proc reset_fifo {{jtag_index_0 0}} { + #device_lock -timeout 5 + #device_virtual_ir_shift -instance_index $jtag_index_0 -ir_value 2 -no_captured_ir_value + #device_virtual_dr_shift -instance_index $jtag_index_0 -length 32 -dr_value 00000000 -value_in_hex -no_captured_dr_value + #device_unlock + global sim_started + if {$sim_started==0} { + global fifo_sim_act + global fifo_sim_num + global fifo_sim_len + append fifo_sim_act (0,1,2,[format "%X" 2]), + set fifo_sim_num [expr $fifo_sim_num+1] + set fifo_sim_len [expr $fifo_sim_len+2] + append fifo_sim_act (0,2,0,[format "%X" 32]), + set fifo_sim_num [expr $fifo_sim_num+1] + set fifo_sim_len [expr $fifo_sim_len+32] + } else { + force -freeze /up_monitor_tb/MON_LO/inst/u_virtual_jtag_adda_fifo/reset 1 -cancel 10ns + run 20ns + } + return 0 +} + +proc query_usedw {{jtag_index_0 0}} { + #global fifoUsedw + #device_lock -timeout 5 + #device_virtual_ir_shift -instance_index $jtag_index_0 -ir_value 1 -no_captured_ir_value + #set usedw [device_virtual_dr_shift -instance_index $jtag_index_0 -length 9 -value_in_hex] + #device_unlock + # set tmp 0x + # append tmp $usedw + # set usedw [format "%i" $tmp] + #set fifoUsedw $usedw + global sim_started + if {$sim_started==0} { + global fifo_sim_act + global fifo_sim_num + global fifo_sim_len + append fifo_sim_act (0,1,1,[format "%X" 2]), + set fifo_sim_num [expr $fifo_sim_num+1] + set fifo_sim_len [expr $fifo_sim_len+2] + append fifo_sim_act (0,2,0,[format "%X" 9]), + set fifo_sim_num [expr $fifo_sim_num+1] + set fifo_sim_len [expr $fifo_sim_len+9] + } else { + global fifoUsedw + set usedw [format "%i" 0x[examine /up_monitor_tb/MON_LO/inst/u_virtual_jtag_adda_fifo/usedw]] + set fifoUsedw $usedw + } + return 0 +} + +proc read_fifo {{jtag_index_0 0}} { + #device_lock -timeout 5 + #device_virtual_ir_shift -instance_index $jtag_index_0 -ir_value 1 -no_captured_ir_value + #device_virtual_ir_shift -instance_index $jtag_index_0 -ir_value 3 -no_captured_ir_value + #set fifo_data [device_virtual_dr_shift -instance_index $jtag_index_0 -length 82 -value_in_hex] + #device_unlock + global sim_started + if {$sim_started==0} { + global fifo_sim_act + global fifo_sim_num + global fifo_sim_len + append fifo_sim_act (0,1,1,[format "%X" 2]), + set fifo_sim_num [expr $fifo_sim_num+1] + set fifo_sim_len [expr $fifo_sim_len+2] + append fifo_sim_act (0,1,3,[format "%X" 2]), + set fifo_sim_num [expr $fifo_sim_num+1] + set fifo_sim_len [expr $fifo_sim_len+2] + append fifo_sim_act (0,2,0,[format "%X" 82]), + set fifo_sim_num [expr $fifo_sim_num+1] + set fifo_sim_len [expr $fifo_sim_len+82] + return 000000000000000000000 + } else { + force -freeze /up_monitor_tb/MON_LO/inst/u_virtual_jtag_adda_fifo/rd_en 1 -cancel 10ns + run 20ns + #after 10 + set fifo_data [examine /up_monitor_tb/MON_LO/inst/u_virtual_jtag_adda_fifo/data_out] + return $fifo_data + } +} + +proc config_addr {{jtag_index_1 1} {mask 0100000000} {mask_id 1}} { + global log + set mask_leng [string length $mask] + if {$mask_leng!=10} { + $log insert end "\nError: Wrong address mask length @$mask_id: [expr $mask_leng-2]. Expects: 8.\n" + + } else { + #device_lock -timeout 5 + #device_virtual_ir_shift -instance_index $jtag_index_1 -ir_value 1 -no_captured_ir_value + #set addr_mask [device_virtual_dr_shift -instance_index $jtag_index_1 -dr_value $mask -length 40 -value_in_hex] + #device_unlock + global addr_sim_act + global addr_sim_num + global addr_sim_len + append addr_sim_act (0,1,1,[format "%X" 2]), + set addr_sim_num [expr $addr_sim_num+1] + set addr_sim_len [expr $addr_sim_len+2] + append addr_sim_act (0,2,$mask,[format "%X" 40]), + set addr_sim_num [expr $addr_sim_num+1] + set addr_sim_len [expr $addr_sim_len+40] + return 0 + } +} + +proc config_trig {{jtag_index_2 2} {trig 00000000000000} {pnum 000}} { + global log + set trig_leng [string length $trig] + if {$trig_leng!=14} { + $log insert end "\nError: Wrong trigger condition length: [expr $trig_leng-2]. Expects: 4+8.\n" + } else { + #device_lock -timeout 5 + #device_virtual_ir_shift -instance_index $jtag_index_2 -ir_value 1 -no_captured_ir_value + #set addr_trig [device_virtual_dr_shift -instance_index $jtag_index_2 -dr_value $trig -length 56 -value_in_hex] + #device_virtual_ir_shift -instance_index $jtag_index_2 -ir_value 2 -no_captured_ir_value + #set addr_trig [device_virtual_dr_shift -instance_index $jtag_index_2 -dr_value $pnum -length 10 -value_in_hex] + #device_unlock + global trig_sim_act + global trig_sim_num + global trig_sim_len + append trig_sim_act (0,1,1,[format "%X" 2]), + set trig_sim_num [expr $trig_sim_num+1] + set trig_sim_len [expr $trig_sim_len+2] + append trig_sim_act (0,2,$trig,[format "%X" 56]), + set trig_sim_num [expr $trig_sim_num+1] + set trig_sim_len [expr $trig_sim_len+56] + append trig_sim_act (0,1,2,[format "%X" 2]), + set trig_sim_num [expr $trig_sim_num+1] + set trig_sim_len [expr $trig_sim_len+2] + append trig_sim_act (0,2,$pnum,[format "%X" 10]), + set trig_sim_num [expr $trig_sim_num+1] + set trig_sim_len [expr $trig_sim_len+10] + return 0 + } +} + +proc open_jtag_device {{test_cable "USB-Blaster [USB-0]"} {test_device "@2: EP2SGX90 (0x020E30DD)"}} { + open_device -hardware_name $test_cable -device_name $test_device + # Retrieve device id code. + device_lock -timeout 5 + device_ir_shift -ir_value 6 -no_captured_ir_value + set idcode "0x[device_dr_shift -length 32 -value_in_hex]" + device_unlock + return $idcode +} + +proc close_jtag_device {} { + close_device +} + +proc scan_chain {} { + global log + $log insert end "JTAG Chain Scanning report:\n" + $log insert end "****************************************\n" + set blaster_cables [get_hardware_names] + set cable_num 0 + foreach blaster_cable $blaster_cables { + incr cable_num + $log insert end "@$cable_num: $blaster_cable\n" + } + $log insert end "\n****************************************\n" + global device_list + set device_list "" + foreach blaster_cable $blaster_cables { + $log insert end "$blaster_cable:\n" + lappend device_list $blaster_cable + if [catch {get_device_names -hardware_name $blaster_cable} error_msg] { + $log insert end $error_msg + lappend device_list $error_msg + } else { + foreach test_device [get_device_names -hardware_name $blaster_cable] { + $log insert end "$test_device\n" + } + lappend device_list [get_device_names -hardware_name $blaster_cable] + } + } +} + +proc select_device {{cableNum 1} {deviceNum 1}} { + global log + global device_list + $log insert end "\n****************************************\n" + set test_cable [lindex $device_list [expr 2*$cableNum-2]] + $log insert end "Selected Cable : $test_cable\n" + set test_device [lindex [lindex $device_list [expr 2*$cableNum-1]] [expr $deviceNum-1]] + $log insert end "Selected Device: $test_device\n" + set jtagIdCode [open_jtag_device $test_cable $test_device] + $log insert end "Device ID code : $jtagIdCode\n" + reset_fifo 0 + query_usedw 0 +} + +proc updateAddrConfig {} { + global address_span1 + global address_span2 + global address_span3 + global address_span4 + global address_span5 + global address_span6 + global address_span7 + global address_span8 + global address_span9 + global address_span10 + global address_span11 + global address_span12 + global address_span13 + global address_span14 + global address_span15 + global address_span16 + global address_span_en1 + global address_span_en2 + global address_span_en3 + global address_span_en4 + global address_span_en5 + global address_span_en6 + global address_span_en7 + global address_span_en8 + global address_span_en9 + global address_span_en10 + global address_span_en11 + global address_span_en12 + global address_span_en13 + global address_span_en14 + global address_span_en15 + global address_span_en16 + global addr_wren + global addr_rden + for {set i 1} {$i<=16} {incr i} { + set mask [format "%1X" [expr $i-1]] + append mask [format "%1X" [expr $addr_wren*8+$addr_rden*4+[set address_span_en$i]]] + append mask [set address_span$i] + config_addr 1 $mask $i + } +} + +proc initAddrConfig {} { + global log + global address_span1 + global address_span2 + global address_span3 + global address_span4 + global address_span5 + global address_span6 + global address_span7 + global address_span8 + global address_span9 + global address_span10 + global address_span11 + global address_span12 + global address_span13 + global address_span14 + global address_span15 + global address_span16 + for {set i 1} {$i<=8} {incr i} { + if {[set address_span$i]==""} { + set address_span$i ffff0000 + } + } + for {set i 9} {$i<=16} {incr i} { + if {[set address_span$i]==""} { + set address_span$i 00000000 + } + } +} + +proc initTrigConfig {} { + global triggerAddr + global triggerData + global triggerPnum + if {[set triggerAddr]==""} { + set triggerAddr ffff + } + if {[set triggerData]==""} { + set triggerData a5a5a5a5 + } + if {[set triggerPnum]==""} { + set triggerPnum 0 + } +} + +proc updateTrigger {{trigCmd 0}} { + global triggerAddr + global triggerData + global triggerPnum + global trig_wren + global trig_rden + global trig_aden + global trig_daen + set triggerValue [format "%1X" [expr $trig_aden*8+$trig_daen*4+0]] + append triggerValue [format "%1X" [expr $trig_wren*8+$trig_rden*4+$trigCmd]] + append triggerValue $triggerAddr + append triggerValue $triggerData + config_trig 2 $triggerValue [format "%03X" $triggerPnum] +} + +proc startTrigger {} { + global trig_wren + global trig_rden + global trig_aden + global trig_daen + set trigEnable [expr $trig_wren+$trig_rden+$trig_aden+$trig_daen] + if {$trigEnable>0} { + updateTrigger 2 + reset_fifo 0 + query_usedw 0 + updateTrigger 3 + } else { + updateTrigger 0 + } +} + +proc reset_fifo_ptr {} { + reset_fifo 0 + query_usedw 0 +} + +proc query_fifo_usedw {} { + query_usedw 0 +} + +proc read_fifo_content {} { + global log + global fifoUsedw + $log insert end "\n****************************************\n" + for {set i 0} {$i<$fifoUsedw} {incr i} { + set fifoContent [read_fifo 0] + set ok_trig [expr [format "%d" 0x[string index $fifoContent 0]]/2] + set wr_cptr [expr [format "%d" 0x[string index $fifoContent 0]]%2] + set tm_cptr [format "%d" 0x[string range $fifoContent 1 8]] + set ad_cptr [string range $fifoContent 9 12] + set da_cptr [string range $fifoContent 13 20] + if $ok_trig { + $log insert end "@@@@@@@@@@@@@@@@@@@@\n" + } + if $wr_cptr { + $log insert end "wr $ad_cptr $da_cptr @$tm_cptr\n" + } else { + $log insert end "rd $ad_cptr $da_cptr @$tm_cptr\n" + } + } + query_usedw 0 +} + +proc reset_stimulus {} { + global fifo_sim_act + global fifo_sim_num + global fifo_sim_len + global addr_sim_act + global addr_sim_num + global addr_sim_len + global trig_sim_act + global trig_sim_num + global trig_sim_len + set fifo_sim_act \"( + set fifo_sim_num 0 + set fifo_sim_len 0 + set addr_sim_act \"( + set addr_sim_num 0 + set addr_sim_len 0 + set trig_sim_act \"( + set trig_sim_num 0 + set trig_sim_len 0 +} + +proc generate_stimulus {} { + global log + global fifo_sim_act + global fifo_sim_num + global fifo_sim_len + global addr_sim_act + global addr_sim_num + global addr_sim_len + global trig_sim_act + global trig_sim_num + global trig_sim_len + append fifo_sim_act (1,1,1,2))\" + set fifo_sim_num [expr $fifo_sim_num+1] + set fifo_sim_len [expr $fifo_sim_len+2] + append addr_sim_act (1,1,1,2))\" + set addr_sim_num [expr $addr_sim_num+1] + set addr_sim_len [expr $addr_sim_len+2] + append trig_sim_act (1,1,1,2))\" + set trig_sim_num [expr $trig_sim_num+1] + set trig_sim_len [expr $trig_sim_len+2] + $log delete 1.0 end + $log insert end "`define USE_SIM_STIMULUS\n\n" + $log insert end "`define FIFO_SLD_SIM_ACTION $fifo_sim_act\n" + $log insert end "`define FIFO_SLD_SIM_N_SCAN $fifo_sim_num\n" + $log insert end "`define FIFO_SLD_SIM_T_LENG $fifo_sim_len\n\n" + $log insert end "`define ADDR_SLD_SIM_ACTION $addr_sim_act\n" + $log insert end "`define ADDR_SLD_SIM_N_SCAN $addr_sim_num\n" + $log insert end "`define ADDR_SLD_SIM_T_LENG $addr_sim_len\n\n" + $log insert end "`define TRIG_SLD_SIM_ACTION $trig_sim_act\n" + $log insert end "`define TRIG_SLD_SIM_N_SCAN $trig_sim_num\n" + $log insert end "`define TRIG_SLD_SIM_T_LENG $trig_sim_len\n\n" + + set fileId [open ../../rtl/altera/jtag_sim_define.h w] + puts $fileId [$log get 1.0 end] + close $fileId +} + +proc quit_console {} { + global exit_console + destroy .console + set exit_console 1 +} + +proc back_sim {} { + global exit_console + #destroy .console + set exit_console 1 +} + +proc start_sim {} { + do sim.do +} + +proc pause_sim {} { + vsim_break +} + +# initialize +set exit_console 0 +reset_stimulus +destroy .console + +# set the main window +toplevel .console +wm title .console "www.OpenCores.org: uP Transaction Monitor: Simulation Console" +pack propagate .console true + +# set the www.OpenCores.org logo +frame .console.fig -bg white +pack .console.fig -expand true -fill both +image create photo logo -format gif -file "../../cmd/common/OpenCores.gif" +label .console.fig.logo -image logo -bg white +pack .console.fig.logo + +# set the inclusive address entries +frame .console.f1 -relief groove -borderwidth 5 +pack .console.f1 +label .console.f1.incl_addr -text {Inclusive Addr:} +entry .console.f1.address_span1 -textvariable address_span1 -width 8 +entry .console.f1.address_span2 -textvariable address_span2 -width 8 +entry .console.f1.address_span3 -textvariable address_span3 -width 8 +entry .console.f1.address_span4 -textvariable address_span4 -width 8 +entry .console.f1.address_span5 -textvariable address_span5 -width 8 +entry .console.f1.address_span6 -textvariable address_span6 -width 8 +entry .console.f1.address_span7 -textvariable address_span7 -width 8 +entry .console.f1.address_span8 -textvariable address_span8 -width 8 +checkbutton .console.f1.address_span_en1 -variable address_span_en1 +checkbutton .console.f1.address_span_en2 -variable address_span_en2 +checkbutton .console.f1.address_span_en3 -variable address_span_en3 +checkbutton .console.f1.address_span_en4 -variable address_span_en4 +checkbutton .console.f1.address_span_en5 -variable address_span_en5 +checkbutton .console.f1.address_span_en6 -variable address_span_en6 +checkbutton .console.f1.address_span_en7 -variable address_span_en7 +checkbutton .console.f1.address_span_en8 -variable address_span_en8 +pack .console.f1.incl_addr \ + .console.f1.address_span_en1 .console.f1.address_span1 \ + .console.f1.address_span_en2 .console.f1.address_span2 \ + .console.f1.address_span_en3 .console.f1.address_span3 \ + .console.f1.address_span_en4 .console.f1.address_span4 \ + .console.f1.address_span_en5 .console.f1.address_span5 \ + .console.f1.address_span_en6 .console.f1.address_span6 \ + .console.f1.address_span_en7 .console.f1.address_span7 \ + .console.f1.address_span_en8 .console.f1.address_span8 \ + -side left -ipadx 0 + +# set the exclusive address entries +frame .console.f2 -relief groove -borderwidth 5 +pack .console.f2 +label .console.f2.excl_addr -text {Exclusive Addr:} +entry .console.f2.address_span9 -textvariable address_span9 -width 8 +entry .console.f2.address_span10 -textvariable address_span10 -width 8 +entry .console.f2.address_span11 -textvariable address_span11 -width 8 +entry .console.f2.address_span12 -textvariable address_span12 -width 8 +entry .console.f2.address_span13 -textvariable address_span13 -width 8 +entry .console.f2.address_span14 -textvariable address_span14 -width 8 +entry .console.f2.address_span15 -textvariable address_span15 -width 8 +entry .console.f2.address_span16 -textvariable address_span16 -width 8 +checkbutton .console.f2.address_span_en9 -variable address_span_en9 +checkbutton .console.f2.address_span_en10 -variable address_span_en10 +checkbutton .console.f2.address_span_en11 -variable address_span_en11 +checkbutton .console.f2.address_span_en12 -variable address_span_en12 +checkbutton .console.f2.address_span_en13 -variable address_span_en13 +checkbutton .console.f2.address_span_en14 -variable address_span_en14 +checkbutton .console.f2.address_span_en15 -variable address_span_en15 +checkbutton .console.f2.address_span_en16 -variable address_span_en16 +pack .console.f2.excl_addr \ + .console.f2.address_span_en9 .console.f2.address_span9 \ + .console.f2.address_span_en10 .console.f2.address_span10 \ + .console.f2.address_span_en11 .console.f2.address_span11 \ + .console.f2.address_span_en12 .console.f2.address_span12 \ + .console.f2.address_span_en13 .console.f2.address_span13 \ + .console.f2.address_span_en14 .console.f2.address_span14 \ + .console.f2.address_span_en15 .console.f2.address_span15 \ + .console.f2.address_span_en16 .console.f2.address_span16 \ + -side left -ipadx 0 +initAddrConfig + +# set the address configuration buttons +frame .console.addr_cnfg -relief groove -borderwidth 5 +pack .console.addr_cnfg +checkbutton .console.addr_cnfg.wren -text {WR} -variable addr_wren +checkbutton .console.addr_cnfg.rden -text {RD} -variable addr_rden +button .console.addr_cnfg.config -text {Apply Address Filter} -command {updateAddrConfig} +pack .console.addr_cnfg.wren .console.addr_cnfg.rden .console.addr_cnfg.config \ + -side left -ipadx 0 + +# set the transaction trigger controls +frame .console.trig -relief groove -borderwidth 5 +pack .console.trig +button .console.trig.starttrig -text {Apply Trigger Condition} -command {startTrigger} +entry .console.trig.trigvalue_addr -textvar triggerAddr -width 4 +entry .console.trig.trigvalue_data -textvar triggerData -width 8 +checkbutton .console.trig.trigaddr -text {@Addr:} -variable trig_aden +checkbutton .console.trig.trigdata -text {@Data:} -variable trig_daen +checkbutton .console.trig.wren -text {@WR} -variable trig_wren +checkbutton .console.trig.rden -text {@RD} -variable trig_rden +label .console.trig.pnum -text {Pre-Capture:} +entry .console.trig.trigvalue_pnum -textvar triggerPnum -width 4 +pack .console.trig.pnum .console.trig.trigvalue_pnum \ + .console.trig.wren .console.trig.rden \ + .console.trig.trigaddr .console.trig.trigvalue_addr \ + .console.trig.trigdata .console.trig.trigvalue_data \ + .console.trig.starttrig \ + -side left -ipadx 0 +initTrigConfig + +# set the control buttons +frame .console.fifo -relief groove -borderwidth 5 +pack .console.fifo +button .console.fifo.reset -text {Reset FIFO} -command {reset_fifo_ptr} +button .console.fifo.loop -text {Query Used Word} -command {query_fifo_usedw} +label .console.fifo.usedw -textvariable fifoUsedw -relief sunken -width 4 +button .console.fifo.read -text {Read FIFO} -command {read_fifo_content} +pack .console.fifo.reset .console.fifo.loop .console.fifo.usedw .console.fifo.read \ + -side left -ipadx 0 + +# set the control buttons +frame .console.sim -relief groove -borderwidth 5 +pack .console.sim +button .console.sim.reset -text {Reset Stimulus} -command {reset_stimulus} +button .console.sim.generate -text {Generate Stimulus} -command {generate_stimulus} +button .console.sim.start -text {Start Simulation} -command {start_sim} +button .console.sim.pause -text {Pause Simulation} -command {pause_sim} +button .console.sim.back -text {Back to Simulation} -command {back_sim} +button .console.sim.quit -text {Quit} -command {quit_console} +pack .console.sim.reset .console.sim.generate .console.sim.back .console.sim.quit \ + -side left -ipadx 0 + +# set the log window +frame .console.log -relief groove -borderwidth 5 +set log [text .console.log.text -width 80 -height 25 \ + -borderwidth 2 -relief sunken -setgrid true \ + -yscrollcommand {.console.log.scroll set}] +scrollbar .console.log.scroll -command {.console.log.text yview} +pack .console.log.scroll -side right -fill y +pack .console.log.text -side left -fill both -expand true +pack .console.log -side top -fill both -expand true + +# make the program wait for exit signal +vwait exit_console + Index: tags/v2p2/sim/altera/jtag_bfm_sv.v =================================================================== --- tags/v2p2/sim/altera/jtag_bfm_sv.v (nonexistent) +++ tags/v2p2/sim/altera/jtag_bfm_sv.v (revision 16) @@ -0,0 +1,33 @@ +//************************************************************** +// Module : jtag_bfm_sv.v +// Platform : Windows xp sp2 +// Simulator : Modelsim 6.5b +// Synthesizer : +// Place and Route : +// Targets device : +// Author : Bibo Yang (ash_riple@hotmail.com) +// Organization : www.opencores.org +// Revision : 2.2 +// Date : 2012/03/28 +// Description : JTAG Stimulus monitor +//************************************************************** + +`timescale 1ns/1ns +`include "jtag_sim_define.h" + +module jtag_bfm_sv ( +); + +reg jtag_sim_done; +initial begin + jtag_sim_done = 0; + fork + @(posedge up_monitor_tb.MON_LO.inst.u_virtual_jtag_adda_fifo.sld_virtual_jtag_component.user_input.vj_sim_done); + @(posedge up_monitor_tb.MON_LO.inst.u_virtual_jtag_addr_mask.sld_virtual_jtag_component.user_input.vj_sim_done); + @(posedge up_monitor_tb.MON_LO.inst.u_virtual_jtag_adda_trig.sld_virtual_jtag_component.user_input.vj_sim_done); + join + $display("All JTAG stimulus excercised"); + jtag_sim_done = 1; +end + +endmodule Index: tags/v2p2/sim/altera/sim.sh =================================================================== --- tags/v2p2/sim/altera/sim.sh (nonexistent) +++ tags/v2p2/sim/altera/sim.sh (revision 16) @@ -0,0 +1,50 @@ +quit -sim +vlib work +vdel -lib work -all +vlib work + +set sim_started 0 + +# compile vendor independent files +vlog -work work ../../rtl/up_monitor.v +initreg+0 +vlog -work work ../../rtl/up_monitor_wrapper.v +initreg+0 + +# compile altera virtual jtag files +source virtual_jtag_stimulus.tcl +vlog -work work ../../rtl/altera/virtual_jtag_adda_fifo.v +incdir+../../rtl/altera +vlog -work work ../../rtl/altera/virtual_jtag_adda_trig.v +incdir+../../rtl/altera +vlog -work work ../../rtl/altera/virtual_jtag_addr_mask.v +incdir+../../rtl/altera +vlog -work work altera_mf.v + +# compile testbench files +vlog -work work -sv ../up_monitor_tb.v + +# compile register bfm files +vlog -work work -sv ../reg_bfm_sv.v + +# compile cpu bfm files +# Sytemverilog DPI steps to combine sv and c +# step 1: generate dpiheader.h +vlog -work work -sv -dpiheader ../dpiheader.h ../up_bfm_sv.v +## step 2: generate up_bfm_sv.obj +#vsim -dpiexportobj up_bfm_sv up_bfm_sv +# step 3: generate up_bfm_c.o +gcc -c -I $::env(MODEL_TECH)/../include ../up_bfm_c.c +# step 4: generate up_bfm_c.dll +gcc -shared -Bsymbolic -o up_bfm_c.so up_bfm_c.o + +# compile jtag bfms files +vlog -work work -sv jtag_bfm_sv.v +incdir+../../rtl/altera + +vsim -novopt \ + -sv_lib up_bfm_c \ + -t ps \ + up_monitor_tb + +set sim_started 1 + +log -r */* +radix -hexadecimal +do wave.do + +run 10000ns Index: tags/v2p2/sim/altera/wave.do =================================================================== --- tags/v2p2/sim/altera/wave.do (nonexistent) +++ tags/v2p2/sim/altera/wave.do (revision 16) @@ -0,0 +1,73 @@ +onerror {resume} +quietly WaveActivateNextPane {} 0 +add wave -noupdate -divider {CPU BFM} +add wave -noupdate -format Logic /up_monitor_tb/CPU/up_clk +add wave -noupdate -format Logic /up_monitor_tb/CPU/up_csn +add wave -noupdate -format Logic /up_monitor_tb/CPU/up_wbe +add wave -noupdate -format Literal /up_monitor_tb/CPU/up_addr +add wave -noupdate -format Literal /up_monitor_tb/CPU/up_data_io +add wave -noupdate -divider {REG BFM} +add wave -noupdate -format Logic /up_monitor_tb/REG/up_clk +add wave -noupdate -format Logic /up_monitor_tb/REG/up_csn +add wave -noupdate -format Logic /up_monitor_tb/REG/up_wbe +add wave -noupdate -format Literal /up_monitor_tb/REG/up_addr +add wave -noupdate -format Literal /up_monitor_tb/REG/up_data_io +add wave -noupdate -divider MON_LO +add wave -noupdate -format Logic /up_monitor_tb/MON_LO/up_wbe +add wave -noupdate -format Logic /up_monitor_tb/MON_LO/up_csn +add wave -noupdate -format Literal /up_monitor_tb/MON_LO/up_addr +add wave -noupdate -format Literal /up_monitor_tb/MON_LO/up_data_io +add wave -noupdate -format Logic /up_monitor_tb/MON_LO/up_clk +add wave -noupdate -divider pin-to-transaction +add wave -noupdate -format Logic /up_monitor_tb/MON_LO/wr_en +add wave -noupdate -format Logic /up_monitor_tb/MON_LO/rd_en +add wave -noupdate -format Literal /up_monitor_tb/MON_LO/addr_in +add wave -noupdate -format Literal /up_monitor_tb/MON_LO/data_in +add wave -noupdate -divider {New Divider} +add wave -noupdate -format Logic /up_monitor_tb/MON_LO/inst/wr_en_d1 +add wave -noupdate -format Logic /up_monitor_tb/MON_LO/inst/rd_en_d1 +add wave -noupdate -format Literal /up_monitor_tb/MON_LO/inst/addr_in_d1 +add wave -noupdate -format Literal /up_monitor_tb/MON_LO/inst/data_in_d1 +add wave -noupdate -format Logic /up_monitor_tb/MON_LO/inst/addr_mask_ok +add wave -noupdate -format Logic /up_monitor_tb/MON_LO/inst/trig_cond_ok_d1 +add wave -noupdate -format Logic /up_monitor_tb/MON_LO/inst/capture_wr +add wave -noupdate -format Literal /up_monitor_tb/MON_LO/inst/capture_in +add wave -noupdate -divider {New Divider} +add wave -noupdate -format Logic /up_monitor_tb/MON_LO/inst/u_virtual_jtag_adda_fifo/clk +add wave -noupdate -format Logic /up_monitor_tb/MON_LO/inst/u_virtual_jtag_adda_fifo/wr_en +add wave -noupdate -format Literal /up_monitor_tb/MON_LO/inst/u_virtual_jtag_adda_fifo/data_in +add wave -noupdate -format Logic /up_monitor_tb/MON_LO/inst/u_virtual_jtag_adda_fifo/reset +add wave -noupdate -format Literal /up_monitor_tb/MON_LO/inst/u_virtual_jtag_adda_fifo/usedw +add wave -noupdate -format Logic /up_monitor_tb/MON_LO/inst/u_virtual_jtag_adda_fifo/rd_en +add wave -noupdate -format Literal /up_monitor_tb/MON_LO/inst/u_virtual_jtag_adda_fifo/data_out +add wave -noupdate -divider {New Divider} +add wave -noupdate -format Literal /up_monitor_tb/MON_LO/inst/pretrig_num +add wave -noupdate -format Literal /up_monitor_tb/MON_LO/inst/pretrig_cnt +add wave -noupdate -format Logic /up_monitor_tb/MON_LO/inst/pretrig_full +add wave -noupdate -format Logic /up_monitor_tb/MON_LO/inst/pretrig_wr +add wave -noupdate -format Logic /up_monitor_tb/MON_LO/inst/pretrig_rd +add wave -noupdate -divider {New Divider} +add wave -noupdate -format Literal -radix unsigned /up_monitor_tb/MON_LO/inst/inter_cap_cnt +add wave -noupdate -divider {New Divider} +add wave -noupdate -format Logic /up_monitor_tb/MON_LO/inst/u_virtual_jtag_adda_fifo/sld_virtual_jtag_component/user_input/vj_sim_done +add wave -noupdate -format Logic /up_monitor_tb/MON_LO/inst/u_virtual_jtag_adda_trig/sld_virtual_jtag_component/user_input/vj_sim_done +add wave -noupdate -format Logic /up_monitor_tb/MON_LO/inst/u_virtual_jtag_addr_mask/sld_virtual_jtag_component/user_input/vj_sim_done +add wave -noupdate -divider {New Divider} +add wave -noupdate -divider {New Divider} +TreeUpdate [SetDefaultTree] +WaveRestoreCursors {{Cursor 1} {8603967 ps} 0} +configure wave -namecolwidth 147 +configure wave -valuecolwidth 100 +configure wave -justifyvalue left +configure wave -signalnamewidth 0 +configure wave -snapdistance 10 +configure wave -datasetprefix 0 +configure wave -rowmargin 4 +configure wave -childrowmargin 2 +configure wave -gridoffset 0 +configure wave -gridperiod 1 +configure wave -griddelta 40 +configure wave -timeline 0 +configure wave -timelineunits ps +update +WaveRestoreZoom {0 ps} {10500 ns} Index: tags/v2p2/sim/altera/sim.do =================================================================== --- tags/v2p2/sim/altera/sim.do (nonexistent) +++ tags/v2p2/sim/altera/sim.do (revision 16) @@ -0,0 +1,51 @@ +quit -sim +vlib work +vdel -lib work -all +vlib work + +set sim_started 0 + +# compile vendor independent files +vlog -work work ../../rtl/up_monitor.v +initreg+0 +vlog -work work ../../rtl/up_monitor_wrapper.v +initreg+0 + +# compile altera virtual jtag files +source virtual_jtag_stimulus.tcl +vlog -work work ../../rtl/altera/virtual_jtag_adda_fifo.v +incdir+../../rtl/altera +vlog -work work ../../rtl/altera/virtual_jtag_adda_trig.v +incdir+../../rtl/altera +vlog -work work ../../rtl/altera/virtual_jtag_addr_mask.v +incdir+../../rtl/altera +vlog -work work altera_mf.v + +# compile testbench files +vlog -work work -sv ../up_monitor_tb.v + +# compile register bfm files +vlog -work work -sv ../reg_bfm_sv.v + +# compile cpu bfm files +# Sytemverilog DPI steps to combine sv and c +# step 1: generate dpiheader.h +vlog -work work -sv -dpiheader ../dpiheader.h ../up_bfm_sv.v +# step 2: generate up_bfm_sv.obj +vsim -dpiexportobj up_bfm_sv up_bfm_sv +# step 3: generate up_bfm_c.o +gcc -c -I $::env(MODEL_TECH)/../include ../up_bfm_c.c +# step 4: generate up_bfm_c.dll +gcc -shared -Bsymbolic -o up_bfm_c.dll up_bfm_c.o \ + up_bfm_sv.obj -L $::env(MODEL_TECH) -lmtipli + +# compile jtag bfms files +vlog -work work -sv jtag_bfm_sv.v +incdir+../../rtl/altera + +vsim -novopt \ + -sv_lib up_bfm_c \ + -t ps \ + up_monitor_tb + +set sim_started 1 + +log -r */* +radix -hexadecimal +do wave.do + +run 10000ns Index: tags/v2p2/sim/altera/sim.bat =================================================================== --- tags/v2p2/sim/altera/sim.bat (nonexistent) +++ tags/v2p2/sim/altera/sim.bat (revision 16) @@ -0,0 +1,7 @@ +title %CD% + +SET LM_LICENSE_FILE=C:\lmlicense\licensefile.dat +SET MODEL_TECH=C:\modeltech_6.5b\win32 +SET PATH=C:\Modeltech_6.5b\win32;C:\modeltech_6.5b\gcc-4.2.1-mingw32\bin + +vsim -do sim.do \ No newline at end of file Index: tags/v2p2/sim/altera/altera_mf.v =================================================================== --- tags/v2p2/sim/altera/altera_mf.v (nonexistent) +++ tags/v2p2/sim/altera/altera_mf.v (revision 16) @@ -0,0 +1,2979 @@ +// Copyright (C) 1991-2011 Altera Corporation +// Your use of Altera Corporation's design tools, logic functions +// and other software and tools, and its AMPP partner logic +// functions, and any output files from any of the foregoing +// (including device programming or simulation files), and any +// associated documentation or information are expressly subject +// to the terms and conditions of the Altera Program License +// Subscription Agreement, Altera MegaCore Function License +// Agreement, or other applicable license agreement, including, +// without limitation, that your use is for the sole purpose of +// programming logic devices manufactured by Altera and sold by +// Altera or its authorized distributors. Please refer to the +// applicable agreement for further details. +// Quartus II 10.1 Build 197 11/29/2010 + + +// VIRTUAL JTAG MODULE CONSTANTS + +// the default bit length for time and value +`define DEFAULT_BIT_LENGTH 32 + +// the bit length for type +`define TYPE_BIT_LENGTH 4 + +// the bit length for delay time +`define TIME_BIT_LENGTH 64 + +// the number of selection bits + width of hub instructions(3) +`define NUM_SELECTION_BITS 4 + +// the states for the parser state machine +`define STARTSTATE 3'b000 +`define LENGTHSTATE 3'b001 +`define VALUESTATE 3'b011 +`define TYPESTATE 3'b111 +`define TIMESTATE 3'b101 + +`define V_DR_SCAN_TYPE 4'b0010 +`define V_IR_SCAN_TYPE 4'b0001 + +// specify time scale, allowing JTAG to run at 1GHz against actual 10MHz +`define CLK_PERIOD 1000 + +`define DELAY_RESOLUTION 100 + +// the states for the tap controller state machine +`define TLR_ST 5'b00000 +`define RTI_ST 5'b00001 +`define DRS_ST 5'b00011 +`define CDR_ST 5'b00111 +`define SDR_ST 5'b01111 +`define E1DR_ST 5'b01011 +`define PDR_ST 5'b01101 +`define E2DR_ST 5'b01000 +`define UDR_ST 5'b01001 +`define IRS_ST 5'b01100 +`define CIR_ST 5'b01010 +`define SIR_ST 5'b00101 +`define E1IR_ST 5'b00100 +`define PIR_ST 5'b00010 +`define E2IR_ST 5'b00110 +`define UIR_ST 5'b01110 +`define INIT_ST 5'b10000 + +// usr1 instruction for tap controller +`define JTAG_USR1_INSTR 10'b0000001110 + + +//START_MODULE_NAME------------------------------------------------------------ +// Module Name : signal_gen +// +// Description : Simulates customizable actions on a JTAG input +// +// Limitation : Zero is not a valid length and causes simulation to halt with +// an error message. +// Values with more bits than specified length will be truncated. +// Length for IR scans are ignored. They however should be factored in when +// calculating SLD_NODE_TOTAl_LENGTH. +// +// Results expected : +// +// +//END_MODULE_NAME-------------------------------------------------------------- + +// BEGINNING OF MODULE +`timescale 1 ps / 1 ps + +// MODULE DECLARATION +module signal_gen (tck,tms,tdi,jtag_usr1,tdo); + + + // GLOBAL PARAMETER DECLARATION + parameter sld_node_ir_width = 1; + parameter sld_node_n_scan = 0; + parameter sld_node_total_length = 0; + parameter sld_node_sim_action = "()"; + + // INPUT PORTS + input jtag_usr1; + input tdo; + + // OUTPUT PORTS + output tck; + output tms; + output tdi; + + // CONSTANT DECLARATIONS +`define DECODED_SCANS_LENGTH (sld_node_total_length + ((sld_node_n_scan * `DEFAULT_BIT_LENGTH) * 2) + (sld_node_n_scan * `TYPE_BIT_LENGTH) - 1) +`define DEFAULT_SCAN_LENGTH (sld_node_n_scan * `DEFAULT_BIT_LENGTH) +`define TYPE_SCAN_LENGTH (sld_node_n_scan * `TYPE_BIT_LENGTH) - 1 + + // INTEGER DECLARATION + integer char_idx; // character_loop index + integer value_idx; // decoding value index + integer value_idx_old; // previous decoding value index + integer value_idx_cur; // reading/outputing value index + integer length_idx; // decoding length index + integer length_idx_old; // previous decoding length index + integer length_idx_cur; // reading/outputing length index + integer last_length_idx;// decoding previous length index + integer type_idx; // decoding type index + integer type_idx_old; // previous decoding type index + integer type_idx_cur; // reading/outputing type index + integer time_idx; // decoding time index + integer time_idx_old; // previous decoding time index + integer time_idx_cur; // reading/outputing time index + + // REGISTERS + reg [ `DEFAULT_SCAN_LENGTH - 1 : 0 ] scan_length; + // register for the 32-bit length values + reg [ sld_node_total_length - 1 : 0 ] scan_values; + // register for values + reg [ `TYPE_SCAN_LENGTH : 0 ] scan_type; + // register for 4-bit type + reg [ `DEFAULT_SCAN_LENGTH - 1 : 0 ] scan_time; + // register to hold time values + reg [15 : 0] two_character; + // two ascii characters. Used in decoding + reg [2 : 0] c_state; + // the current state register + reg [3 : 0] hex_value; + // temporary value to hold hex value of ascii character + reg [31 : 0] last_length; + // register to hold the previous length value read + reg tms_reg; + // register to hold tms value before its clocked + reg tdi_reg; + // register to hold tdi vale before its clocked + + // OUTPUT REGISTERS + reg tms; + reg tck; + reg tdi; + + // input registers + + // LOCAL TIME DECLARATION + + // FUNCTION DECLARATION + + // hexToBits - takes in a hexadecimal character and + // returns the 4-bit value of the character. + // Returns 0 if character is not a hexadeciaml character + function [3 : 0] hexToBits; + input [7 : 0] character; + begin + case ( character ) + "0" : hexToBits = 4'b0000; + "1" : hexToBits = 4'b0001; + "2" : hexToBits = 4'b0010; + "3" : hexToBits = 4'b0011; + "4" : hexToBits = 4'b0100; + "5" : hexToBits = 4'b0101; + "6" : hexToBits = 4'b0110; + "7" : hexToBits = 4'b0111; + "8" : hexToBits = 4'b1000; + "9" : hexToBits = 4'b1001; + "A" : hexToBits = 4'b1010; + "a" : hexToBits = 4'b1010; + "B" : hexToBits = 4'b1011; + "b" : hexToBits = 4'b1011; + "C" : hexToBits = 4'b1100; + "c" : hexToBits = 4'b1100; + "D" : hexToBits = 4'b1101; + "d" : hexToBits = 4'b1101; + "E" : hexToBits = 4'b1110; + "e" : hexToBits = 4'b1110; + "F" : hexToBits = 4'b1111; + "f" : hexToBits = 4'b1111; + default : + begin + hexToBits = 4'b0000; + $display("%s is not a hexadecimal value",character); + end + endcase + end + endfunction + + // TASK DECLARATIONS + + // clocks tck + task clock_tck; + input in_tms; + input in_tdi; + begin : clock_tck_tsk + #(`CLK_PERIOD/2) tck <= ~tck; + tms <= in_tms; + tdi <= in_tdi; + #(`CLK_PERIOD/2) tck <= ~tck; + end // clock_tck_tsk + endtask // clock_tck + + // move tap controller from dr/ir shift state to ir/dr update state + task goto_update_state; + begin : goto_update_state_tsk + // get into e1(i/d)r state + tms_reg = 1'b1; + clock_tck(tms_reg,tdi_reg); + // get into u(i/d)r state + tms_reg = 1'b1; + clock_tck(tms_reg,tdi_reg); + end // goto_update_state_tsk + endtask // goto_update_state + + // resets the jtag TAP controller by holding tms high + // for 6 tck cycles + task reset_jtag; + integer idx; + begin + for (idx = 0; idx < 6; idx= idx + 1) + begin + tms_reg = 1'b1; + clock_tck(tms_reg,tdi_reg); + end + // get into rti state + tms_reg = 1'b0; + clock_tck(tms_reg,tdi_reg); + jtag_ir_usr1; + end + endtask // reset_jtag + + // sends a jtag_usr0 intsruction + task jtag_ir_usr0; + integer i; + begin : jtag_ir_usr0_tsk + // get into drs state + tms_reg = 1'b1; + clock_tck(tms_reg,tdi_reg); + // get into irs state + tms_reg = 1'b1; + clock_tck(tms_reg,tdi_reg); + // get into cir state + tms_reg = 1'b0; + clock_tck(tms_reg,tdi_reg); + // get into sir state + tms_reg = 1'b0; + clock_tck(tms_reg,tdi_reg); + // shift in data i.e usr0 instruction + // usr1 = 0x0E = 0b00 0000 1100 + for ( i = 0; i < 2; i = i + 1) + begin :ir_usr0_loop1 + tdi_reg = 1'b0; + tms_reg = 1'b0; + clock_tck(tms_reg,tdi_reg); + end // ir_usr0_loop1 + for ( i = 0; i < 2; i = i + 1) + begin :ir_usr0_loop2 + tdi_reg = 1'b1; + tms_reg = 1'b0; + clock_tck(tms_reg,tdi_reg); + end // ir_usr0_loop2 + // done with 1100 + for ( i = 0; i < 6; i = i + 1) + begin :ir_usr0_loop3 + tdi_reg = 1'b0; + tms_reg = 1'b0; + clock_tck(tms_reg,tdi_reg); + end // ir_usr0_loop3 + // done with 00 0000 + // get into e1ir state + tms_reg = 1'b1; + clock_tck(tms_reg,tdi_reg); + // get into uir state + tms_reg = 1'b1; + clock_tck(tms_reg,tdi_reg); + end // jtag_ir_usr0_tsk + endtask // jtag_ir_usr0 + + // sends a jtag_usr1 intsruction + task jtag_ir_usr1; + integer i; + begin : jtag_ir_usr1_tsk + // get into drs state + tms_reg = 1'b1; + clock_tck(tms_reg,tdi_reg); + // get into irs state + tms_reg = 1'b1; + clock_tck(tms_reg,tdi_reg); + // get into cir state + tms_reg = 1'b0; + clock_tck(tms_reg,tdi_reg); + // get into sir state + tms_reg = 1'b0; + clock_tck(tms_reg,tdi_reg); + // shift in data i.e usr1 instruction + // usr1 = 0x0E = 0b00 0000 1110 + tdi_reg = 1'b0; + tms_reg = 1'b0; + clock_tck(tms_reg,tdi_reg); + for ( i = 0; i < 3; i = i + 1) + begin :ir_usr1_loop1 + tdi_reg = 1'b1; + tms_reg = 1'b0; + clock_tck(tms_reg,tdi_reg); + end // ir_usr1_loop1 + // done with 1110 + for ( i = 0; i < 5; i = i + 1) + begin :ir_usr1_loop2 + tdi_reg = 1'b0; + tms_reg = 1'b0; + clock_tck(tms_reg,tdi_reg); + end // ir_sur1_loop2 + tdi_reg = 1'b0; + tms_reg = 1'b1; + clock_tck(tms_reg,tdi_reg); + // done with 00 0000 + // now in e1ir state + // get into uir state + tms_reg = 1'b1; + clock_tck(tms_reg,tdi_reg); + end // jtag_ir_usr1_tsk + endtask // jtag_ir_usr1 + + // sends a force_ir_capture instruction to the node + task send_force_ir_capture; + integer i; + begin : send_force_ir_capture_tsk + goto_dr_shift_state; + // start shifting in the instruction + tdi_reg = 1'b1; + tms_reg = 1'b0; + clock_tck(tms_reg,tdi_reg); + tdi_reg = 1'b1; + tms_reg = 1'b0; + clock_tck(tms_reg,tdi_reg); + tdi_reg = 1'b0; + tms_reg = 1'b0; + clock_tck(tms_reg,tdi_reg); + // done with 011 + tdi_reg = 1'b0; + tms_reg = 1'b0; + clock_tck(tms_reg,tdi_reg); + // done with select bit + // fill up with zeros up to ir_width + for ( i = 0; i < sld_node_ir_width - 4; i = i + 1 ) + begin + tdi_reg = 1'b0; + tms_reg = 1'b0; + clock_tck(tms_reg,tdi_reg); + end + goto_update_state; + end // send_force_ir_capture_tsk + endtask // send_forse_ir_capture + + // puts the JTAG tap controller in DR shift state + task goto_dr_shift_state; + begin : goto_dr_shift_state_tsk + // get into drs state + tms_reg = 1'b1; + clock_tck(tms_reg,tdi_reg); + // get into cdr state + tms_reg = 1'b0; + clock_tck(tms_reg,tdi_reg); + // get into sdr state + tms_reg = 1'b0; + clock_tck(tms_reg,tdi_reg); + end // goto_dr_shift_state_tsk + endtask // goto_dr_shift_state + + // performs a virtual_ir_scan + task v_ir_scan; + input [`DEFAULT_BIT_LENGTH - 1 : 0] length; + integer i; + begin : v_ir_scan_tsk + // if we are not in usr1 then go to usr1 state + if (jtag_usr1 == 1'b0) + begin + jtag_ir_usr1; + end + // send force_ir_capture + send_force_ir_capture; + // shift in the ir value + goto_dr_shift_state; + value_idx_cur = value_idx_cur - length; + for ( i = 0; i < length; i = i + 1) + begin + tms_reg = 1'b0; + tdi_reg = scan_values[value_idx_cur + i]; + clock_tck(tms_reg,tdi_reg); + end + // pad with zeros if necessary + for(i = length; i < sld_node_ir_width; i = i + 1) + begin : zero_padding + tdi_reg = 1'b0; + tms_reg = 1'b0; + clock_tck(tms_reg,tdi_reg); + end //zero_padding + tdi_reg = 1'b1; + goto_update_state; + end // v_ir_scan_tsk + endtask // v_ir_scan + + // performs a virtual dr scan + task v_dr_scan; + input [`DEFAULT_BIT_LENGTH - 1 : 0] length; + integer i; + begin : v_dr_scan_tsk + // if we are in usr1 then go to usr0 state + if (jtag_usr1 == 1'b1) + begin + jtag_ir_usr0; + end + // shift in the dr value + goto_dr_shift_state; + value_idx_cur = value_idx_cur - length; + for ( i = 0; i < length - 1; i = i + 1) + begin + tms_reg = 1'b0; + tdi_reg = scan_values[value_idx_cur + i]; + clock_tck(tms_reg,tdi_reg); + end + // last bit is clocked together with state transition + tdi_reg = scan_values[value_idx_cur + i]; + goto_update_state; + end // v_dr_scan_tsk + endtask // v_dr_scan + + reg vj_sim_done; + initial + begin : sim_model + vj_sim_done = 0; + // initialize output registers + tck = 1'b1; + tms = 1'b0; + tdi = 1'b0; + // initialize variables + tms_reg = 1'b0; + tdi_reg = 1'b0; + two_character = 'b0; + last_length_idx = 0; + value_idx = 0; + value_idx_old = 0; + length_idx = 0; + length_idx_old = 0; + type_idx = 0; + type_idx_old = 0; + time_idx = 0; + time_idx_old = 0; + scan_length = 'b0; + scan_values = 'b0; + scan_type = 'b0; + scan_time = 'b0; + last_length = 'b0; + hex_value = 'b0; + c_state = `STARTSTATE; + // initialize current indices + value_idx_cur = sld_node_total_length; + type_idx_cur = `TYPE_SCAN_LENGTH; + time_idx_cur = `DEFAULT_SCAN_LENGTH; + length_idx_cur = `DEFAULT_SCAN_LENGTH; + for(char_idx = 0;two_character != "((";char_idx = char_idx + 8) + begin : character_loop + // convert two characters to equivalent 16-bit value + two_character[0] = sld_node_sim_action[char_idx]; + two_character[1] = sld_node_sim_action[char_idx+1]; + two_character[2] = sld_node_sim_action[char_idx+2]; + two_character[3] = sld_node_sim_action[char_idx+3]; + two_character[4] = sld_node_sim_action[char_idx+4]; + two_character[5] = sld_node_sim_action[char_idx+5]; + two_character[6] = sld_node_sim_action[char_idx+6]; + two_character[7] = sld_node_sim_action[char_idx+7]; + two_character[8] = sld_node_sim_action[char_idx+8]; + two_character[9] = sld_node_sim_action[char_idx+9]; + two_character[10] = sld_node_sim_action[char_idx+10]; + two_character[11] = sld_node_sim_action[char_idx+11]; + two_character[12] = sld_node_sim_action[char_idx+12]; + two_character[13] = sld_node_sim_action[char_idx+13]; + two_character[14] = sld_node_sim_action[char_idx+14]; + two_character[15] = sld_node_sim_action[char_idx+15]; + // use state machine to decode + case (c_state) + `STARTSTATE : + begin + if (two_character[15 : 8] != ")") + begin + c_state = `LENGTHSTATE; + end + end + `LENGTHSTATE : + begin + if (two_character[7 : 0] == ",") + begin + length_idx = length_idx_old + 32; + length_idx_old = length_idx; + c_state = `VALUESTATE; + end + else + begin + hex_value = hexToBits(two_character[7:0]); + scan_length [ length_idx] = hex_value[0]; + scan_length [ length_idx + 1] = hex_value[1]; + scan_length [ length_idx + 2] = hex_value[2]; + scan_length [ length_idx + 3] = hex_value[3]; + last_length [ last_length_idx] = hex_value[0]; + last_length [ last_length_idx + 1] = hex_value[1]; + last_length [ last_length_idx + 2] = hex_value[2]; + last_length [ last_length_idx + 3] = hex_value[3]; + length_idx = length_idx + 4; + last_length_idx = last_length_idx + 4; + end + end + `VALUESTATE : + begin + if (two_character[7 : 0] == ",") + begin + value_idx = value_idx_old + last_length; + value_idx_old = value_idx; + last_length = 'b0; // reset the last length value + last_length_idx = 0; // reset index for length + c_state = `TYPESTATE; + end + else + begin + hex_value = hexToBits(two_character[7:0]); + scan_values [ value_idx] = hex_value[0]; + scan_values [ value_idx + 1] = hex_value[1]; + scan_values [ value_idx + 2] = hex_value[2]; + scan_values [ value_idx + 3] = hex_value[3]; + value_idx = value_idx + 4; + end + end + `TYPESTATE : + begin + if (two_character[7 : 0] == ",") + begin + type_idx = type_idx + 4; + c_state = `TIMESTATE; + end + else + begin + hex_value = hexToBits(two_character[7:0]); + scan_type [ type_idx] = hex_value[0]; + scan_type [ type_idx + 1] = hex_value[1]; + scan_type [ type_idx + 2] = hex_value[2]; + scan_type [ type_idx + 3] = hex_value[3]; + end + end + `TIMESTATE : + begin + if (two_character[7 : 0] == "(") + begin + time_idx = time_idx_old + 32; + time_idx_old = time_idx; + c_state = `STARTSTATE; + end + else + begin + hex_value = hexToBits(two_character[7:0]); + scan_time [ time_idx] = hex_value[0]; + scan_time [ time_idx + 1] = hex_value[1]; + scan_time [ time_idx + 2] = hex_value[2]; + scan_time [ time_idx + 3] = hex_value[3]; + time_idx = time_idx + 4; + end + end + default : + c_state = `STARTSTATE; + endcase + end // block: character_loop + # (`CLK_PERIOD/2); + begin : execute + integer write_scan_idx; + integer tempLength_idx; + reg [`TYPE_BIT_LENGTH - 1 : 0] tempType; + reg [`DEFAULT_BIT_LENGTH - 1 : 0 ] tempLength; + reg [`DEFAULT_BIT_LENGTH - 1 : 0 ] tempTime; + reg [`TIME_BIT_LENGTH - 1 : 0 ] delayTime; + reset_jtag; + for (write_scan_idx = 0; write_scan_idx < sld_node_n_scan; write_scan_idx = write_scan_idx + 1) + begin : all_scans_loop + tempType[3] = scan_type[type_idx_cur]; + tempType[2] = scan_type[type_idx_cur - 1]; + tempType[1] = scan_type[type_idx_cur - 2]; + tempType[0] = scan_type[type_idx_cur - 3]; + time_idx_cur = time_idx_cur - `DEFAULT_BIT_LENGTH; + length_idx_cur = length_idx_cur - `DEFAULT_BIT_LENGTH; + for (tempLength_idx = 0; tempLength_idx < `DEFAULT_BIT_LENGTH; tempLength_idx = tempLength_idx + 1) + begin : get_scan_time + tempTime[tempLength_idx] = scan_time[time_idx_cur + tempLength_idx]; + end // get_scan_time + delayTime =(`DELAY_RESOLUTION * `CLK_PERIOD * tempTime); + # delayTime; + if (tempType == `V_IR_SCAN_TYPE) + begin + for (tempLength_idx = 0; tempLength_idx < `DEFAULT_BIT_LENGTH; tempLength_idx = tempLength_idx + 1) + begin : ir_get_length + tempLength[tempLength_idx] = scan_length[length_idx_cur + tempLength_idx]; + end // ir_get_length + v_ir_scan(tempLength); + end + else + begin + if (tempType == `V_DR_SCAN_TYPE) + begin + for (tempLength_idx = 0; tempLength_idx < `DEFAULT_BIT_LENGTH; tempLength_idx = tempLength_idx + 1) + begin : dr_get_length + tempLength[tempLength_idx] = scan_length[length_idx_cur + tempLength_idx]; + end // dr_get_length + v_dr_scan(tempLength); + end + else + begin + $display("Invalid scan type"); + end + end + type_idx_cur = type_idx_cur - 4; + end // all_scans_loop + //get into tlr state + for (tempLength_idx = 0; tempLength_idx < 6; tempLength_idx= tempLength_idx + 1) + begin + tms_reg = 1'b1; + clock_tck(tms_reg,tdi_reg); + end + end //execute + vj_sim_done = 1; + end // block: sim_model +endmodule // signal_gen + +// END OF MODULE + + + +//START_MODULE_NAME------------------------------------------------------------ +// Module Name : jtag_tap_controller +// +// Description : Behavioral model of JTAG tap controller with state signals +// +// Limitation : Can only decode USER1 and USER0 instructions +// +// Results expected : +// +// +//END_MODULE_NAME-------------------------------------------------------------- + +// BEGINNING OF MODULE +`timescale 1 ps / 1 ps + +// MODULE DECLARATION +module jtag_tap_controller (tck,tms,tdi,jtag_tdo,tdo,jtag_tck,jtag_tms,jtag_tdi, + jtag_state_tlr,jtag_state_rti,jtag_state_drs,jtag_state_cdr, + jtag_state_sdr,jtag_state_e1dr,jtag_state_pdr,jtag_state_e2dr, + jtag_state_udr,jtag_state_irs,jtag_state_cir,jtag_state_sir, + jtag_state_e1ir,jtag_state_pir,jtag_state_e2ir,jtag_state_uir, + jtag_usr1); + + + // GLOBAL PARAMETER DECLARATION + parameter ir_register_width = 16; + + // INPUT PORTS + input tck; // tck signal from signal_gen + input tms; // tms signal from signal_gen + input tdi; // tdi signal from signal_gen + input jtag_tdo; // tdo signal from hub + + // OUTPUT PORTS + output tdo; // tdo signal to signal_gen + output jtag_tck; // tck signal from jtag + output jtag_tms; // tms signal from jtag + output jtag_tdi; // tdi signal from jtag + output jtag_state_tlr; // tlr state + output jtag_state_rti; // rti state + output jtag_state_drs; // select dr scan state + output jtag_state_cdr; // capture dr state + output jtag_state_sdr; // shift dr state + output jtag_state_e1dr; // exit1 dr state + output jtag_state_pdr; // pause dr state + output jtag_state_e2dr; // exit2 dr state + output jtag_state_udr; // update dr state + output jtag_state_irs; // select ir scan state + output jtag_state_cir; // capture ir state + output jtag_state_sir; // shift ir state + output jtag_state_e1ir; // exit1 ir state + output jtag_state_pir; // pause ir state + output jtag_state_e2ir; // exit2 ir state + output jtag_state_uir; // update ir state + output jtag_usr1; // jtag has usr1 instruction + + // INTERNAL REGISTERS + + reg tdo_reg; + // temporary tdo output register + reg tdo_rom_reg; + // temporary register used to generate 0101... during SIR_ST + reg jtag_usr1_reg; + // temporary jtag_usr1 register + reg jtag_reset_i; + // internal reset + reg [ 4 : 0 ] cState; + // register for current state + reg [ 4 : 0 ] nState; + // register for the next state signal + reg [ ir_register_width - 1 : 0] ir_srl; + // the ir shift register + reg [ ir_register_width - 1 : 0] ir_srl_hold; + // the ir shift register + + // INTERNAL WIRES + wire [ 4 : 0 ] cState_tmp; + wire [ ir_register_width - 1 : 0] ir_srl_tmp; + + + // OUTPUT REGISTERS + reg jtag_state_tlr; // tlr state + reg jtag_state_rti; // rti state + reg jtag_state_drs; // select dr scan state + reg jtag_state_cdr; // capture dr state + reg jtag_state_sdr; // shift dr state + reg jtag_state_e1dr; // exit1 dr state + reg jtag_state_pdr; // pause dr state + reg jtag_state_e2dr; // exit2 dr state + reg jtag_state_udr; // update dr state + reg jtag_state_irs; // select ir scan state + reg jtag_state_cir; // capture ir state + reg jtag_state_sir; // shift ir state + reg jtag_state_e1ir; // exit1 ir state + reg jtag_state_pir; // pause ir state + reg jtag_state_e2ir; // exit2 ir state + reg jtag_state_uir; // update ir state + + + // INITIAL STATEMENTS + initial + begin + // initialize state registers + cState = `INIT_ST; + nState = `TLR_ST; + end + + // State Register block + always @ (posedge tck or posedge jtag_reset_i) + begin : stateReg + if (jtag_reset_i) + begin + cState <= `TLR_ST; + ir_srl <= 'b0; + tdo_reg <= 1'b0; + tdo_rom_reg <= 1'b0; + jtag_usr1_reg <= 1'b0; + end + else + begin + // in capture ir, set-up tdo_rom_reg + // to generate 010101... + if(cState_tmp == `CIR_ST) + begin + tdo_rom_reg <= 1'b0; + end + else + begin + // write to shift register else pipe + if (cState_tmp == `SIR_ST) + begin + tdo_rom_reg <= ~tdo_rom_reg; + tdo_reg <= tdo_rom_reg; + ir_srl <= ir_srl_tmp >> 1; + ir_srl[ir_register_width - 1] <= tdi; + end + else + begin + tdo_reg <= jtag_tdo; + end + end + // check if in usr1 state + if (cState_tmp == `UIR_ST) + begin + if (ir_srl_hold == `JTAG_USR1_INSTR) + begin + jtag_usr1_reg <= 1'b1; + end + else + begin + jtag_usr1_reg <= 1'b0; + end + end + cState <= nState; + end + end // stateReg + + // hold register + always @ (negedge tck or posedge jtag_reset_i) + begin : holdReg + if (jtag_reset_i) + begin + ir_srl_hold <= 'b0; + end + else + begin + if (cState == `E1IR_ST) + begin + ir_srl_hold <= ir_srl; + end + end + end // holdReg + + // next state logic + always @(cState or tms) + begin : stateTrans + nState = cState; + case (cState) + `TLR_ST : + begin + if (tms == 1'b0) + begin + nState = `RTI_ST; + jtag_reset_i = 1'b0; + end + else + begin + jtag_reset_i = 1'b1; + end + end + `RTI_ST : + begin + if (tms) + begin + nState = `DRS_ST; + end + end + `DRS_ST : + begin + if (tms) + begin + nState = `IRS_ST; + end + else + begin + nState = `CDR_ST; + end + end + `CDR_ST : + begin + if (tms) + begin + nState = `E1DR_ST; + end + else + begin + nState = `SDR_ST; + end + end + `SDR_ST : + begin + if (tms) + begin + nState = `E1DR_ST; + end + end + `E1DR_ST : + begin + if (tms) + begin + nState = `UDR_ST; + end + else + begin + nState = `PDR_ST; + end + end + `PDR_ST : + begin + if (tms) + begin + nState = `E2DR_ST; + end + end + `E2DR_ST : + begin + if (tms) + begin + nState = `UDR_ST; + end + else + begin + nState = `SDR_ST; + end + end + `UDR_ST : + begin + if (tms) + begin + nState = `DRS_ST; + end + else + begin + nState = `RTI_ST; + end + end + `IRS_ST : + begin + if (tms) + begin + nState = `TLR_ST; + end + else + begin + nState = `CIR_ST; + end + end + `CIR_ST : + begin + if (tms) + begin + nState = `E1IR_ST; + end + else + begin + nState = `SIR_ST; + end + end + `SIR_ST : + begin + if (tms) + begin + nState = `E1IR_ST; + end + end + `E1IR_ST : + begin + if (tms) + begin + nState = `UIR_ST; + end + else + begin + nState = `PIR_ST; + end + end + `PIR_ST : + begin + if (tms) + begin + nState = `E2IR_ST; + end + end + `E2IR_ST : + begin + if (tms) + begin + nState = `UIR_ST; + end + else + begin + nState = `SIR_ST; + end + end + `UIR_ST : + begin + if (tms) + begin + nState = `DRS_ST; + end + else + begin + nState = `RTI_ST; + end + end + `INIT_ST : + begin + nState = `TLR_ST; + end + default : + begin + $display("Tap Controller State machine error"); + $display ("Time: %0t Instance: %m", $time); + nState = `TLR_ST; + end + endcase + end // stateTrans + + // Output logic + always @ (cState) + begin : output_logic + jtag_state_tlr <= 1'b0; + jtag_state_rti <= 1'b0; + jtag_state_drs <= 1'b0; + jtag_state_cdr <= 1'b0; + jtag_state_sdr <= 1'b0; + jtag_state_e1dr <= 1'b0; + jtag_state_pdr <= 1'b0; + jtag_state_e2dr <= 1'b0; + jtag_state_udr <= 1'b0; + jtag_state_irs <= 1'b0; + jtag_state_cir <= 1'b0; + jtag_state_sir <= 1'b0; + jtag_state_e1ir <= 1'b0; + jtag_state_pir <= 1'b0; + jtag_state_e2ir <= 1'b0; + jtag_state_uir <= 1'b0; + case (cState) + `TLR_ST : + begin + jtag_state_tlr <= 1'b1; + end + `RTI_ST : + begin + jtag_state_rti <= 1'b1; + end + `DRS_ST : + begin + jtag_state_drs <= 1'b1; + end + `CDR_ST : + begin + jtag_state_cdr <= 1'b1; + end + `SDR_ST : + begin + jtag_state_sdr <= 1'b1; + end + `E1DR_ST : + begin + jtag_state_e1dr <= 1'b1; + end + `PDR_ST : + begin + jtag_state_pdr <= 1'b1; + end + `E2DR_ST : + begin + jtag_state_e2dr <= 1'b1; + end + `UDR_ST : + begin + jtag_state_udr <= 1'b1; + end + `IRS_ST : + begin + jtag_state_irs <= 1'b1; + end + `CIR_ST : + begin + jtag_state_cir <= 1'b1; + end + `SIR_ST : + begin + jtag_state_sir <= 1'b1; + end + `E1IR_ST : + begin + jtag_state_e1ir <= 1'b1; + end + `PIR_ST : + begin + jtag_state_pir <= 1'b1; + end + `E2IR_ST : + begin + jtag_state_e2ir <= 1'b1; + end + `UIR_ST : + begin + jtag_state_uir <= 1'b1; + end + default : + begin + $display("Tap Controller State machine output error"); + $display ("Time: %0t Instance: %m", $time); + end + endcase + end // output_logic + // temporary values + assign ir_srl_tmp = ir_srl; + assign cState_tmp = cState; + + // Pipe through signals + assign tdo = tdo_reg; + assign jtag_tck = tck; + assign jtag_tdi = tdi; + assign jtag_tms = tms; + assign jtag_usr1 = jtag_usr1_reg; + +endmodule +// END OF MODULE + + + +//START_MODULE_NAME------------------------------------------------------------ +// Module Name : dummy_hub +// +// Description : Acts as node and mux between the tap controller and +// user design. Generates hub signals +// +// Limitation : Assumes only one node. Ignores user input on tdo and ir_out. +// +// Results expected : +// +// +//END_MODULE_NAME-------------------------------------------------------------- + +// BEGINNING OF MODULE +`timescale 1 ps / 1 ps + +// MODULE DECLARATION + +module dummy_hub (jtag_tck,jtag_tdi,jtag_tms,jtag_usr1,jtag_state_tlr,jtag_state_rti, + jtag_state_drs,jtag_state_cdr,jtag_state_sdr,jtag_state_e1dr, + jtag_state_pdr,jtag_state_e2dr,jtag_state_udr,jtag_state_irs, + jtag_state_cir,jtag_state_sir,jtag_state_e1ir,jtag_state_pir, + jtag_state_e2ir,jtag_state_uir,dummy_tdo,virtual_ir_out, + jtag_tdo,dummy_tck,dummy_tdi,dummy_tms,dummy_state_tlr, + dummy_state_rti,dummy_state_drs,dummy_state_cdr,dummy_state_sdr, + dummy_state_e1dr,dummy_state_pdr,dummy_state_e2dr,dummy_state_udr, + dummy_state_irs,dummy_state_cir,dummy_state_sir,dummy_state_e1ir, + dummy_state_pir,dummy_state_e2ir,dummy_state_uir,virtual_state_cdr, + virtual_state_sdr,virtual_state_e1dr,virtual_state_pdr,virtual_state_e2dr, + virtual_state_udr,virtual_state_cir,virtual_state_uir,virtual_ir_in); + + + // GLOBAL PARAMETER DECLARATION + parameter sld_node_ir_width = 16; + + // INPUT PORTS + + input jtag_tck; // tck signal from tap controller + input jtag_tdi; // tdi signal from tap controller + input jtag_tms; // tms signal from tap controller + input jtag_usr1; // usr1 signal from tap controller + input jtag_state_tlr; // tlr state signal from tap controller + input jtag_state_rti; // rti state signal from tap controller + input jtag_state_drs; // drs state signal from tap controller + input jtag_state_cdr; // cdr state signal from tap controller + input jtag_state_sdr; // sdr state signal from tap controller + input jtag_state_e1dr;// e1dr state signal from tap controller + input jtag_state_pdr; // pdr state signal from tap controller + input jtag_state_e2dr;// esdr state signal from tap controller + input jtag_state_udr; // udr state signal from tap controller + input jtag_state_irs; // irs state signal from tap controller + input jtag_state_cir; // cir state signals from tap controller + input jtag_state_sir; // sir state signal from tap controller + input jtag_state_e1ir;// e1ir state signal from tap controller + input jtag_state_pir; // pir state signals from tap controller + input jtag_state_e2ir;// e2ir state signal from tap controller + input jtag_state_uir; // uir state signal from tap controller + input dummy_tdo; // tdo signal from world + input [sld_node_ir_width - 1 : 0] virtual_ir_out; // captures parallel input from + + // OUTPUT PORTS + output jtag_tdo; // tdo signal to tap controller + output dummy_tck; // tck signal to world + output dummy_tdi; // tdi signal to world + output dummy_tms; // tms signal to world + output dummy_state_tlr; // tlr state signal to world + output dummy_state_rti; // rti state signal to world + output dummy_state_drs; // drs state signal to world + output dummy_state_cdr; // cdr state signal to world + output dummy_state_sdr; // sdr state signal to world + output dummy_state_e1dr; // e1dr state signal to the world + output dummy_state_pdr; // pdr state signal to world + output dummy_state_e2dr; // e2dr state signal to world + output dummy_state_udr; // udr state signal to world + output dummy_state_irs; // irs state signal to world + output dummy_state_cir; // cir state signal to world + output dummy_state_sir; // sir state signal to world + output dummy_state_e1ir; // e1ir state signal to world + output dummy_state_pir; // pir state signal to world + output dummy_state_e2ir; // e2ir state signal to world + output dummy_state_uir; // uir state signal to world + output virtual_state_cdr; // virtual cdr state signal + output virtual_state_sdr; // virtual sdr state signal + output virtual_state_e1dr; // virtual e1dr state signal + output virtual_state_pdr; // virtula pdr state signal + output virtual_state_e2dr; // virtual e2dr state signal + output virtual_state_udr; // virtual udr state signal + output virtual_state_cir; // virtual cir state signal + output virtual_state_uir; // virtual uir state signal + output [sld_node_ir_width - 1 : 0] virtual_ir_in; // parallel output to user design + + +`define SLD_NODE_IR_WIDTH_I sld_node_ir_width + `NUM_SELECTION_BITS // internal ir width + + // INTERNAL REGISTERS + reg capture_ir; // signals force_ir_capture instruction + reg jtag_tdo_reg; // register for jtag_tdo + reg dummy_tdi_reg; // register for dummy_tdi + reg dummy_tck_reg; // register for dummy_tck. + reg [`SLD_NODE_IR_WIDTH_I - 1 : 0] ir_srl; // ir shift register + wire [`SLD_NODE_IR_WIDTH_I - 1 : 0] ir_srl_tmp; // ir shift register + reg [`SLD_NODE_IR_WIDTH_I - 1 : 0] ir_srl_hold; //hold register for ir shift register + + // OUTPUT REGISTERS + reg [sld_node_ir_width - 1 : 0] virtual_ir_in; + + // INITIAL STATEMENTS + always @ (posedge jtag_tck or posedge jtag_state_tlr) + begin : simulation_logic + if (jtag_state_tlr) // asynchronous active high reset + begin : active_hi_async_reset + ir_srl <= 'b0; + jtag_tdo_reg <= 1'b0; + dummy_tdi_reg <= 1'b0; + end // active_hi_async_reset + else + begin : rising_edge_jtag_tck + // logic for shifting in data and piping data through + // logic for muxing inputs to outputs and otherwise + if (jtag_usr1 && jtag_state_sdr) + begin : shift_in_out_usr1 + jtag_tdo_reg <= ir_srl_tmp[0]; + ir_srl <= ir_srl_tmp >> 1; + ir_srl[`SLD_NODE_IR_WIDTH_I - 1] <= jtag_tdi; + end // shift_in_out_usr1 + else + begin + if (capture_ir && jtag_state_cdr) + begin : capture_virtual_ir_out + ir_srl[`SLD_NODE_IR_WIDTH_I - 2 : `NUM_SELECTION_BITS - 1] <= virtual_ir_out; + end // capture_virtual_ir_out + else + begin + if (capture_ir && jtag_state_sdr) + begin : shift_in_out_usr0 + jtag_tdo_reg <= ir_srl_tmp[0]; + ir_srl <= ir_srl_tmp >> 1; + ir_srl[`SLD_NODE_IR_WIDTH_I - 1] <= jtag_tdi; + end // shift_in_out_usr0 + else + begin + if (jtag_state_sdr) + begin : pipe_through + dummy_tdi_reg <= jtag_tdi; + jtag_tdo_reg <= dummy_tdo; + end // pipe_through + end + end + end + end // rising_edge_jtag_tck + end // simulation_logic + + // always block for writing to capture_ir + // stops nlint from complaining. + always @ (posedge jtag_tck or posedge jtag_state_tlr) + begin : capture_ir_logic + if (jtag_state_tlr) // asynchronous active high reset + begin : active_hi_async_reset + capture_ir <= 1'b0; + end // active_hi_async_reset + else + begin : rising_edge_jtag_tck + // should check for 011 instruction + // but we know that it is the only instruction ever sent to the + // hub. So all we have to do is check the selection bit and udr + // and usr1 state + // logic for capture_ir signal + if (jtag_state_udr && (ir_srl[`SLD_NODE_IR_WIDTH_I - 1] == 1'b0)) + begin + capture_ir <= jtag_usr1; + end + else + begin + if (jtag_state_e1dr) + begin + capture_ir <= 1'b0; + end + end + end // rising_edge_jtag_tck + end // capture_ir_logic + + // outputs - rising edge of clock + always @ (posedge jtag_tck or posedge jtag_state_tlr) + begin : parallel_ir_out + if (jtag_state_tlr) + begin : active_hi_async_reset + virtual_ir_in <= 'b0; + end + else + begin : rising_edge_jtag_tck + virtual_ir_in <= ir_srl_hold[`SLD_NODE_IR_WIDTH_I - 2 : `NUM_SELECTION_BITS - 1]; + end + end + + // outputs - falling edge of clock, separated for clarity + always @ (negedge jtag_tck or posedge jtag_state_tlr) + begin : shift_reg_hold + if (jtag_state_tlr) + begin : active_hi_async_reset + ir_srl_hold <= 'b0; + end + else + begin + if (ir_srl[`SLD_NODE_IR_WIDTH_I - 1] && jtag_state_e1dr) + begin + ir_srl_hold <= ir_srl; + end + end + end // shift_reg_hold + + // generate tck in sync with tdi + always @ (posedge jtag_tck or negedge jtag_tck) + begin : gen_tck + dummy_tck_reg <= jtag_tck; + end // gen_tck + // temporary signals + assign ir_srl_tmp = ir_srl; + + // Pipe through signals + assign dummy_state_tlr = jtag_state_tlr; + assign dummy_state_rti = jtag_state_rti; + assign dummy_state_drs = jtag_state_drs; + assign dummy_state_cdr = jtag_state_cdr; + assign dummy_state_sdr = jtag_state_sdr; + assign dummy_state_e1dr = jtag_state_e1dr; + assign dummy_state_pdr = jtag_state_pdr; + assign dummy_state_e2dr = jtag_state_e2dr; + assign dummy_state_udr = jtag_state_udr; + assign dummy_state_irs = jtag_state_irs; + assign dummy_state_cir = jtag_state_cir; + assign dummy_state_sir = jtag_state_sir; + assign dummy_state_e1ir = jtag_state_e1ir; + assign dummy_state_pir = jtag_state_pir; + assign dummy_state_e2ir = jtag_state_e2ir; + assign dummy_state_uir = jtag_state_uir; + assign dummy_tms = jtag_tms; + + + // Virtual signals + assign virtual_state_uir = jtag_usr1 && jtag_state_udr && ir_srl_hold[`SLD_NODE_IR_WIDTH_I - 1]; + assign virtual_state_cir = jtag_usr1 && jtag_state_cdr && ir_srl_hold[`SLD_NODE_IR_WIDTH_I - 1]; + assign virtual_state_udr = (! jtag_usr1) && jtag_state_udr && ir_srl_hold[`SLD_NODE_IR_WIDTH_I - 1]; + assign virtual_state_e2dr = (! jtag_usr1) && jtag_state_e2dr && ir_srl_hold[`SLD_NODE_IR_WIDTH_I - 1]; + assign virtual_state_pdr = (! jtag_usr1) && jtag_state_pdr && ir_srl_hold[`SLD_NODE_IR_WIDTH_I - 1]; + assign virtual_state_e1dr = (! jtag_usr1) && jtag_state_e1dr && ir_srl_hold[`SLD_NODE_IR_WIDTH_I - 1]; + assign virtual_state_sdr = (! jtag_usr1) && jtag_state_sdr && ir_srl_hold[`SLD_NODE_IR_WIDTH_I - 1]; + assign virtual_state_cdr = (! jtag_usr1) && jtag_state_cdr && ir_srl_hold[`SLD_NODE_IR_WIDTH_I - 1]; + + // registered output + assign jtag_tdo = jtag_tdo_reg; + assign dummy_tdi = dummy_tdi_reg; + assign dummy_tck = dummy_tck_reg; + +endmodule +// END OF MODULE + + +//START_MODULE_NAME------------------------------------------------------------ +// Module Name : sld_virtual_jtag +// +// Description : Simulation model for SLD_VIRTUAL_JTAG megafunction +// +// Limitation : None +// +// Results expected : +// +// +//END_MODULE_NAME-------------------------------------------------------------- + +// BEGINNING OF MODULE +`timescale 1 ps / 1 ps +`define IR_REGISTER_WIDTH 10; + + +// MODULE DECLARATION +module sld_virtual_jtag (tdo,ir_out,tck,tdi,ir_in,virtual_state_cdr,virtual_state_sdr, + virtual_state_e1dr,virtual_state_pdr,virtual_state_e2dr, + virtual_state_udr,virtual_state_cir,virtual_state_uir, + jtag_state_tlr,jtag_state_rti,jtag_state_sdrs,jtag_state_cdr, + jtag_state_sdr,jtag_state_e1dr,jtag_state_pdr,jtag_state_e2dr, + jtag_state_udr,jtag_state_sirs,jtag_state_cir,jtag_state_sir, + jtag_state_e1ir,jtag_state_pir,jtag_state_e2ir,jtag_state_uir, + tms); + + + // GLOBAL PARAMETER DECLARATION + parameter lpm_type = "SLD_VIRTUAL_JTAG"; // required by coding standard + parameter lpm_hint = "SLD_VIRTUAL_JTAG"; // required by coding standard + parameter sld_auto_instance_index = "NO"; //Yes if auto index is desired and no otherwise + parameter sld_instance_index = 0; // index to be used if SLD_AUTO_INDEX is no + parameter sld_ir_width = 1; //the width of the IR register + parameter sld_sim_n_scan = 0; // the number of scans in the simulatiom parameters + parameter sld_sim_total_length = 0; // The total bit width of all scan values + parameter sld_sim_action = ""; // the actions to be simulated + + // local parameter declaration + defparam user_input.sld_node_ir_width = sld_ir_width; + defparam user_input.sld_node_n_scan = sld_sim_n_scan; + defparam user_input.sld_node_total_length = sld_sim_total_length; + defparam user_input.sld_node_sim_action = sld_sim_action; + defparam jtag.ir_register_width = 10 ; // compilation fails if defined constant is used + defparam hub.sld_node_ir_width = sld_ir_width; + + + // INPUT PORTS DECLARATION + input tdo; // tdo signal into megafunction + input [sld_ir_width - 1 : 0] ir_out;// parallel ir data into megafunction + + // OUTPUT PORTS DECLARATION + output tck; // tck signal from megafunction + output tdi; // tdi signal from megafunction + output virtual_state_cdr; // cdr state signal of megafunction + output virtual_state_sdr; // sdr state signal of megafunction + output virtual_state_e1dr;// e1dr state signal of megafunction + output virtual_state_pdr; // pdr state signal of megafunction + output virtual_state_e2dr;// e2dr state signal of megafunction + output virtual_state_udr; // udr state signal of megafunction + output virtual_state_cir; // cir state signal of megafunction + output virtual_state_uir; // uir state signal of megafunction + output jtag_state_tlr; // Test, Logic, Reset state + output jtag_state_rti; // Run, Test, Idle state + output jtag_state_sdrs; // Select DR scan state + output jtag_state_cdr; // capture DR state + output jtag_state_sdr; // Shift DR state + output jtag_state_e1dr; // exit 1 dr state + output jtag_state_pdr; // pause dr state + output jtag_state_e2dr; // exit 2 dr state + output jtag_state_udr; // update dr state + output jtag_state_sirs; // Select IR scan state + output jtag_state_cir; // capture IR state + output jtag_state_sir; // shift IR state + output jtag_state_e1ir; // exit 1 IR state + output jtag_state_pir; // pause IR state + output jtag_state_e2ir; // exit 2 IR state + output jtag_state_uir; // update IR state + output tms; // tms signal + output [sld_ir_width - 1 : 0] ir_in; // paraller ir data from megafunction + + // connecting wires + wire tck_i; + wire tms_i; + wire tdi_i; + wire jtag_usr1_i; + wire tdo_i; + wire jtag_tdo_i; + wire jtag_tck_i; + wire jtag_tms_i; + wire jtag_tdi_i; + wire jtag_state_tlr_i; + wire jtag_state_rti_i; + wire jtag_state_drs_i; + wire jtag_state_cdr_i; + wire jtag_state_sdr_i; + wire jtag_state_e1dr_i; + wire jtag_state_pdr_i; + wire jtag_state_e2dr_i; + wire jtag_state_udr_i; + wire jtag_state_irs_i; + wire jtag_state_cir_i; + wire jtag_state_sir_i; + wire jtag_state_e1ir_i; + wire jtag_state_pir_i; + wire jtag_state_e2ir_i; + wire jtag_state_uir_i; + + + // COMPONENT INSTANTIATIONS + // generates input to jtag controller + signal_gen user_input (tck_i,tms_i,tdi_i,jtag_usr1_i,tdo_i); + + // the JTAG TAP controller + jtag_tap_controller jtag (tck_i,tms_i,tdi_i,jtag_tdo_i, + tdo_i,jtag_tck_i,jtag_tms_i,jtag_tdi_i, + jtag_state_tlr_i,jtag_state_rti_i, + jtag_state_drs_i,jtag_state_cdr_i, + jtag_state_sdr_i,jtag_state_e1dr_i, + jtag_state_pdr_i,jtag_state_e2dr_i, + jtag_state_udr_i,jtag_state_irs_i, + jtag_state_cir_i,jtag_state_sir_i, + jtag_state_e1ir_i,jtag_state_pir_i, + jtag_state_e2ir_i,jtag_state_uir_i, + jtag_usr1_i); + + // the HUB + dummy_hub hub (jtag_tck_i,jtag_tdi_i,jtag_tms_i,jtag_usr1_i, + jtag_state_tlr_i,jtag_state_rti_i,jtag_state_drs_i, + jtag_state_cdr_i,jtag_state_sdr_i,jtag_state_e1dr_i, + jtag_state_pdr_i,jtag_state_e2dr_i,jtag_state_udr_i, + jtag_state_irs_i,jtag_state_cir_i,jtag_state_sir_i, + jtag_state_e1ir_i,jtag_state_pir_i,jtag_state_e2ir_i, + jtag_state_uir_i,tdo,ir_out,jtag_tdo_i,tck,tdi,tms, + jtag_state_tlr,jtag_state_rti,jtag_state_sdrs,jtag_state_cdr, + jtag_state_sdr,jtag_state_e1dr,jtag_state_pdr,jtag_state_e2dr, + jtag_state_udr,jtag_state_sirs,jtag_state_cir,jtag_state_sir, + jtag_state_e1ir,jtag_state_pir,jtag_state_e2ir,jtag_state_uir, + virtual_state_cdr,virtual_state_sdr,virtual_state_e1dr, + virtual_state_pdr,virtual_state_e2dr,virtual_state_udr, + virtual_state_cir,virtual_state_uir,ir_in); + +endmodule +// END OF MODULE + + + +//START_MODULE_NAME------------------------------------------------------------ +// +// Module Name : scfifo +// +// Description : Single Clock FIFO +// +// Limitation : +// +// Results expected: +// +//END_MODULE_NAME-------------------------------------------------------------- + +// BEGINNING OF MODULE +`timescale 1 ps / 1 ps + +// MODULE DECLARATION +module scfifo ( data, + clock, + wrreq, + rdreq, + aclr, + sclr, + q, + usedw, + full, + empty, + almost_full, + almost_empty); + +// GLOBAL PARAMETER DECLARATION + parameter lpm_width = 1; + parameter lpm_widthu = 1; + parameter lpm_numwords = 2; + parameter lpm_showahead = "OFF"; + parameter lpm_type = "scfifo"; + parameter lpm_hint = "USE_EAB=ON"; + parameter intended_device_family = "Stratix"; + parameter underflow_checking = "ON"; + parameter overflow_checking = "ON"; + parameter allow_rwcycle_when_full = "OFF"; + parameter use_eab = "ON"; + parameter add_ram_output_register = "OFF"; + parameter almost_full_value = 0; + parameter almost_empty_value = 0; + parameter maximum_depth = 0; + +// LOCAL_PARAMETERS_BEGIN + + parameter showahead_area = ((lpm_showahead == "ON") && (add_ram_output_register == "OFF")); + parameter showahead_speed = ((lpm_showahead == "ON") && (add_ram_output_register == "ON")); + parameter legacy_speed = ((lpm_showahead == "OFF") && (add_ram_output_register == "ON")); + +// LOCAL_PARAMETERS_END + +// INPUT PORT DECLARATION + input [lpm_width-1:0] data; + input clock; + input wrreq; + input rdreq; + input aclr; + input sclr; + +// OUTPUT PORT DECLARATION + output [lpm_width-1:0] q; + output [lpm_widthu-1:0] usedw; + output full; + output empty; + output almost_full; + output almost_empty; + +// INTERNAL REGISTERS DECLARATION + reg [lpm_width-1:0] mem_data [(1< (1 << lpm_widthu))) + begin + $display ("Error! LPM_NUMWORDS must equal to the ceiling of log2(LPM_WIDTHU)."); + $display ("Time: %0t Instance: %m", $time); + end + if (dev.IS_VALID_FAMILY(intended_device_family) == 0) + begin + $display ("Error! Unknown INTENDED_DEVICE_FAMILY=%s.", intended_device_family); + $display ("Time: %0t Instance: %m", $time); + end + if((add_ram_output_register != "ON") && (add_ram_output_register != "OFF")) + begin + $display ("Error! add_ram_output_register must be ON or OFF."); + $display ("Time: %0t Instance: %m", $time); + end + for (i = 0; i < (1< 0) + almost_full_flag <= 1'b0; + if (almost_empty_value > 0) + almost_empty_flag <= 1'b1; + + write_id <= 0; + + if ((use_eab == "ON") && (stratix_family) && ((showahead_speed) || (showahead_area) || (legacy_speed))) + begin + write_latency1 <= 1'bx; + write_latency2 <= 1'bx; + data_shown <= {lpm_width{1'b0}}; + if (add_ram_output_register == "ON") + tmp_q <= {lpm_width{1'b0}}; + else + tmp_q <= {lpm_width{1'bX}}; + end + end + else + begin + if (sclr) + begin + if (add_ram_output_register == "ON") + tmp_q <= {lpm_width{1'b0}}; + else + tmp_q <= {lpm_width{1'bX}}; + + read_id <= 0; + count_id <= 0; + full_flag <= 1'b0; + empty_flag <= 1'b1; + empty_latency1 <= 1'b1; + empty_latency2 <= 1'b1; + set_q_to_x <= 1'b0; + set_q_to_x_by_empty <= 1'b0; + wrt_count <= 0; + + if (almost_full_value > 0) + almost_full_flag <= 1'b0; + if (almost_empty_value > 0) + almost_empty_flag <= 1'b1; + + if (!stratix_family) + begin + if (valid_wreq) + begin + write_flag <= 1'b1; + end + else + write_id <= 0; + end + else + begin + write_id <= 0; + end + + if ((use_eab == "ON") && (stratix_family) && ((showahead_speed) || (showahead_area) || (legacy_speed))) + begin + write_latency1 <= 1'bx; + write_latency2 <= 1'bx; + data_shown <= {lpm_width{1'b0}}; + if (add_ram_output_register == "ON") + tmp_q <= {lpm_width{1'b0}}; + else + tmp_q <= {lpm_width{1'bX}}; + end + end + else + begin + //READ operation + if (valid_rreq) + begin + if (!(set_q_to_x || set_q_to_x_by_empty)) + begin + if (!valid_wreq) + wrt_count <= wrt_count - 1; + + if (!valid_wreq) + begin + full_flag <= 1'b0; + + if (count_id <= 0) + count_id <= {lpm_widthu{1'b1}}; + else + count_id <= count_id - 1; + end + + if ((use_eab == "ON") && stratix_family && (showahead_speed || showahead_area || legacy_speed)) + begin + if ((wrt_count == 1 && valid_rreq && !valid_wreq) || ((wrt_count == 1 ) && valid_wreq && valid_rreq)) + begin + empty_flag <= 1'b1; + end + else + begin + if (showahead_speed) + begin + if (data_shown[write_latency2] == 1'b0) + begin + empty_flag <= 1'b1; + end + end + else if (showahead_area || legacy_speed) + begin + if (data_shown[write_latency1] == 1'b0) + begin + empty_flag <= 1'b1; + end + end + end + end + else + begin + if (!valid_wreq) + begin + if ((count_id == 1) && !(full_flag)) + empty_flag <= 1'b1; + end + end + + if (empty_flag) + begin + if (underflow_checking == "ON") + begin + if ((use_eab == "OFF") || (!stratix_family)) + tmp_q <= {lpm_width{1'b0}}; + end + else + begin + set_q_to_x_by_empty <= 1'b1; + $display ("Warning : Underflow occurred! Fifo output is unknown until the next reset is asserted."); + $display ("Time: %0t Instance: %m", $time); + end + end + else if (read_id >= ((1<= ((1<= (1 << lpm_widthu) - 1) + count_id <= 0; + else + count_id <= count_id + 1; + end + else + begin + if (allow_rwcycle_when_full == "OFF") + full_flag <= 1'b0; + end + + if (!(stratix_family) || (stratix_family && !(showahead_speed || showahead_area || legacy_speed))) + begin + if (!valid_rreq) + if ((count_id == lpm_numwords - 1) && (empty_flag == 1'b0)) + full_flag <= 1'b1; + end + else + begin + if (!valid_rreq) + if (count_id == lpm_numwords - 1) + full_flag <= 1'b1; + end + + if (lpm_showahead == "ON") + begin + if ((use_eab == "ON") && stratix_family && (showahead_speed || showahead_area)) + begin + write_latency1 <= write_id; + data_shown[write_id] <= 1'b1; + data_ready[write_id] <= 1'bx; + end + else + begin + if ((use_eab == "OFF") && stratix_family && (count_id == 0) && (!full_flag)) + begin + tmp_q <= data; + end + else + begin + if ((!empty_flag) && (!valid_rreq)) + begin + tmp_q <= mem_data[read_id]; + end + end + end + end + else + begin + if ((use_eab == "ON") && stratix_family && legacy_speed) + begin + write_latency1 <= write_id; + data_shown[write_id] <= 1'b1; + data_ready[write_id] <= 1'bx; + end + end + end + end + end + + if (almost_full_value == 0) + almost_full_flag <= 1'b1; + else if (lpm_numwords > almost_full_value) + begin + if (almost_full_flag) + begin + if ((count_id == almost_full_value) && !wrreq && rdreq) + almost_full_flag <= 1'b0; + end + else + begin + if ((almost_full_value == 1) && (count_id == 0) && wrreq) + almost_full_flag <= 1'b1; + else if ((almost_full_value > 1) && (count_id == almost_full_value - 1) + && wrreq && !rdreq) + almost_full_flag <= 1'b1; + end + end + + if (almost_empty_value == 0) + almost_empty_flag <= 1'b0; + else if (lpm_numwords > almost_empty_value) + begin + if (almost_empty_flag) + begin + if ((almost_empty_value == 1) && (count_id == 0) && wrreq) + almost_empty_flag <= 1'b0; + else if ((almost_empty_value > 1) && (count_id == almost_empty_value - 1) + && wrreq && !rdreq) + almost_empty_flag <= 1'b0; + end + else + begin + if ((count_id == almost_empty_value) && !wrreq && rdreq) + almost_empty_flag <= 1'b1; + end + end + end + + if ((use_eab == "ON") && stratix_family) + begin + if (showahead_speed) + begin + write_latency2 <= write_latency1; + write_latency3 <= write_latency2; + if (write_latency3 !== write_latency2) + data_ready[write_latency2] <= 1'b1; + + empty_latency2 <= empty_latency1; + + if (data_shown[write_latency2]==1'b1) + begin + if ((read_id == write_latency2) || aclr || sclr) + begin + if (!(aclr === 1'b1) && !(sclr === 1'b1)) + begin + if (write_latency2 !== 1'bx) + begin + tmp_q <= mem_data[write_latency2]; + data_shown[write_latency2] <= 1'b0; + data_ready[write_latency2] <= 1'b0; + + if (!valid_rreq) + empty_flag <= empty_latency2; + end + end + end + end + end + else if (showahead_area) + begin + write_latency2 <= write_latency1; + if (write_latency2 !== write_latency1) + data_ready[write_latency1] <= 1'b1; + + if (data_shown[write_latency1]==1'b1) + begin + if ((read_id == write_latency1) || aclr || sclr) + begin + if (!(aclr === 1'b1) && !(sclr === 1'b1)) + begin + if (write_latency1 !== 1'bx) + begin + tmp_q <= mem_data[write_latency1]; + data_shown[write_latency1] <= 1'b0; + data_ready[write_latency1] <= 1'b0; + + if (!valid_rreq) + begin + empty_flag <= empty_latency1; + end + end + end + end + end + end + else + begin + if (legacy_speed) + begin + write_latency2 <= write_latency1; + if (write_latency2 !== write_latency1) + data_ready[write_latency1] <= 1'b1; + + empty_flag <= empty_latency1; + + if ((wrt_count == 1 && !valid_wreq && valid_rreq) || aclr || sclr) + begin + empty_flag <= 1'b1; + empty_latency1 <= 1'b1; + end + else + begin + if ((wrt_count == 1) && valid_wreq && valid_rreq) + begin + empty_flag <= 1'b1; + end + end + end + end + end + end + end + + always @(negedge clock) + begin + if (write_flag) + begin + write_flag <= 1'b0; + + if (sclr || aclr || (write_id >= ((1 << lpm_widthu) - 1))) + write_id <= 0; + else + write_id <= write_id + 1; + end + + if (!(stratix_family)) + begin + if (!empty) + begin + if ((lpm_showahead == "ON") && ($time > 0)) + tmp_q <= mem_data[read_id]; + end + end + end + + always @(full_flag) + begin + if (lpm_numwords == almost_full_value) + if (full_flag) + almost_full_flag = 1'b1; + else + almost_full_flag = 1'b0; + + if (lpm_numwords == almost_empty_value) + if (full_flag) + almost_empty_flag = 1'b0; + else + almost_empty_flag = 1'b1; + end + +// CONTINOUS ASSIGNMENT + assign q = (set_q_to_x || set_q_to_x_by_empty)? {lpm_width{1'bX}} : tmp_q; + assign full = (set_q_to_x || set_q_to_x_by_empty)? 1'bX : full_flag; + assign empty = (set_q_to_x || set_q_to_x_by_empty)? 1'bX : empty_flag; + assign usedw = (set_q_to_x || set_q_to_x_by_empty)? {lpm_widthu{1'bX}} : count_id; + assign almost_full = (set_q_to_x || set_q_to_x_by_empty)? 1'bX : almost_full_flag; + assign almost_empty = (set_q_to_x || set_q_to_x_by_empty)? 1'bX : almost_empty_flag; + +endmodule // scfifo +// END OF MODULE + + + +//START_MODULE_NAME------------------------------------------------------------ +// +// Module Name : ALTERA_DEVICE_FAMILIES +// +// Description : Common Altera device families comparison +// +// Limitation : +// +// Results expected: +// +//END_MODULE_NAME-------------------------------------------------------------- + +// BEGINNING OF MODULE +`timescale 1 ps / 1 ps + +// MODULE DECLARATION +module ALTERA_DEVICE_FAMILIES; + +function IS_FAMILY_STRATIX; + input[8*20:1] device; + reg is_stratix; +begin + if ((device == "Stratix") || (device == "STRATIX") || (device == "stratix") || (device == "Yeager") || (device == "YEAGER") || (device == "yeager")) + is_stratix = 1; + else + is_stratix = 0; + + IS_FAMILY_STRATIX = is_stratix; +end +endfunction //IS_FAMILY_STRATIX + +function IS_FAMILY_STRATIXGX; + input[8*20:1] device; + reg is_stratixgx; +begin + if ((device == "Stratix GX") || (device == "STRATIX GX") || (device == "stratix gx") || (device == "Stratix-GX") || (device == "STRATIX-GX") || (device == "stratix-gx") || (device == "StratixGX") || (device == "STRATIXGX") || (device == "stratixgx") || (device == "Aurora") || (device == "AURORA") || (device == "aurora")) + is_stratixgx = 1; + else + is_stratixgx = 0; + + IS_FAMILY_STRATIXGX = is_stratixgx; +end +endfunction //IS_FAMILY_STRATIXGX + +function IS_FAMILY_CYCLONE; + input[8*20:1] device; + reg is_cyclone; +begin + if ((device == "Cyclone") || (device == "CYCLONE") || (device == "cyclone") || (device == "ACEX2K") || (device == "acex2k") || (device == "ACEX 2K") || (device == "acex 2k") || (device == "Tornado") || (device == "TORNADO") || (device == "tornado")) + is_cyclone = 1; + else + is_cyclone = 0; + + IS_FAMILY_CYCLONE = is_cyclone; +end +endfunction //IS_FAMILY_CYCLONE + +function IS_FAMILY_MAXII; + input[8*20:1] device; + reg is_maxii; +begin + if ((device == "MAX II") || (device == "max ii") || (device == "MAXII") || (device == "maxii") || (device == "Tsunami") || (device == "TSUNAMI") || (device == "tsunami")) + is_maxii = 1; + else + is_maxii = 0; + + IS_FAMILY_MAXII = is_maxii; +end +endfunction //IS_FAMILY_MAXII + +function IS_FAMILY_STRATIXII; + input[8*20:1] device; + reg is_stratixii; +begin + if ((device == "Stratix II") || (device == "STRATIX II") || (device == "stratix ii") || (device == "StratixII") || (device == "STRATIXII") || (device == "stratixii") || (device == "Armstrong") || (device == "ARMSTRONG") || (device == "armstrong")) + is_stratixii = 1; + else + is_stratixii = 0; + + IS_FAMILY_STRATIXII = is_stratixii; +end +endfunction //IS_FAMILY_STRATIXII + +function IS_FAMILY_STRATIXIIGX; + input[8*20:1] device; + reg is_stratixiigx; +begin + if ((device == "Stratix II GX") || (device == "STRATIX II GX") || (device == "stratix ii gx") || (device == "StratixIIGX") || (device == "STRATIXIIGX") || (device == "stratixiigx")) + is_stratixiigx = 1; + else + is_stratixiigx = 0; + + IS_FAMILY_STRATIXIIGX = is_stratixiigx; +end +endfunction //IS_FAMILY_STRATIXIIGX + +function IS_FAMILY_ARRIAGX; + input[8*20:1] device; + reg is_arriagx; +begin + if ((device == "Arria GX") || (device == "ARRIA GX") || (device == "arria gx") || (device == "ArriaGX") || (device == "ARRIAGX") || (device == "arriagx") || (device == "Stratix II GX Lite") || (device == "STRATIX II GX LITE") || (device == "stratix ii gx lite") || (device == "StratixIIGXLite") || (device == "STRATIXIIGXLITE") || (device == "stratixiigxlite")) + is_arriagx = 1; + else + is_arriagx = 0; + + IS_FAMILY_ARRIAGX = is_arriagx; +end +endfunction //IS_FAMILY_ARRIAGX + +function IS_FAMILY_CYCLONEII; + input[8*20:1] device; + reg is_cycloneii; +begin + if ((device == "Cyclone II") || (device == "CYCLONE II") || (device == "cyclone ii") || (device == "Cycloneii") || (device == "CYCLONEII") || (device == "cycloneii") || (device == "Magellan") || (device == "MAGELLAN") || (device == "magellan")) + is_cycloneii = 1; + else + is_cycloneii = 0; + + IS_FAMILY_CYCLONEII = is_cycloneii; +end +endfunction //IS_FAMILY_CYCLONEII + +function IS_FAMILY_HARDCOPYII; + input[8*20:1] device; + reg is_hardcopyii; +begin + if ((device == "HardCopy II") || (device == "HARDCOPY II") || (device == "hardcopy ii") || (device == "HardCopyII") || (device == "HARDCOPYII") || (device == "hardcopyii") || (device == "Fusion") || (device == "FUSION") || (device == "fusion")) + is_hardcopyii = 1; + else + is_hardcopyii = 0; + + IS_FAMILY_HARDCOPYII = is_hardcopyii; +end +endfunction //IS_FAMILY_HARDCOPYII + +function IS_FAMILY_STRATIXIII; + input[8*20:1] device; + reg is_stratixiii; +begin + if ((device == "Stratix III") || (device == "STRATIX III") || (device == "stratix iii") || (device == "StratixIII") || (device == "STRATIXIII") || (device == "stratixiii") || (device == "Titan") || (device == "TITAN") || (device == "titan") || (device == "SIII") || (device == "siii")) + is_stratixiii = 1; + else + is_stratixiii = 0; + + IS_FAMILY_STRATIXIII = is_stratixiii; +end +endfunction //IS_FAMILY_STRATIXIII + +function IS_FAMILY_CYCLONEIII; + input[8*20:1] device; + reg is_cycloneiii; +begin + if ((device == "Cyclone III") || (device == "CYCLONE III") || (device == "cyclone iii") || (device == "CycloneIII") || (device == "CYCLONEIII") || (device == "cycloneiii") || (device == "Barracuda") || (device == "BARRACUDA") || (device == "barracuda") || (device == "Cuda") || (device == "CUDA") || (device == "cuda") || (device == "CIII") || (device == "ciii")) + is_cycloneiii = 1; + else + is_cycloneiii = 0; + + IS_FAMILY_CYCLONEIII = is_cycloneiii; +end +endfunction //IS_FAMILY_CYCLONEIII + +function IS_FAMILY_STRATIXIV; + input[8*20:1] device; + reg is_stratixiv; +begin + if ((device == "Stratix IV") || (device == "STRATIX IV") || (device == "stratix iv") || (device == "TGX") || (device == "tgx") || (device == "StratixIV") || (device == "STRATIXIV") || (device == "stratixiv") || (device == "Stratix IV (GT)") || (device == "STRATIX IV (GT)") || (device == "stratix iv (gt)") || (device == "Stratix IV (GX)") || (device == "STRATIX IV (GX)") || (device == "stratix iv (gx)") || (device == "Stratix IV (E)") || (device == "STRATIX IV (E)") || (device == "stratix iv (e)") || (device == "StratixIV(GT)") || (device == "STRATIXIV(GT)") || (device == "stratixiv(gt)") || (device == "StratixIV(GX)") || (device == "STRATIXIV(GX)") || (device == "stratixiv(gx)") || (device == "StratixIV(E)") || (device == "STRATIXIV(E)") || (device == "stratixiv(e)") || (device == "StratixIIIGX") || (device == "STRATIXIIIGX") || (device == "stratixiiigx") || (device == "Stratix IV (GT/GX/E)") || (device == "STRATIX IV (GT/GX/E)") || (device == "stratix iv (gt/gx/e)") || (device == "Stratix IV (GT/E/GX)") || (device == "STRATIX IV (GT/E/GX)") || (device == "stratix iv (gt/e/gx)") || (device == "Stratix IV (E/GT/GX)") || (device == "STRATIX IV (E/GT/GX)") || (device == "stratix iv (e/gt/gx)") || (device == "Stratix IV (E/GX/GT)") || (device == "STRATIX IV (E/GX/GT)") || (device == "stratix iv (e/gx/gt)") || (device == "StratixIV(GT/GX/E)") || (device == "STRATIXIV(GT/GX/E)") || (device == "stratixiv(gt/gx/e)") || (device == "StratixIV(GT/E/GX)") || (device == "STRATIXIV(GT/E/GX)") || (device == "stratixiv(gt/e/gx)") || (device == "StratixIV(E/GX/GT)") || (device == "STRATIXIV(E/GX/GT)") || (device == "stratixiv(e/gx/gt)") || (device == "StratixIV(E/GT/GX)") || (device == "STRATIXIV(E/GT/GX)") || (device == "stratixiv(e/gt/gx)") || (device == "Stratix IV (GX/E)") || (device == "STRATIX IV (GX/E)") || (device == "stratix iv (gx/e)") || (device == "StratixIV(GX/E)") || (device == "STRATIXIV(GX/E)") || (device == "stratixiv(gx/e)")) + is_stratixiv = 1; + else + is_stratixiv = 0; + + IS_FAMILY_STRATIXIV = is_stratixiv; +end +endfunction //IS_FAMILY_STRATIXIV + +function IS_FAMILY_ARRIAIIGX; + input[8*20:1] device; + reg is_arriaiigx; +begin + if ((device == "Arria II GX") || (device == "ARRIA II GX") || (device == "arria ii gx") || (device == "ArriaIIGX") || (device == "ARRIAIIGX") || (device == "arriaiigx") || (device == "Arria IIGX") || (device == "ARRIA IIGX") || (device == "arria iigx") || (device == "ArriaII GX") || (device == "ARRIAII GX") || (device == "arriaii gx") || (device == "Arria II") || (device == "ARRIA II") || (device == "arria ii") || (device == "ArriaII") || (device == "ARRIAII") || (device == "arriaii") || (device == "Arria II (GX/E)") || (device == "ARRIA II (GX/E)") || (device == "arria ii (gx/e)") || (device == "ArriaII(GX/E)") || (device == "ARRIAII(GX/E)") || (device == "arriaii(gx/e)") || (device == "PIRANHA") || (device == "piranha")) + is_arriaiigx = 1; + else + is_arriaiigx = 0; + + IS_FAMILY_ARRIAIIGX = is_arriaiigx; +end +endfunction //IS_FAMILY_ARRIAIIGX + +function IS_FAMILY_HARDCOPYIII; + input[8*20:1] device; + reg is_hardcopyiii; +begin + if ((device == "HardCopy III") || (device == "HARDCOPY III") || (device == "hardcopy iii") || (device == "HardCopyIII") || (device == "HARDCOPYIII") || (device == "hardcopyiii") || (device == "HCX") || (device == "hcx")) + is_hardcopyiii = 1; + else + is_hardcopyiii = 0; + + IS_FAMILY_HARDCOPYIII = is_hardcopyiii; +end +endfunction //IS_FAMILY_HARDCOPYIII + +function IS_FAMILY_HARDCOPYIV; + input[8*20:1] device; + reg is_hardcopyiv; +begin + if ((device == "HardCopy IV") || (device == "HARDCOPY IV") || (device == "hardcopy iv") || (device == "HardCopyIV") || (device == "HARDCOPYIV") || (device == "hardcopyiv") || (device == "HardCopy IV (GX)") || (device == "HARDCOPY IV (GX)") || (device == "hardcopy iv (gx)") || (device == "HardCopy IV (E)") || (device == "HARDCOPY IV (E)") || (device == "hardcopy iv (e)") || (device == "HardCopyIV(GX)") || (device == "HARDCOPYIV(GX)") || (device == "hardcopyiv(gx)") || (device == "HardCopyIV(E)") || (device == "HARDCOPYIV(E)") || (device == "hardcopyiv(e)") || (device == "HCXIV") || (device == "hcxiv") || (device == "HardCopy IV (GX/E)") || (device == "HARDCOPY IV (GX/E)") || (device == "hardcopy iv (gx/e)") || (device == "HardCopy IV (E/GX)") || (device == "HARDCOPY IV (E/GX)") || (device == "hardcopy iv (e/gx)") || (device == "HardCopyIV(GX/E)") || (device == "HARDCOPYIV(GX/E)") || (device == "hardcopyiv(gx/e)") || (device == "HardCopyIV(E/GX)") || (device == "HARDCOPYIV(E/GX)") || (device == "hardcopyiv(e/gx)")) + is_hardcopyiv = 1; + else + is_hardcopyiv = 0; + + IS_FAMILY_HARDCOPYIV = is_hardcopyiv; +end +endfunction //IS_FAMILY_HARDCOPYIV + +function IS_FAMILY_CYCLONEIIILS; + input[8*20:1] device; + reg is_cycloneiiils; +begin + if ((device == "Cyclone III LS") || (device == "CYCLONE III LS") || (device == "cyclone iii ls") || (device == "CycloneIIILS") || (device == "CYCLONEIIILS") || (device == "cycloneiiils") || (device == "Cyclone III LPS") || (device == "CYCLONE III LPS") || (device == "cyclone iii lps") || (device == "Cyclone LPS") || (device == "CYCLONE LPS") || (device == "cyclone lps") || (device == "CycloneLPS") || (device == "CYCLONELPS") || (device == "cyclonelps") || (device == "Tarpon") || (device == "TARPON") || (device == "tarpon") || (device == "Cyclone IIIE") || (device == "CYCLONE IIIE") || (device == "cyclone iiie")) + is_cycloneiiils = 1; + else + is_cycloneiiils = 0; + + IS_FAMILY_CYCLONEIIILS = is_cycloneiiils; +end +endfunction //IS_FAMILY_CYCLONEIIILS + +function IS_FAMILY_CYCLONEIVGX; + input[8*20:1] device; + reg is_cycloneivgx; +begin + if ((device == "Cyclone IV GX") || (device == "CYCLONE IV GX") || (device == "cyclone iv gx") || (device == "Cyclone IVGX") || (device == "CYCLONE IVGX") || (device == "cyclone ivgx") || (device == "CycloneIV GX") || (device == "CYCLONEIV GX") || (device == "cycloneiv gx") || (device == "CycloneIVGX") || (device == "CYCLONEIVGX") || (device == "cycloneivgx") || (device == "Cyclone IV") || (device == "CYCLONE IV") || (device == "cyclone iv") || (device == "CycloneIV") || (device == "CYCLONEIV") || (device == "cycloneiv") || (device == "Cyclone IV (GX)") || (device == "CYCLONE IV (GX)") || (device == "cyclone iv (gx)") || (device == "CycloneIV(GX)") || (device == "CYCLONEIV(GX)") || (device == "cycloneiv(gx)") || (device == "Cyclone III GX") || (device == "CYCLONE III GX") || (device == "cyclone iii gx") || (device == "CycloneIII GX") || (device == "CYCLONEIII GX") || (device == "cycloneiii gx") || (device == "Cyclone IIIGX") || (device == "CYCLONE IIIGX") || (device == "cyclone iiigx") || (device == "CycloneIIIGX") || (device == "CYCLONEIIIGX") || (device == "cycloneiiigx") || (device == "Cyclone III GL") || (device == "CYCLONE III GL") || (device == "cyclone iii gl") || (device == "CycloneIII GL") || (device == "CYCLONEIII GL") || (device == "cycloneiii gl") || (device == "Cyclone IIIGL") || (device == "CYCLONE IIIGL") || (device == "cyclone iiigl") || (device == "CycloneIIIGL") || (device == "CYCLONEIIIGL") || (device == "cycloneiiigl") || (device == "Stingray") || (device == "STINGRAY") || (device == "stingray")) + is_cycloneivgx = 1; + else + is_cycloneivgx = 0; + + IS_FAMILY_CYCLONEIVGX = is_cycloneivgx; +end +endfunction //IS_FAMILY_CYCLONEIVGX + +function IS_FAMILY_CYCLONEIVE; + input[8*20:1] device; + reg is_cycloneive; +begin + if ((device == "Cyclone IV E") || (device == "CYCLONE IV E") || (device == "cyclone iv e") || (device == "CycloneIV E") || (device == "CYCLONEIV E") || (device == "cycloneiv e") || (device == "Cyclone IVE") || (device == "CYCLONE IVE") || (device == "cyclone ive") || (device == "CycloneIVE") || (device == "CYCLONEIVE") || (device == "cycloneive")) + is_cycloneive = 1; + else + is_cycloneive = 0; + + IS_FAMILY_CYCLONEIVE = is_cycloneive; +end +endfunction //IS_FAMILY_CYCLONEIVE + +function IS_FAMILY_STRATIXV; + input[8*20:1] device; + reg is_stratixv; +begin + if ((device == "Stratix V") || (device == "STRATIX V") || (device == "stratix v") || (device == "StratixV") || (device == "STRATIXV") || (device == "stratixv") || (device == "Stratix V (GS)") || (device == "STRATIX V (GS)") || (device == "stratix v (gs)") || (device == "StratixV(GS)") || (device == "STRATIXV(GS)") || (device == "stratixv(gs)") || (device == "Stratix V (GX)") || (device == "STRATIX V (GX)") || (device == "stratix v (gx)") || (device == "StratixV(GX)") || (device == "STRATIXV(GX)") || (device == "stratixv(gx)") || (device == "Stratix V (GS/GX)") || (device == "STRATIX V (GS/GX)") || (device == "stratix v (gs/gx)") || (device == "StratixV(GS/GX)") || (device == "STRATIXV(GS/GX)") || (device == "stratixv(gs/gx)") || (device == "Stratix V (GX/GS)") || (device == "STRATIX V (GX/GS)") || (device == "stratix v (gx/gs)") || (device == "StratixV(GX/GS)") || (device == "STRATIXV(GX/GS)") || (device == "stratixv(gx/gs)")) + is_stratixv = 1; + else + is_stratixv = 0; + + IS_FAMILY_STRATIXV = is_stratixv; +end +endfunction //IS_FAMILY_STRATIXV + +function IS_FAMILY_ARRIAIIGZ; + input[8*20:1] device; + reg is_arriaiigz; +begin + if ((device == "Arria II GZ") || (device == "ARRIA II GZ") || (device == "arria ii gz") || (device == "ArriaII GZ") || (device == "ARRIAII GZ") || (device == "arriaii gz") || (device == "Arria IIGZ") || (device == "ARRIA IIGZ") || (device == "arria iigz") || (device == "ArriaIIGZ") || (device == "ARRIAIIGZ") || (device == "arriaiigz")) + is_arriaiigz = 1; + else + is_arriaiigz = 0; + + IS_FAMILY_ARRIAIIGZ = is_arriaiigz; +end +endfunction //IS_FAMILY_ARRIAIIGZ + +function IS_FAMILY_MAXV; + input[8*20:1] device; + reg is_maxv; +begin + if ((device == "MAX V") || (device == "max v") || (device == "MAXV") || (device == "maxv") || (device == "Jade") || (device == "JADE") || (device == "jade")) + is_maxv = 1; + else + is_maxv = 0; + + IS_FAMILY_MAXV = is_maxv; +end +endfunction //IS_FAMILY_MAXV + +function FEATURE_FAMILY_STRATIXGX; + input[8*20:1] device; + reg var_family_stratixgx; +begin + if (IS_FAMILY_STRATIXGX(device) ) + var_family_stratixgx = 1; + else + var_family_stratixgx = 0; + + FEATURE_FAMILY_STRATIXGX = var_family_stratixgx; +end +endfunction //FEATURE_FAMILY_STRATIXGX + +function FEATURE_FAMILY_CYCLONE; + input[8*20:1] device; + reg var_family_cyclone; +begin + if (IS_FAMILY_CYCLONE(device) ) + var_family_cyclone = 1; + else + var_family_cyclone = 0; + + FEATURE_FAMILY_CYCLONE = var_family_cyclone; +end +endfunction //FEATURE_FAMILY_CYCLONE + +function FEATURE_FAMILY_STRATIXIIGX; + input[8*20:1] device; + reg var_family_stratixiigx; +begin + if (IS_FAMILY_STRATIXIIGX(device) || IS_FAMILY_ARRIAGX(device) ) + var_family_stratixiigx = 1; + else + var_family_stratixiigx = 0; + + FEATURE_FAMILY_STRATIXIIGX = var_family_stratixiigx; +end +endfunction //FEATURE_FAMILY_STRATIXIIGX + +function FEATURE_FAMILY_STRATIXIII; + input[8*20:1] device; + reg var_family_stratixiii; +begin + if (IS_FAMILY_STRATIXIII(device) || FEATURE_FAMILY_STRATIXIV(device) || IS_FAMILY_HARDCOPYIII(device) ) + var_family_stratixiii = 1; + else + var_family_stratixiii = 0; + + FEATURE_FAMILY_STRATIXIII = var_family_stratixiii; +end +endfunction //FEATURE_FAMILY_STRATIXIII + +function FEATURE_FAMILY_STRATIXV; + input[8*20:1] device; + reg var_family_stratixv; +begin + if (IS_FAMILY_STRATIXV(device) ) + var_family_stratixv = 1; + else + var_family_stratixv = 0; + + FEATURE_FAMILY_STRATIXV = var_family_stratixv; +end +endfunction //FEATURE_FAMILY_STRATIXV + +function FEATURE_FAMILY_STRATIXII; + input[8*20:1] device; + reg var_family_stratixii; +begin + if (IS_FAMILY_STRATIXII(device) || IS_FAMILY_HARDCOPYII(device) || FEATURE_FAMILY_STRATIXIIGX(device) || FEATURE_FAMILY_STRATIXIII(device) ) + var_family_stratixii = 1; + else + var_family_stratixii = 0; + + FEATURE_FAMILY_STRATIXII = var_family_stratixii; +end +endfunction //FEATURE_FAMILY_STRATIXII + +function FEATURE_FAMILY_CYCLONEIVGX; + input[8*20:1] device; + reg var_family_cycloneivgx; +begin + if (IS_FAMILY_CYCLONEIVGX(device) || IS_FAMILY_CYCLONEIVGX(device) ) + var_family_cycloneivgx = 1; + else + var_family_cycloneivgx = 0; + + FEATURE_FAMILY_CYCLONEIVGX = var_family_cycloneivgx; +end +endfunction //FEATURE_FAMILY_CYCLONEIVGX + +function FEATURE_FAMILY_CYCLONEIVE; + input[8*20:1] device; + reg var_family_cycloneive; +begin + if (IS_FAMILY_CYCLONEIVE(device) ) + var_family_cycloneive = 1; + else + var_family_cycloneive = 0; + + FEATURE_FAMILY_CYCLONEIVE = var_family_cycloneive; +end +endfunction //FEATURE_FAMILY_CYCLONEIVE + +function FEATURE_FAMILY_CYCLONEIII; + input[8*20:1] device; + reg var_family_cycloneiii; +begin + if (IS_FAMILY_CYCLONEIII(device) || IS_FAMILY_CYCLONEIIILS(device) || FEATURE_FAMILY_CYCLONEIVGX(device) || FEATURE_FAMILY_CYCLONEIVE(device) ) + var_family_cycloneiii = 1; + else + var_family_cycloneiii = 0; + + FEATURE_FAMILY_CYCLONEIII = var_family_cycloneiii; +end +endfunction //FEATURE_FAMILY_CYCLONEIII + +function FEATURE_FAMILY_STRATIX_HC; + input[8*20:1] device; + reg var_family_stratix_hc; +begin + if ((device == "StratixHC") ) + var_family_stratix_hc = 1; + else + var_family_stratix_hc = 0; + + FEATURE_FAMILY_STRATIX_HC = var_family_stratix_hc; +end +endfunction //FEATURE_FAMILY_STRATIX_HC + +function FEATURE_FAMILY_STRATIX; + input[8*20:1] device; + reg var_family_stratix; +begin + if (IS_FAMILY_STRATIX(device) || FEATURE_FAMILY_STRATIX_HC(device) || FEATURE_FAMILY_STRATIXGX(device) || FEATURE_FAMILY_CYCLONE(device) || FEATURE_FAMILY_STRATIXII(device) || FEATURE_FAMILY_MAXII(device) || FEATURE_FAMILY_CYCLONEII(device) ) + var_family_stratix = 1; + else + var_family_stratix = 0; + + FEATURE_FAMILY_STRATIX = var_family_stratix; +end +endfunction //FEATURE_FAMILY_STRATIX + +function FEATURE_FAMILY_MAXII; + input[8*20:1] device; + reg var_family_maxii; +begin + if (IS_FAMILY_MAXII(device) || FEATURE_FAMILY_MAXV(device) ) + var_family_maxii = 1; + else + var_family_maxii = 0; + + FEATURE_FAMILY_MAXII = var_family_maxii; +end +endfunction //FEATURE_FAMILY_MAXII + +function FEATURE_FAMILY_MAXV; + input[8*20:1] device; + reg var_family_maxv; +begin + if (IS_FAMILY_MAXV(device) ) + var_family_maxv = 1; + else + var_family_maxv = 0; + + FEATURE_FAMILY_MAXV = var_family_maxv; +end +endfunction //FEATURE_FAMILY_MAXV + +function FEATURE_FAMILY_CYCLONEII; + input[8*20:1] device; + reg var_family_cycloneii; +begin + if (IS_FAMILY_CYCLONEII(device) || FEATURE_FAMILY_CYCLONEIII(device) ) + var_family_cycloneii = 1; + else + var_family_cycloneii = 0; + + FEATURE_FAMILY_CYCLONEII = var_family_cycloneii; +end +endfunction //FEATURE_FAMILY_CYCLONEII + +function FEATURE_FAMILY_STRATIXIV; + input[8*20:1] device; + reg var_family_stratixiv; +begin + if (IS_FAMILY_STRATIXIV(device) || IS_FAMILY_ARRIAIIGX(device) || IS_FAMILY_HARDCOPYIV(device) || FEATURE_FAMILY_STRATIXV(device) || FEATURE_FAMILY_ARRIAIIGZ(device) ) + var_family_stratixiv = 1; + else + var_family_stratixiv = 0; + + FEATURE_FAMILY_STRATIXIV = var_family_stratixiv; +end +endfunction //FEATURE_FAMILY_STRATIXIV + +function FEATURE_FAMILY_ARRIAIIGZ; + input[8*20:1] device; + reg var_family_arriaiigz; +begin + if (IS_FAMILY_ARRIAIIGZ(device) ) + var_family_arriaiigz = 1; + else + var_family_arriaiigz = 0; + + FEATURE_FAMILY_ARRIAIIGZ = var_family_arriaiigz; +end +endfunction //FEATURE_FAMILY_ARRIAIIGZ + +function FEATURE_FAMILY_ARRIAIIGX; + input[8*20:1] device; + reg var_family_arriaiigx; +begin + if (IS_FAMILY_ARRIAIIGX(device) ) + var_family_arriaiigx = 1; + else + var_family_arriaiigx = 0; + + FEATURE_FAMILY_ARRIAIIGX = var_family_arriaiigx; +end +endfunction //FEATURE_FAMILY_ARRIAIIGX + +function FEATURE_FAMILY_BASE_STRATIXII; + input[8*20:1] device; + reg var_family_base_stratixii; +begin + if (IS_FAMILY_STRATIXII(device) || IS_FAMILY_HARDCOPYII(device) || FEATURE_FAMILY_STRATIXIIGX(device) ) + var_family_base_stratixii = 1; + else + var_family_base_stratixii = 0; + + FEATURE_FAMILY_BASE_STRATIXII = var_family_base_stratixii; +end +endfunction //FEATURE_FAMILY_BASE_STRATIXII + +function FEATURE_FAMILY_BASE_STRATIX; + input[8*20:1] device; + reg var_family_base_stratix; +begin + if (IS_FAMILY_STRATIX(device) || IS_FAMILY_STRATIXGX(device) ) + var_family_base_stratix = 1; + else + var_family_base_stratix = 0; + + FEATURE_FAMILY_BASE_STRATIX = var_family_base_stratix; +end +endfunction //FEATURE_FAMILY_BASE_STRATIX + +function FEATURE_FAMILY_BASE_CYCLONEII; + input[8*20:1] device; + reg var_family_base_cycloneii; +begin + if (IS_FAMILY_CYCLONEII(device) ) + var_family_base_cycloneii = 1; + else + var_family_base_cycloneii = 0; + + FEATURE_FAMILY_BASE_CYCLONEII = var_family_base_cycloneii; +end +endfunction //FEATURE_FAMILY_BASE_CYCLONEII + +function FEATURE_FAMILY_BASE_CYCLONE; + input[8*20:1] device; + reg var_family_base_cyclone; +begin + if (IS_FAMILY_CYCLONE(device) ) + var_family_base_cyclone = 1; + else + var_family_base_cyclone = 0; + + FEATURE_FAMILY_BASE_CYCLONE = var_family_base_cyclone; +end +endfunction //FEATURE_FAMILY_BASE_CYCLONE + +function FEATURE_FAMILY_HAS_STRATIXII_STYLE_RAM; + input[8*20:1] device; + reg var_family_has_stratixii_style_ram; +begin + if (FEATURE_FAMILY_STRATIXII(device) || FEATURE_FAMILY_CYCLONEII(device) ) + var_family_has_stratixii_style_ram = 1; + else + var_family_has_stratixii_style_ram = 0; + + FEATURE_FAMILY_HAS_STRATIXII_STYLE_RAM = var_family_has_stratixii_style_ram; +end +endfunction //FEATURE_FAMILY_HAS_STRATIXII_STYLE_RAM + +function FEATURE_FAMILY_HAS_STRATIXIII_STYLE_RAM; + input[8*20:1] device; + reg var_family_has_stratixiii_style_ram; +begin + if (FEATURE_FAMILY_STRATIXIII(device) || FEATURE_FAMILY_CYCLONEIII(device) ) + var_family_has_stratixiii_style_ram = 1; + else + var_family_has_stratixiii_style_ram = 0; + + FEATURE_FAMILY_HAS_STRATIXIII_STYLE_RAM = var_family_has_stratixiii_style_ram; +end +endfunction //FEATURE_FAMILY_HAS_STRATIXIII_STYLE_RAM + +function FEATURE_FAMILY_HAS_STRATIX_STYLE_PLL; + input[8*20:1] device; + reg var_family_has_stratix_style_pll; +begin + if (FEATURE_FAMILY_CYCLONE(device) || FEATURE_FAMILY_STRATIX_HC(device) || IS_FAMILY_STRATIX(device) || FEATURE_FAMILY_STRATIXGX(device) ) + var_family_has_stratix_style_pll = 1; + else + var_family_has_stratix_style_pll = 0; + + FEATURE_FAMILY_HAS_STRATIX_STYLE_PLL = var_family_has_stratix_style_pll; +end +endfunction //FEATURE_FAMILY_HAS_STRATIX_STYLE_PLL + +function FEATURE_FAMILY_HAS_STRATIXII_STYLE_PLL; + input[8*20:1] device; + reg var_family_has_stratixii_style_pll; +begin + if (FEATURE_FAMILY_STRATIXII(device) && ! FEATURE_FAMILY_STRATIXIII(device) || FEATURE_FAMILY_CYCLONEII(device) && ! FEATURE_FAMILY_CYCLONEIII(device) ) + var_family_has_stratixii_style_pll = 1; + else + var_family_has_stratixii_style_pll = 0; + + FEATURE_FAMILY_HAS_STRATIXII_STYLE_PLL = var_family_has_stratixii_style_pll; +end +endfunction //FEATURE_FAMILY_HAS_STRATIXII_STYLE_PLL + +function FEATURE_FAMILY_HAS_INVERTED_OUTPUT_DDIO; + input[8*20:1] device; + reg var_family_has_inverted_output_ddio; +begin + if (FEATURE_FAMILY_CYCLONEII(device) ) + var_family_has_inverted_output_ddio = 1; + else + var_family_has_inverted_output_ddio = 0; + + FEATURE_FAMILY_HAS_INVERTED_OUTPUT_DDIO = var_family_has_inverted_output_ddio; +end +endfunction //FEATURE_FAMILY_HAS_INVERTED_OUTPUT_DDIO + +function IS_VALID_FAMILY; + input[8*20:1] device; + reg is_valid; +begin + if (((device == "MAX7000B") || (device == "max7000b") || (device == "MAX 7000B") || (device == "max 7000b")) + || ((device == "MAX7000AE") || (device == "max7000ae") || (device == "MAX 7000AE") || (device == "max 7000ae")) + || ((device == "MAX3000A") || (device == "max3000a") || (device == "MAX 3000A") || (device == "max 3000a")) + || ((device == "MAX7000S") || (device == "max7000s") || (device == "MAX 7000S") || (device == "max 7000s")) + || ((device == "Stratix") || (device == "STRATIX") || (device == "stratix") || (device == "Yeager") || (device == "YEAGER") || (device == "yeager")) + || ((device == "Stratix GX") || (device == "STRATIX GX") || (device == "stratix gx") || (device == "Stratix-GX") || (device == "STRATIX-GX") || (device == "stratix-gx") || (device == "StratixGX") || (device == "STRATIXGX") || (device == "stratixgx") || (device == "Aurora") || (device == "AURORA") || (device == "aurora")) + || ((device == "Cyclone") || (device == "CYCLONE") || (device == "cyclone") || (device == "ACEX2K") || (device == "acex2k") || (device == "ACEX 2K") || (device == "acex 2k") || (device == "Tornado") || (device == "TORNADO") || (device == "tornado")) + || ((device == "MAX II") || (device == "max ii") || (device == "MAXII") || (device == "maxii") || (device == "Tsunami") || (device == "TSUNAMI") || (device == "tsunami")) + || ((device == "Stratix II") || (device == "STRATIX II") || (device == "stratix ii") || (device == "StratixII") || (device == "STRATIXII") || (device == "stratixii") || (device == "Armstrong") || (device == "ARMSTRONG") || (device == "armstrong")) + || ((device == "Stratix II GX") || (device == "STRATIX II GX") || (device == "stratix ii gx") || (device == "StratixIIGX") || (device == "STRATIXIIGX") || (device == "stratixiigx")) + || ((device == "Arria GX") || (device == "ARRIA GX") || (device == "arria gx") || (device == "ArriaGX") || (device == "ARRIAGX") || (device == "arriagx") || (device == "Stratix II GX Lite") || (device == "STRATIX II GX LITE") || (device == "stratix ii gx lite") || (device == "StratixIIGXLite") || (device == "STRATIXIIGXLITE") || (device == "stratixiigxlite")) + || ((device == "Cyclone II") || (device == "CYCLONE II") || (device == "cyclone ii") || (device == "Cycloneii") || (device == "CYCLONEII") || (device == "cycloneii") || (device == "Magellan") || (device == "MAGELLAN") || (device == "magellan")) + || ((device == "HardCopy II") || (device == "HARDCOPY II") || (device == "hardcopy ii") || (device == "HardCopyII") || (device == "HARDCOPYII") || (device == "hardcopyii") || (device == "Fusion") || (device == "FUSION") || (device == "fusion")) + || ((device == "Stratix III") || (device == "STRATIX III") || (device == "stratix iii") || (device == "StratixIII") || (device == "STRATIXIII") || (device == "stratixiii") || (device == "Titan") || (device == "TITAN") || (device == "titan") || (device == "SIII") || (device == "siii")) + || ((device == "Cyclone III") || (device == "CYCLONE III") || (device == "cyclone iii") || (device == "CycloneIII") || (device == "CYCLONEIII") || (device == "cycloneiii") || (device == "Barracuda") || (device == "BARRACUDA") || (device == "barracuda") || (device == "Cuda") || (device == "CUDA") || (device == "cuda") || (device == "CIII") || (device == "ciii")) + || ((device == "BS") || (device == "bs")) + || ((device == "Stratix IV") || (device == "STRATIX IV") || (device == "stratix iv") || (device == "TGX") || (device == "tgx") || (device == "StratixIV") || (device == "STRATIXIV") || (device == "stratixiv") || (device == "Stratix IV (GT)") || (device == "STRATIX IV (GT)") || (device == "stratix iv (gt)") || (device == "Stratix IV (GX)") || (device == "STRATIX IV (GX)") || (device == "stratix iv (gx)") || (device == "Stratix IV (E)") || (device == "STRATIX IV (E)") || (device == "stratix iv (e)") || (device == "StratixIV(GT)") || (device == "STRATIXIV(GT)") || (device == "stratixiv(gt)") || (device == "StratixIV(GX)") || (device == "STRATIXIV(GX)") || (device == "stratixiv(gx)") || (device == "StratixIV(E)") || (device == "STRATIXIV(E)") || (device == "stratixiv(e)") || (device == "StratixIIIGX") || (device == "STRATIXIIIGX") || (device == "stratixiiigx") || (device == "Stratix IV (GT/GX/E)") || (device == "STRATIX IV (GT/GX/E)") || (device == "stratix iv (gt/gx/e)") || (device == "Stratix IV (GT/E/GX)") || (device == "STRATIX IV (GT/E/GX)") || (device == "stratix iv (gt/e/gx)") || (device == "Stratix IV (E/GT/GX)") || (device == "STRATIX IV (E/GT/GX)") || (device == "stratix iv (e/gt/gx)") || (device == "Stratix IV (E/GX/GT)") || (device == "STRATIX IV (E/GX/GT)") || (device == "stratix iv (e/gx/gt)") || (device == "StratixIV(GT/GX/E)") || (device == "STRATIXIV(GT/GX/E)") || (device == "stratixiv(gt/gx/e)") || (device == "StratixIV(GT/E/GX)") || (device == "STRATIXIV(GT/E/GX)") || (device == "stratixiv(gt/e/gx)") || (device == "StratixIV(E/GX/GT)") || (device == "STRATIXIV(E/GX/GT)") || (device == "stratixiv(e/gx/gt)") || (device == "StratixIV(E/GT/GX)") || (device == "STRATIXIV(E/GT/GX)") || (device == "stratixiv(e/gt/gx)") || (device == "Stratix IV (GX/E)") || (device == "STRATIX IV (GX/E)") || (device == "stratix iv (gx/e)") || (device == "StratixIV(GX/E)") || (device == "STRATIXIV(GX/E)") || (device == "stratixiv(gx/e)")) + || ((device == "tgx_commercial_v1_1") || (device == "TGX_COMMERCIAL_V1_1")) + || ((device == "Arria II GX") || (device == "ARRIA II GX") || (device == "arria ii gx") || (device == "ArriaIIGX") || (device == "ARRIAIIGX") || (device == "arriaiigx") || (device == "Arria IIGX") || (device == "ARRIA IIGX") || (device == "arria iigx") || (device == "ArriaII GX") || (device == "ARRIAII GX") || (device == "arriaii gx") || (device == "Arria II") || (device == "ARRIA II") || (device == "arria ii") || (device == "ArriaII") || (device == "ARRIAII") || (device == "arriaii") || (device == "Arria II (GX/E)") || (device == "ARRIA II (GX/E)") || (device == "arria ii (gx/e)") || (device == "ArriaII(GX/E)") || (device == "ARRIAII(GX/E)") || (device == "arriaii(gx/e)") || (device == "PIRANHA") || (device == "piranha")) + || ((device == "HardCopy III") || (device == "HARDCOPY III") || (device == "hardcopy iii") || (device == "HardCopyIII") || (device == "HARDCOPYIII") || (device == "hardcopyiii") || (device == "HCX") || (device == "hcx")) + || ((device == "HardCopy IV") || (device == "HARDCOPY IV") || (device == "hardcopy iv") || (device == "HardCopyIV") || (device == "HARDCOPYIV") || (device == "hardcopyiv") || (device == "HardCopy IV (GX)") || (device == "HARDCOPY IV (GX)") || (device == "hardcopy iv (gx)") || (device == "HardCopy IV (E)") || (device == "HARDCOPY IV (E)") || (device == "hardcopy iv (e)") || (device == "HardCopyIV(GX)") || (device == "HARDCOPYIV(GX)") || (device == "hardcopyiv(gx)") || (device == "HardCopyIV(E)") || (device == "HARDCOPYIV(E)") || (device == "hardcopyiv(e)") || (device == "HCXIV") || (device == "hcxiv") || (device == "HardCopy IV (GX/E)") || (device == "HARDCOPY IV (GX/E)") || (device == "hardcopy iv (gx/e)") || (device == "HardCopy IV (E/GX)") || (device == "HARDCOPY IV (E/GX)") || (device == "hardcopy iv (e/gx)") || (device == "HardCopyIV(GX/E)") || (device == "HARDCOPYIV(GX/E)") || (device == "hardcopyiv(gx/e)") || (device == "HardCopyIV(E/GX)") || (device == "HARDCOPYIV(E/GX)") || (device == "hardcopyiv(e/gx)")) + || ((device == "Cyclone III LS") || (device == "CYCLONE III LS") || (device == "cyclone iii ls") || (device == "CycloneIIILS") || (device == "CYCLONEIIILS") || (device == "cycloneiiils") || (device == "Cyclone III LPS") || (device == "CYCLONE III LPS") || (device == "cyclone iii lps") || (device == "Cyclone LPS") || (device == "CYCLONE LPS") || (device == "cyclone lps") || (device == "CycloneLPS") || (device == "CYCLONELPS") || (device == "cyclonelps") || (device == "Tarpon") || (device == "TARPON") || (device == "tarpon") || (device == "Cyclone IIIE") || (device == "CYCLONE IIIE") || (device == "cyclone iiie")) + || ((device == "Cyclone IV GX") || (device == "CYCLONE IV GX") || (device == "cyclone iv gx") || (device == "Cyclone IVGX") || (device == "CYCLONE IVGX") || (device == "cyclone ivgx") || (device == "CycloneIV GX") || (device == "CYCLONEIV GX") || (device == "cycloneiv gx") || (device == "CycloneIVGX") || (device == "CYCLONEIVGX") || (device == "cycloneivgx") || (device == "Cyclone IV") || (device == "CYCLONE IV") || (device == "cyclone iv") || (device == "CycloneIV") || (device == "CYCLONEIV") || (device == "cycloneiv") || (device == "Cyclone IV (GX)") || (device == "CYCLONE IV (GX)") || (device == "cyclone iv (gx)") || (device == "CycloneIV(GX)") || (device == "CYCLONEIV(GX)") || (device == "cycloneiv(gx)") || (device == "Cyclone III GX") || (device == "CYCLONE III GX") || (device == "cyclone iii gx") || (device == "CycloneIII GX") || (device == "CYCLONEIII GX") || (device == "cycloneiii gx") || (device == "Cyclone IIIGX") || (device == "CYCLONE IIIGX") || (device == "cyclone iiigx") || (device == "CycloneIIIGX") || (device == "CYCLONEIIIGX") || (device == "cycloneiiigx") || (device == "Cyclone III GL") || (device == "CYCLONE III GL") || (device == "cyclone iii gl") || (device == "CycloneIII GL") || (device == "CYCLONEIII GL") || (device == "cycloneiii gl") || (device == "Cyclone IIIGL") || (device == "CYCLONE IIIGL") || (device == "cyclone iiigl") || (device == "CycloneIIIGL") || (device == "CYCLONEIIIGL") || (device == "cycloneiiigl") || (device == "Stingray") || (device == "STINGRAY") || (device == "stingray")) + || ((device == "Cyclone IV E") || (device == "CYCLONE IV E") || (device == "cyclone iv e") || (device == "CycloneIV E") || (device == "CYCLONEIV E") || (device == "cycloneiv e") || (device == "Cyclone IVE") || (device == "CYCLONE IVE") || (device == "cyclone ive") || (device == "CycloneIVE") || (device == "CYCLONEIVE") || (device == "cycloneive")) + || ((device == "Stratix V") || (device == "STRATIX V") || (device == "stratix v") || (device == "StratixV") || (device == "STRATIXV") || (device == "stratixv") || (device == "Stratix V (GS)") || (device == "STRATIX V (GS)") || (device == "stratix v (gs)") || (device == "StratixV(GS)") || (device == "STRATIXV(GS)") || (device == "stratixv(gs)") || (device == "Stratix V (GX)") || (device == "STRATIX V (GX)") || (device == "stratix v (gx)") || (device == "StratixV(GX)") || (device == "STRATIXV(GX)") || (device == "stratixv(gx)") || (device == "Stratix V (GS/GX)") || (device == "STRATIX V (GS/GX)") || (device == "stratix v (gs/gx)") || (device == "StratixV(GS/GX)") || (device == "STRATIXV(GS/GX)") || (device == "stratixv(gs/gx)") || (device == "Stratix V (GX/GS)") || (device == "STRATIX V (GX/GS)") || (device == "stratix v (gx/gs)") || (device == "StratixV(GX/GS)") || (device == "STRATIXV(GX/GS)") || (device == "stratixv(gx/gs)")) + || ((device == "Arria II GZ") || (device == "ARRIA II GZ") || (device == "arria ii gz") || (device == "ArriaII GZ") || (device == "ARRIAII GZ") || (device == "arriaii gz") || (device == "Arria IIGZ") || (device == "ARRIA IIGZ") || (device == "arria iigz") || (device == "ArriaIIGZ") || (device == "ARRIAIIGZ") || (device == "arriaiigz")) + || ((device == "arriaiigz_commercial_v1_1") || (device == "ARRIAIIGZ_COMMERCIAL_V1_1")) + || ((device == "MAX V") || (device == "max v") || (device == "MAXV") || (device == "maxv") || (device == "Jade") || (device == "JADE") || (device == "jade")) + || ((device == "ArriaV") || (device == "ARRIAV") || (device == "arriav") || (device == "Arria V") || (device == "ARRIA V") || (device == "arria v"))) + is_valid = 1; + else + is_valid = 0; + + IS_VALID_FAMILY = is_valid; +end +endfunction // IS_VALID_FAMILY + + +endmodule // ALTERA_DEVICE_FAMILIES + Index: tags/v2p2/sim/reg_bfm_sv.v =================================================================== --- tags/v2p2/sim/reg_bfm_sv.v (nonexistent) +++ tags/v2p2/sim/reg_bfm_sv.v (revision 16) @@ -0,0 +1,38 @@ +//************************************************************** +// Module : reg_bfm_sv.v +// Platform : Windows xp sp2 +// Simulator : Modelsim 6.5b +// Synthesizer : +// Place and Route : +// Targets device : +// Author : Bibo Yang (ash_riple@hotmail.com) +// Organization : www.opencores.org +// Revision : 2.2 +// Date : 2012/03/28 +// Description : Register BFM +//************************************************************** + +`timescale 1ns/1ns + +module reg_bfm_sv ( + input up_clk, + input up_wbe,up_csn, // negative logic + input [15:0] up_addr, + inout [31:0] up_data_io +); + +wire [31:0] up_data_i; +reg [31:0] up_data_o; + +assign #10 up_data_io = (up_wbe&&!up_csn)? up_data_o : 32'bzzzzzzzz; +assign up_data_i = up_data_io; + +reg [31:0] RAM [0:3]; +always @(posedge up_clk) begin + if (!up_wbe && !up_csn) + RAM[up_addr[3:2]] <= up_data_i; + + up_data_o <= RAM[up_addr[3:2]]; +end + +endmodule Index: tags/v2p2/sim/up_bfm_sv.v =================================================================== --- tags/v2p2/sim/up_bfm_sv.v (nonexistent) +++ tags/v2p2/sim/up_bfm_sv.v (revision 16) @@ -0,0 +1,86 @@ +`timescale 1ns/1ns + +module up_bfm_sv +( + input up_clk, + output up_wbe, + output up_csn, + output [15:2] up_addr, + inout [31:0] up_data_io +); + +import "DPI-C" context task up_bfm_c +( + input real fw_delay +); + +reg [15:0] up_addr_o; +reg [31:0] up_data_o; +wire [31:0] up_data_i; +reg up_wbe_o; +reg up_csn_o; + +export "DPI-C" task cpu_wr; +task cpu_wr(input int addr, input int data); + integer i; + //$display("wr %08x %08x", addr, data); + for (i=0; i<2; i=i+1) @(posedge up_clk); + up_addr_o = addr; + up_data_o = data; + up_wbe_o = 1'b0; + up_csn_o = 1'b0; + for (i=0; i<20; i=i+1) @(posedge up_clk); + up_csn_o = 1'b1; + for (i=0; i<1; i=i+1) @(posedge up_clk); + up_addr_o = addr; + up_data_o = data; + up_wbe_o = 1'b1; + up_csn_o = 1'b1; + for (i=0; i<2; i=i+1) @(posedge up_clk); +endtask + +export "DPI-C" task cpu_rd; +task cpu_rd(input int addr, output int data); + integer i; + for (i=0; i<2; i=i+1) @(posedge up_clk); + up_addr_o = addr; + up_wbe_o = 1'b1; + up_csn_o = 1'b0; + for (i=0; i<20; i=i+1) @(posedge up_clk); + data = up_data_i; + for (i=0; i<1; i=i+1) @(posedge up_clk); + up_addr_o = addr; + up_wbe_o = 1'b1; + up_csn_o = 1'b1; + for (i=0; i<2; i=i+1) @(posedge up_clk); + //$display("rd %08x %08x", addr, data); +endtask + +export "DPI-C" task cpu_hd; +task cpu_hd(input int t); + integer i; + //$display("#%d",t); + for (i=0; i<=t; i=i+1) @(posedge up_clk); +endtask + +assign up_wbe = up_wbe_o; +assign up_csn = up_csn_o; +assign up_addr = up_addr_o[15:2]; +assign up_data_io = !up_wbe_o? up_data_o : 32'bzzzzzzzz; +assign up_data_i = up_data_io; + + + +// start cpu bfm C model +reg up_start; +initial begin + up_wbe_o = 1'b1; + up_csn_o = 1'b1; + up_addr_o = 'd0; + up_data_o = 'd0; + + @(posedge up_start); + #100 up_bfm_c(5); +end + +endmodule Index: tags/v2p2/sim/up_bfm_c.c =================================================================== --- tags/v2p2/sim/up_bfm_c.c (nonexistent) +++ tags/v2p2/sim/up_bfm_c.c (revision 16) @@ -0,0 +1,28 @@ +#include + +#include "svdpi.h" +#include "dpiheader.h" +int up_bfm_c(double fw_delay) +{ + int cpu_addr_i; + int cpu_data_i; + int cpu_data_o; + + int t; + for (t=0; t<=4000; t=t+4) + { + + cpu_addr_i = 0x0000c0a0+t; + cpu_data_i = t+0; + cpu_wr(cpu_addr_i, cpu_data_i); + + cpu_hd(50); + + cpu_addr_i = 0x0000c0a0+t; + cpu_rd(cpu_addr_i, &cpu_data_o); + + cpu_hd(100); + } + + return(0); /* Return success (required by tasks) */ +} Index: tags/v2p2/doc/references/United States Patent US6931524.pdf =================================================================== Cannot display: file marked as a binary type. svn:mime-type = application/octet-stream Index: tags/v2p2/doc/references/United States Patent US6931524.pdf =================================================================== --- tags/v2p2/doc/references/United States Patent US6931524.pdf (nonexistent) +++ tags/v2p2/doc/references/United States Patent US6931524.pdf (revision 16)
tags/v2p2/doc/references/United States Patent US6931524.pdf Property changes : Added: svn:mime-type ## -0,0 +1 ## +application/octet-stream \ No newline at end of property Index: tags/v2p2/doc/references/A Hardware and Software Monitor for High-Level System-on-Chip Verification.pdf =================================================================== Cannot display: file marked as a binary type. svn:mime-type = application/octet-stream Index: tags/v2p2/doc/references/A Hardware and Software Monitor for High-Level System-on-Chip Verification.pdf =================================================================== --- tags/v2p2/doc/references/A Hardware and Software Monitor for High-Level System-on-Chip Verification.pdf (nonexistent) +++ tags/v2p2/doc/references/A Hardware and Software Monitor for High-Level System-on-Chip Verification.pdf (revision 16)
tags/v2p2/doc/references/A Hardware and Software Monitor for High-Level System-on-Chip Verification.pdf Property changes : Added: svn:mime-type ## -0,0 +1 ## +application/octet-stream \ No newline at end of property Index: tags/v2p2/doc/Revision History.txt =================================================================== --- tags/v2p2/doc/Revision History.txt (nonexistent) +++ tags/v2p2/doc/Revision History.txt (revision 16) @@ -0,0 +1,7 @@ + +1.0 Code base as published on EDN. + +2.0 Code base for 2.x development. Added pipelined bus access capture support. + +2.1 Added new features: 1. Multiple address filter selection; 2. Read access capture support; 3. Full trigger condition support; 4. Updated GUI; 5. Updated wrapper example with glitch filter and stable address/data capture. + Index: tags/v2p2/doc/Debug a microcontroller-to-FPGA interface from the FPGA side.pdf =================================================================== Cannot display: file marked as a binary type. svn:mime-type = application/octet-stream Index: tags/v2p2/doc/Debug a microcontroller-to-FPGA interface from the FPGA side.pdf =================================================================== --- tags/v2p2/doc/Debug a microcontroller-to-FPGA interface from the FPGA side.pdf (nonexistent) +++ tags/v2p2/doc/Debug a microcontroller-to-FPGA interface from the FPGA side.pdf (revision 16)
tags/v2p2/doc/Debug a microcontroller-to-FPGA interface from the FPGA side.pdf Property changes : Added: svn:mime-type ## -0,0 +1 ## +application/octet-stream \ No newline at end of property Index: tags/v2p2/par/altera/up_monitor.qsf =================================================================== --- tags/v2p2/par/altera/up_monitor.qsf (nonexistent) +++ tags/v2p2/par/altera/up_monitor.qsf (revision 16) @@ -0,0 +1,45 @@ +# Copyright (C) 1991-2006 Altera Corporation +# Your use of Altera Corporation's design tools, logic functions +# and other software and tools, and its AMPP partner logic +# functions, and any output files from any of the foregoing +# (including device programming or simulation files), and any +# associated documentation or information are expressly subject +# to the terms and conditions of the Altera Program License +# Subscription Agreement, Altera MegaCore Function License +# Agreement, or other applicable license agreement, including, +# without limitation, that your use is for the sole purpose of +# programming logic devices manufactured by Altera and sold by +# Altera or its authorized distributors. Please refer to the +# applicable agreement for further details. + + +# The default values for assignments are stored in the file +# up_monitor_assignment_defaults.qdf +# If this file doesn't exist, and for assignments not listed, see file +# assignment_defaults.qdf + +# Altera recommends that you do not modify this file. This +# file is updated automatically by the Quartus II software +# and any changes you make may be lost or overwritten. + + +set_global_assignment -name DEVICE Auto +set_global_assignment -name FAMILY "Cyclone III" +set_global_assignment -name TOP_LEVEL_ENTITY up_monitor_wrapper +set_global_assignment -name ORIGINAL_QUARTUS_VERSION 6.1 +set_global_assignment -name PROJECT_CREATION_TIME_DATE "18:33:38 JUNE 01, 2009" +set_global_assignment -name LAST_QUARTUS_VERSION "10.1 SP1" +set_global_assignment -name ENABLE_ADVANCED_IO_TIMING OFF +set_global_assignment -name PROJECT_OUTPUT_DIRECTORY output + +set_global_assignment -name VERILOG_FILE ../../rtl/up_monitor_wrapper.v +set_global_assignment -name VERILOG_FILE ../../rtl/up_monitor.v +set_global_assignment -name VERILOG_FILE ../../rtl/altera/virtual_jtag_addr_mask.v +set_global_assignment -name VERILOG_FILE ../../rtl/altera/virtual_jtag_adda_fifo.v +set_global_assignment -name VERILOG_FILE ../../rtl/altera/virtual_jtag_adda_trig.v + +set_global_assignment -name PARTITION_NETLIST_TYPE SOURCE -section_id Top +set_global_assignment -name PARTITION_FITTER_PRESERVATION_LEVEL PLACEMENT_AND_ROUTING -section_id Top +set_global_assignment -name PARTITION_COLOR 16764057 -section_id Top + +set_instance_assignment -name PARTITION_HIERARCHY root_partition -to | -section_id Top Index: tags/v2p2/par/altera/up_monitor.qpf =================================================================== --- tags/v2p2/par/altera/up_monitor.qpf (nonexistent) +++ tags/v2p2/par/altera/up_monitor.qpf (revision 16) @@ -0,0 +1,23 @@ +# Copyright (C) 1991-2006 Altera Corporation +# Your use of Altera Corporation's design tools, logic functions +# and other software and tools, and its AMPP partner logic +# functions, and any output files from any of the foregoing +# (including device programming or simulation files), and any +# associated documentation or information are expressly subject +# to the terms and conditions of the Altera Program License +# Subscription Agreement, Altera MegaCore Function License +# Agreement, or other applicable license agreement, including, +# without limitation, that your use is for the sole purpose of +# programming logic devices manufactured by Altera and sold by +# Altera or its authorized distributors. Please refer to the +# applicable agreement for further details. + + + +QUARTUS_VERSION = "6.1" +DATE = "18:33:38 June 01, 2009" + + +# Revisions + +PROJECT_REVISION = "up_monitor"

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.