Skip to content

Commit c3b0e74

Browse files
authored
Merge pull request #114 from os-fpga/pass_sim_1.5.1
Pulling SIMs release 1.5.1 into main.
2 parents 6b81e47 + 9f6470c commit c3b0e74

File tree

3 files changed

+277
-0
lines changed

3 files changed

+277
-0
lines changed

blackbox_models/cell_sim_blackbox.v

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -582,6 +582,42 @@ module LUT6 #(
582582
endmodule
583583
`endcelldefine
584584
//
585+
// MIPI_RX black box model
586+
// MIPI Receiver
587+
//
588+
// Copyright (c) 2024 Rapid Silicon, Inc. All rights reserved.
589+
//
590+
`celldefine
591+
(* blackbox *)
592+
module MIPI_RX #(
593+
parameter WIDTH = 4, // Width of input data to serializer (3-10)
594+
parameter EN_IDLY = "FALSE", // True or False
595+
parameter DELAY = 0 // Fixed TAP delay value (0-63)
596+
) (
597+
input logic RST,
598+
input logic RX_CLK,
599+
input logic PLL_LOCK,
600+
(* clkbuf_sink *)
601+
input logic CLK_IN,
602+
input logic RX_DP,
603+
input logic RX_DN,
604+
input logic HS_EN,
605+
input logic LP_EN,
606+
input logic RX_TERM_EN,
607+
input logic BITSLIP_ADJ,
608+
input logic DLY_LOAD,
609+
input logic DLY_ADJ,
610+
input logic DLY_INCDEC,
611+
output logic [5:0] DLY_TAP_VALUE,
612+
output logic [WIDTH-1:0] HS_RX_DATA,
613+
output logic HS_RXD_VALID,
614+
output logic RX_OE,
615+
output logic LP_RX_DP,
616+
output logic LP_RX_DN
617+
);
618+
endmodule
619+
`endcelldefine
620+
//
585621
// MIPI_TX black box model
586622
// MIPI Transmitter
587623
//

sim_models/verilog/MIPI_RX.v

Lines changed: 113 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,113 @@
1+
`timescale 1ns/1ps
2+
`celldefine
3+
//
4+
// MIPI_RX simulation model
5+
// MIPI Receiver
6+
//
7+
// Copyright (c) 2023 Rapid Silicon, Inc. All rights reserved.
8+
//
9+
10+
module MIPI_RX #(
11+
parameter WIDTH = 4, // Width of input data to serializer (3-10)
12+
parameter EN_IDLY = "FALSE", // True or False
13+
parameter DELAY = 0 // Fixed TAP delay value (0-63)
14+
) (
15+
input RST, // Active-low, asynchronous reset
16+
input RX_CLK, // MIPI RX_IO clock input, PLL_CLK
17+
input PLL_LOCK, // PLL lock input
18+
input CLK_IN, // Fabric core clock input
19+
input RX_DP, // MIPI RX Data Positive input From I_BUF
20+
input RX_DN, // MIPI RX Data Negative input from I_BUF
21+
input HS_EN, // EN HS Data input (From Fabric). Active high signal. This is a common signal between MIPI RX/TX interface.
22+
input LP_EN, // EN LP Data input (From Fabric). This is a common signal between MIPI RX/TX interface.
23+
input RX_TERM_EN, // EN Differential Termination
24+
input BITSLIP_ADJ, // BITSLIP_ADJ input from Fabric
25+
input DLY_LOAD, // Delay load input, from Fabric
26+
input DLY_ADJ, // Delay adjust input, from Fabric
27+
input DLY_INCDEC, // Delay increment / decrement input, from Fabric
28+
output [5:0] DLY_TAP_VALUE, // Delay tap value output to fabric
29+
output [WIDTH-1:0] HS_RX_DATA, // HS RX Data output to Fabric
30+
output HS_RXD_VALID, // HS RX Parallel DATA is VALID
31+
output RX_OE, // IBUF OE signal for MIPI I_BUF
32+
output LP_RX_DP, // LP RX Data positive output to the Fabric
33+
output LP_RX_DN // LP RX Data negative output to the Fabric
34+
);
35+
36+
37+
wire i_delay_out;
38+
wire rx_dp_delay;
39+
wire rx_dn_delay;
40+
wire rx_dp;
41+
wire rx_dn;
42+
43+
I_DELAY # (
44+
.DELAY(DELAY)
45+
)
46+
I_DELAY_inst (
47+
.I(RX_DP),
48+
.DLY_LOAD(DLY_LOAD),
49+
.DLY_ADJ(DLY_ADJ),
50+
.DLY_INCDEC(DLY_INCDEC),
51+
.DLY_TAP_VALUE(DLY_TAP_VALUE),
52+
.CLK_IN(CLK_IN),
53+
.O(i_delay_out)
54+
);
55+
56+
I_SERDES # (
57+
.DATA_RATE("DDR"),
58+
.WIDTH(WIDTH),
59+
.DPA_MODE("NONE")
60+
)
61+
I_SERDES_inst (
62+
.D(rx_dp),
63+
.RST(RST),
64+
.BITSLIP_ADJ(BITSLIP_ADJ),
65+
.EN(HS_EN),
66+
.CLK_IN(CLK_IN),
67+
.CLK_OUT(CLK_OUT),
68+
.Q(HS_RX_DATA),
69+
.DATA_VALID(HS_RXD_VALID),
70+
.DPA_LOCK(),
71+
.DPA_ERROR(),
72+
.PLL_LOCK(PLL_LOCK),
73+
.PLL_CLK(RX_CLK)
74+
);
75+
76+
assign RX_OE= HS_EN | LP_EN;
77+
assign rx_dp_delay = (EN_IDLY=="FALSE")? RX_DP:i_delay_out;
78+
assign rx_dn_delay = (EN_IDLY=="FALSE")? RX_DN:~i_delay_out;
79+
80+
assign rx_dp = RX_TERM_EN?1'bz:RX_OE?rx_dp_delay:'b0;
81+
assign rx_dn = RX_TERM_EN?1'bz:RX_OE?rx_dn_delay:'b0;
82+
83+
assign LP_RX_DP = rx_dp;
84+
assign LP_RX_DN = rx_dn;
85+
86+
87+
always@(*)
88+
begin
89+
if(LP_EN && HS_EN)
90+
$fatal(1,"\nERROR: MIPI RX instance %m LP_EN and HS_EN can't be hight at same time");
91+
end
92+
93+
initial begin
94+
95+
if ((WIDTH < 3) || (WIDTH > 10)) begin
96+
$fatal(1,"MIPI_RX instance %m WIDTH set to incorrect value, %d. Values must be between 3 and 10.", WIDTH);
97+
end
98+
case(EN_IDLY)
99+
"TRUE" ,
100+
"FALSE": begin end
101+
default: begin
102+
$fatal(1,"\nError: MIPI_RX instance %m has parameter EN_IDLY set to %s. Valid values are TRUE, FALSE\n", EN_IDLY);
103+
end
104+
endcase
105+
106+
if ((DELAY < 0) || (DELAY > 63)) begin
107+
$fatal(1,"MIPI_RX instance %m DELAY set to incorrect value, %d. Values must be between 0 and 63.", DELAY);
108+
end
109+
110+
end
111+
112+
endmodule
113+
`endcelldefine

sim_models/verilog/MIPI_TX.v

Lines changed: 128 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,128 @@
1+
`timescale 1ns/1ps
2+
`celldefine
3+
//
4+
// MIPI_TX simulation model
5+
// MIPI Transmitter
6+
//
7+
// Copyright (c) 2023 Rapid Silicon, Inc. All rights reserved.
8+
//
9+
10+
module MIPI_TX #(
11+
parameter WIDTH = 4, // Width of input data to serializer (3-10)
12+
parameter EN_ODLY = "FALSE", // True or False
13+
parameter LANE_MODE = "Master", // Master or Slave
14+
parameter DELAY = 0 // Fixed TAP delay value (0-63)
15+
) (
16+
input RST, // Active-low, asynchronous reset
17+
input RX_CLK, // MIPI RX_IO clock input, PLL_CLK
18+
input PLL_LOCK, // PLL lock input
19+
input CLK_IN, // Fabric core clock input
20+
input [WIDTH-1:0] HS_TX_DATA, // Parallel Data input bus from fabric
21+
input HS_TXD_VALID, // Load word input from Fabric
22+
input HS_EN, // EN HS Data Transmission (From Fabric)
23+
input TX_LP_DP, // LP TX Data positive from the Fabric
24+
input TX_LP_DN, // LP TX Data negative from the Fabric
25+
input LP_EN, // EN LP Data Transmission (From Fabric). Active high signal. This is a common signal between MIPI RX/TX interface.
26+
input TX_ODT_EN, // EN Termination
27+
input DLY_LOAD, // Delay load input, from Fabric
28+
input DLY_ADJ, // Delay adjust input, from Fabric
29+
input DLY_INCDEC, // Delay increment / decrement input, from Fabric
30+
output TX_OE, // IBUF OE signal for MIPI O_BUF
31+
output TX_DP, // Serial Data output to O_BUF
32+
output TX_DN, // Serial Data output to O_BUF
33+
input CHANNEL_BOND_SYNC_IN, // Channel bond sync input
34+
output CHANNEL_BOND_SYNC_OUT // Channel bond sync output
35+
);
36+
37+
38+
wire o_serdes_dout;
39+
wire o_delay_dout;
40+
41+
O_SERDES # (
42+
.DATA_RATE("DDR"),
43+
.WIDTH(WIDTH)
44+
)
45+
O_SERDES_inst (
46+
.D(HS_TX_DATA),
47+
.RST(RST),
48+
.DATA_VALID(HS_TXD_VALID),
49+
.CLK_IN(CLK_IN),
50+
.OE_IN(),
51+
.OE_OUT(),
52+
.Q(o_serdes_dout),
53+
.CHANNEL_BOND_SYNC_IN(CHANNEL_BOND_SYNC_IN),
54+
.CHANNEL_BOND_SYNC_OUT(CHANNEL_BOND_SYNC_OUT),
55+
.PLL_LOCK(PLL_LOCK),
56+
.PLL_CLK(RX_CLK)
57+
);
58+
59+
O_DELAY # (
60+
.DELAY(DELAY)
61+
)
62+
O_DELAY_inst (
63+
.I(tx_dp),
64+
.DLY_LOAD(DLY_LOAD),
65+
.DLY_ADJ(DLY_ADJ),
66+
.DLY_INCDEC(DLY_INCDEC),
67+
.DLY_TAP_VALUE(),
68+
.CLK_IN(CLK_IN),
69+
.O(o_delay_dout)
70+
);
71+
reg tx_dp;
72+
reg tx_dn;
73+
assign TX_OE = LP_EN | HS_EN;
74+
75+
always @(*)
76+
begin
77+
if(HS_EN && TX_OE)
78+
begin
79+
tx_dp = o_serdes_dout;
80+
tx_dn = ~tx_dp;
81+
end
82+
else if (LP_EN && TX_OE)
83+
begin
84+
tx_dp = TX_LP_DP;
85+
tx_dn = TX_LP_DN;
86+
end
87+
end
88+
89+
assign TX_DP = TX_ODT_EN?1'bz:(EN_ODLY=="FALSE")? tx_dp:o_delay_dout;
90+
assign TX_DN = TX_ODT_EN?1'bz:(EN_ODLY=="FALSE")? tx_dn:~o_delay_dout;
91+
92+
// assign TX_DP = tx_dp;
93+
// assign TX_DN = tx_dn;
94+
95+
always@(*)
96+
begin
97+
if(LP_EN && HS_EN)
98+
$fatal(1,"\nERROR: MIPI TX instance %m LP_EN and HS_EN can't be hight at same time");
99+
end
100+
101+
initial begin
102+
103+
if ((WIDTH < 3) || (WIDTH > 10)) begin
104+
$fatal(1,"MIPI_TX instance %m WIDTH set to incorrect value, %d. Values must be between 3 and 10.", WIDTH);
105+
end
106+
case(EN_ODLY)
107+
"TRUE" ,
108+
"FALSE": begin end
109+
default: begin
110+
$fatal(1,"\nError: MIPI_TX instance %m has parameter EN_ODLY set to %s. Valid values are TRUE, FALSE\n", EN_ODLY);
111+
end
112+
endcase
113+
case(LANE_MODE)
114+
"Master" ,
115+
"Slave": begin end
116+
default: begin
117+
$fatal(1,"\nError: MIPI_TX instance %m has parameter LANE_MODE set to %s. Valid values are Master, Slave\n", LANE_MODE);
118+
end
119+
endcase
120+
121+
if ((DELAY < 0) || (DELAY > 63)) begin
122+
$fatal(1,"MIPI_TX instance %m DELAY set to incorrect value, %d. Values must be between 0 and 63.", DELAY);
123+
end
124+
125+
end
126+
127+
endmodule
128+
`endcelldefine

0 commit comments

Comments
 (0)