15 Commits
Author SHA1 Message Date
yuysh c447c6a592 Bug fixes 2026-06-09 14:58:30 +08:00
yuysh e19adb09f9 Fix bugs and Unify the PMU_OC logic 2026-06-09 11:41:21 +08:00
yuysh 092cad794c Remove unecessary code in CPLD1
Unify PMU_OC_* logic in CPLD2
2026-06-08 18:14:44 +08:00
Jeremy Shen 1d92e2c53e Add DC Relay Control Logic 2026-06-08 15:44:24 +08:00
Jeremy Shen 61076299a0 Add SPI testbench 2026-06-08 10:14:17 +08:00
yuysh 4fd22c4919 Add Channel Naming for CPLD2 2026-06-08 09:53:57 +08:00
yuysh 0c9843f9c8 Fix CPLD1 Rx_T 2026-06-08 09:51:25 +08:00
yuysh c828a3b019 Make the CPLD_Con more readable 2026-06-06 15:33:24 +08:00
yuysh 36e6eb5768 Unify the OC_Con logic 2026-06-05 16:49:20 +08:00
yuysh 607b43837d Fix RC_RLSel Shifting logic(2/?) 2026-06-02 18:33:16 +08:00
yuysh 9f47d03477 Merge branch 'master' of http://mkb.local:3000/yuysh/NewInstrCalBoard_CPLD 2026-06-02 17:27:06 +08:00
Jeremy Shen ff4d6a10cc Fix RC_RLSel Shifting logic 2026-06-02 17:21:32 +08:00
yuysh 2301ab9405 Fix version code for CPLD3 2026-06-02 14:50:29 +08:00
yuysh fa41cd029f Fix MISO logic for CPLD2 & CPLD3 2026-06-02 14:50:13 +08:00
Jeremy Shen ed3fbd7cf5 Fix the SPI MISO logic
Modify the tb to make it easier from all aspects
2026-06-02 11:23:34 +08:00
33 changed files with 14691 additions and 13777 deletions
+62 -51
View File
@@ -28,7 +28,6 @@ module BUS_Con (
reg [1:0] mosi_sync; reg [1:0] mosi_sync;
wire cs_active; wire cs_active;
wire cs_rise;
wire sclk_rise; // For Sampling MOSI wire sclk_rise; // For Sampling MOSI
wire sclk_fall; // For Shifting MISO wire sclk_fall; // For Shifting MISO
wire mosi_data; wire mosi_data;
@@ -47,7 +46,6 @@ module BUS_Con (
end end
assign cs_active = ~cs_sync[1]; assign cs_active = ~cs_sync[1];
assign cs_rise = (!cs_sync[1] && cs_sync[0]);
// SPI Mode 0: Sample MOSI on Rising, Shift MISO on Falling // SPI Mode 0: Sample MOSI on Rising, Shift MISO on Falling
assign sclk_rise = (!sclk_sync[1] && sclk_sync[0]); assign sclk_rise = (!sclk_sync[1] && sclk_sync[0]);
@@ -61,8 +59,9 @@ module BUS_Con (
reg err_flag; reg err_flag;
reg [1:0] state; reg [1:0] state;
// //
reg [31:0] tx_buffer; // Holds data waiting for the next CS Low reg [31:0] miso_shift; // The actual shifter
reg [31:0] miso_shift; // The actual shifter reg wr_flag;// Flag: 1=W/0=R
reg miso_loaded;
// Output Registers // Output Registers
reg [6:0] addr_out; reg [6:0] addr_out;
reg [23:0] data_out; reg [23:0] data_out;
@@ -82,83 +81,86 @@ module BUS_Con (
bit_cnt <= 6'd0; bit_cnt <= 6'd0;
data_ready <= 1'b0; data_ready <= 1'b0;
err_flag <= 1'b0; err_flag <= 1'b0;
wr_flag <= 1'b1;
end end
else begin else begin
// Clear data_ready when FSM has consumed the command // Clear data_ready when FSM has consumed the command (CMD_SENT = consumed)
if (state == DONE) begin if (state == CMD_SENT) begin
data_ready <= 1'b0; data_ready <= 1'b0;
end end
if (cs_active) begin if (cs_active) begin
if (sclk_rise) begin if (sclk_rise) begin
recv_reg <= {recv_reg[30:0], mosi_data}; recv_reg <= {recv_reg[30:0], mosi_data};
if (bit_cnt == 6'd6) begin bit_cnt <= bit_cnt + 1'b1;
// 8th bit received: check if read (MSB=0) or write (MSB=1)
if (recv_reg[30] == 1'b0) begin // After 8 bits: check WR bit (recv_reg[7] = first bit received)
// Read command: set data_ready after 8 bits // Read (WR=0): set data_ready early so MISO data is prepared
// Write (WR=1): wait for all 32 bits
if (bit_cnt == 'd7) begin
if (recv_reg[6] == 1'b0) begin
// Read command: signal ready after address received
data_ready <= 1'b1; data_ready <= 1'b1;
wr_flag <= 1'b0;
end
else begin
wr_flag <= 1'b1;
end end
end end
else if (bit_cnt == 6'd31) begin else if (bit_cnt == 6'd31) begin
// 32nd bit received: write command complete // Write command complete (32 bits received)
data_ready <= 1'b1; data_ready <= 1'b1;
end end
bit_cnt <= bit_cnt + 1'b1;
end end
else if (cs_rise) begin else if (!cs_active) begin
if (bit_cnt == 6'd32) begin data_ready <= 1'b0;
data_ready <= 1'b0; if (bit_cnt == 6'd31) begin
err_flag <= 1'b0; err_flag <= 1'b0;
bit_cnt <= 6'd0; bit_cnt <= 6'd0;
end end
else if (bit_cnt != 0) begin else if (bit_cnt != 0 && bit_cnt != 6'd32) begin
err_flag <= 1'b1; err_flag <= 1'b1;
bit_cnt <= 6'd0; bit_cnt <= 6'd0;
recv_reg <= 'd0; recv_reg <= 'd0;
end end
end end
end end
if (state == DONE) begin else begin
// CS high: reset state
bit_cnt <= 6'd0;
recv_reg <= 'd0; recv_reg <= 'd0;
data_ready <= 1'b0;
end end
end end
end end
// --- 3. MISO (Transmit) Logic --- // --- 3. MISO (Transmit) Logic ---
// Protocol: We shift out 32 bits. // Protocol: We shift out 32 bits.
// Format: [8 bit Status/Padding] + [24 bit i_rdata] // Format: [8'h00 padding] + [24 bit i_rdata]
// Shift MSB out on each falling edge of SCLK (master samples on rising)
// Consolidated: load on first rising edge, shift on falling edges
// Capture data from backend when valid
always @(posedge i_sys_clk) begin always @(posedge i_sys_clk) begin
if (!i_rst_n) begin if (!i_rst_n) begin
tx_buffer <= 32'd0; miso_shift <= 32'd0;
end else begin miso_loaded <= 1'b0;
// If backend provides valid read data, store it.
// We pad the top 8 bits with Zeros (or you can put status flags here)
if (i_rvalid) begin
tx_buffer <= {8'h00, i_rdata};
end
end end
end else begin
// Shift data out
always @(posedge i_sys_clk) begin
if (!i_rst_n) begin
miso_shift <= 32'd0;
end else begin
if (!cs_active) begin if (!cs_active) begin
// Reset shifter while CS is High // Reset shifter while CS is High
miso_shift <= 32'd0; miso_shift <= 32'd0;
end end
else begin else begin
if (sclk_fall) begin if (i_rvalid && (bit_cnt == 'd8)) begin
// Shift on Falling Edge (Master samples on Rising) miso_shift <= {i_rdata,8'd0};
miso_shift <= {miso_shift[30:0], 1'b0}; miso_loaded <= 1'b1;
end end
// Load register data when read completes (takes priority over shift) if (miso_loaded && sclk_fall) begin
else if (i_rvalid) begin // Shift out MSB on falling edges (data valid before master's rising-edge sample)
miso_shift <= {i_rdata, 8'h0}; if (bit_cnt > 'd8) begin
miso_shift <= {miso_shift[30:0], 1'b0};
end
end end
end end
end end
@@ -169,6 +171,8 @@ module BUS_Con (
assign o_miso = (cs_active) ? miso_shift[31] : 1'bz; assign o_miso = (cs_active) ? miso_shift[31] : 1'bz;
// --- 4. Register Control FSM --- // --- 4. Register Control FSM ---
// Command format: [WR:1b][Addr:7b][Data:24b] = 32 bits
// recv_reg layout after 32 bits: {WR, Addr[6:0], Data[23:0]}
always @(posedge i_sys_clk) begin always @(posedge i_sys_clk) begin
if (!i_rst_n) begin if (!i_rst_n) begin
@@ -181,9 +185,16 @@ module BUS_Con (
case (state) case (state)
IDLE: begin IDLE: begin
if (data_ready) begin if (data_ready) begin
addr_out <= recv_reg[30:24]; // Extract fields from received command
data_out <= recv_reg[23:0]; if (wr_flag == 1'b1) begin
wr_out <= recv_reg[31]; addr_out <= recv_reg[30:24];
data_out <= recv_reg[23:0];
wr_out <= recv_reg[31];
end
else begin
addr_out <= recv_reg[6:0];
wr_out <= recv_reg[7];
end
if (!i_reg_busy) begin if (!i_reg_busy) begin
cmd_valid_out <= 1'b1; cmd_valid_out <= 1'b1;
+95 -70
View File
@@ -28,82 +28,107 @@
<TraceSigTreeData> <TraceSigTreeData>
<TraceSignal IsHidden="false" Name="BUS_Con_1/i_cs" NodeType="0" PortIndex="0"/> <TraceSignal IsHidden="false" Name="BUS_Con_1/i_cs" NodeType="0" PortIndex="0"/>
<TraceSignal IsHidden="false" Name="BUS_Con_1/i_sclk" NodeType="0" PortIndex="1"/> <TraceSignal IsHidden="false" Name="BUS_Con_1/i_sclk" NodeType="0" PortIndex="1"/>
<TraceSignal IsHidden="false" Name="BUS_Con_1/addr_out" NodeType="1" PortIndex="2"> <TraceSignal IsHidden="false" Name="BUS_Con_1/i_mosi" NodeType="0" PortIndex="2"/>
<TraceSignal IsHidden="false" Name="BUS_Con_1/bit_cnt" NodeType="1" PortIndex="3">
<BusRadix Radix="0"/> <BusRadix Radix="0"/>
<IsExpanded Expand="false"/> <IsExpanded Expand="false"/>
</TraceSignal> </TraceSignal>
<TraceSignal IsHidden="false" Name="BUS_Con_1/addr_out:0" NodeType="2" PortIndex="2"/> <TraceSignal IsHidden="false" Name="BUS_Con_1/bit_cnt:0" NodeType="2" PortIndex="3"/>
<TraceSignal IsHidden="false" Name="BUS_Con_1/addr_out:1" NodeType="2" PortIndex="3"/> <TraceSignal IsHidden="false" Name="BUS_Con_1/bit_cnt:1" NodeType="2" PortIndex="4"/>
<TraceSignal IsHidden="false" Name="BUS_Con_1/addr_out:2" NodeType="2" PortIndex="4"/> <TraceSignal IsHidden="false" Name="BUS_Con_1/bit_cnt:2" NodeType="2" PortIndex="5"/>
<TraceSignal IsHidden="false" Name="BUS_Con_1/addr_out:3" NodeType="2" PortIndex="5"/> <TraceSignal IsHidden="false" Name="BUS_Con_1/bit_cnt:3" NodeType="2" PortIndex="6"/>
<TraceSignal IsHidden="false" Name="BUS_Con_1/addr_out:4" NodeType="2" PortIndex="6"/> <TraceSignal IsHidden="false" Name="BUS_Con_1/bit_cnt:4" NodeType="2" PortIndex="7"/>
<TraceSignal IsHidden="false" Name="BUS_Con_1/addr_out:5" NodeType="2" PortIndex="7"/> <TraceSignal IsHidden="false" Name="BUS_Con_1/bit_cnt:5" NodeType="2" PortIndex="8"/>
<TraceSignal IsHidden="false" Name="BUS_Con_1/addr_out:6" NodeType="2" PortIndex="8"/> <TraceSignal IsHidden="false" Name="BUS_Con_1/recv_reg" NodeType="1" PortIndex="9">
<TraceSignal IsHidden="false" Name="BUS_Con_1/miso_shift" NodeType="1" PortIndex="9">
<BusRadix Radix="3"/>
<IsExpanded Expand="false"/>
</TraceSignal>
<TraceSignal IsHidden="false" Name="BUS_Con_1/miso_shift:0" NodeType="2" PortIndex="9"/>
<TraceSignal IsHidden="false" Name="BUS_Con_1/miso_shift:1" NodeType="2" PortIndex="10"/>
<TraceSignal IsHidden="false" Name="BUS_Con_1/miso_shift:2" NodeType="2" PortIndex="11"/>
<TraceSignal IsHidden="false" Name="BUS_Con_1/miso_shift:3" NodeType="2" PortIndex="12"/>
<TraceSignal IsHidden="false" Name="BUS_Con_1/miso_shift:4" NodeType="2" PortIndex="13"/>
<TraceSignal IsHidden="false" Name="BUS_Con_1/miso_shift:5" NodeType="2" PortIndex="14"/>
<TraceSignal IsHidden="false" Name="BUS_Con_1/miso_shift:6" NodeType="2" PortIndex="15"/>
<TraceSignal IsHidden="false" Name="BUS_Con_1/miso_shift:7" NodeType="2" PortIndex="16"/>
<TraceSignal IsHidden="false" Name="BUS_Con_1/miso_shift:8" NodeType="2" PortIndex="17"/>
<TraceSignal IsHidden="false" Name="BUS_Con_1/miso_shift:9" NodeType="2" PortIndex="18"/>
<TraceSignal IsHidden="false" Name="BUS_Con_1/miso_shift:10" NodeType="2" PortIndex="19"/>
<TraceSignal IsHidden="false" Name="BUS_Con_1/miso_shift:11" NodeType="2" PortIndex="20"/>
<TraceSignal IsHidden="false" Name="BUS_Con_1/miso_shift:12" NodeType="2" PortIndex="21"/>
<TraceSignal IsHidden="false" Name="BUS_Con_1/miso_shift:13" NodeType="2" PortIndex="22"/>
<TraceSignal IsHidden="false" Name="BUS_Con_1/miso_shift:14" NodeType="2" PortIndex="23"/>
<TraceSignal IsHidden="false" Name="BUS_Con_1/miso_shift:15" NodeType="2" PortIndex="24"/>
<TraceSignal IsHidden="false" Name="BUS_Con_1/miso_shift:16" NodeType="2" PortIndex="25"/>
<TraceSignal IsHidden="false" Name="BUS_Con_1/miso_shift:17" NodeType="2" PortIndex="26"/>
<TraceSignal IsHidden="false" Name="BUS_Con_1/miso_shift:18" NodeType="2" PortIndex="27"/>
<TraceSignal IsHidden="false" Name="BUS_Con_1/miso_shift:19" NodeType="2" PortIndex="28"/>
<TraceSignal IsHidden="false" Name="BUS_Con_1/miso_shift:20" NodeType="2" PortIndex="29"/>
<TraceSignal IsHidden="false" Name="BUS_Con_1/miso_shift:21" NodeType="2" PortIndex="30"/>
<TraceSignal IsHidden="false" Name="BUS_Con_1/miso_shift:22" NodeType="2" PortIndex="31"/>
<TraceSignal IsHidden="false" Name="BUS_Con_1/miso_shift:23" NodeType="2" PortIndex="32"/>
<TraceSignal IsHidden="false" Name="BUS_Con_1/miso_shift:24" NodeType="2" PortIndex="33"/>
<TraceSignal IsHidden="false" Name="BUS_Con_1/miso_shift:25" NodeType="2" PortIndex="34"/>
<TraceSignal IsHidden="false" Name="BUS_Con_1/miso_shift:26" NodeType="2" PortIndex="35"/>
<TraceSignal IsHidden="false" Name="BUS_Con_1/miso_shift:27" NodeType="2" PortIndex="36"/>
<TraceSignal IsHidden="false" Name="BUS_Con_1/miso_shift:28" NodeType="2" PortIndex="37"/>
<TraceSignal IsHidden="false" Name="BUS_Con_1/miso_shift:29" NodeType="2" PortIndex="38"/>
<TraceSignal IsHidden="false" Name="BUS_Con_1/miso_shift:30" NodeType="2" PortIndex="39"/>
<TraceSignal IsHidden="false" Name="BUS_Con_1/miso_shift:31" NodeType="2" PortIndex="40"/>
<TraceSignal IsHidden="false" Name="BUS_Con_1/o_miso" NodeType="0" PortIndex="41"/>
<TraceSignal IsHidden="false" Name="BUS_Con_1/i_rdata" NodeType="1" PortIndex="42">
<BusRadix Radix="0"/> <BusRadix Radix="0"/>
<IsExpanded Expand="false"/> <IsExpanded Expand="false"/>
</TraceSignal> </TraceSignal>
<TraceSignal IsHidden="false" Name="BUS_Con_1/i_rdata:0" NodeType="2" PortIndex="42"/> <TraceSignal IsHidden="false" Name="BUS_Con_1/recv_reg:24" NodeType="2" PortIndex="9"/>
<TraceSignal IsHidden="false" Name="BUS_Con_1/i_rdata:1" NodeType="2" PortIndex="43"/> <TraceSignal IsHidden="false" Name="BUS_Con_1/recv_reg:25" NodeType="2" PortIndex="10"/>
<TraceSignal IsHidden="false" Name="BUS_Con_1/i_rdata:2" NodeType="2" PortIndex="44"/> <TraceSignal IsHidden="false" Name="BUS_Con_1/recv_reg:26" NodeType="2" PortIndex="11"/>
<TraceSignal IsHidden="false" Name="BUS_Con_1/i_rdata:3" NodeType="2" PortIndex="45"/> <TraceSignal IsHidden="false" Name="BUS_Con_1/recv_reg:27" NodeType="2" PortIndex="12"/>
<TraceSignal IsHidden="false" Name="BUS_Con_1/i_rdata:4" NodeType="2" PortIndex="46"/> <TraceSignal IsHidden="false" Name="BUS_Con_1/recv_reg:28" NodeType="2" PortIndex="13"/>
<TraceSignal IsHidden="false" Name="BUS_Con_1/i_rdata:5" NodeType="2" PortIndex="47"/> <TraceSignal IsHidden="false" Name="BUS_Con_1/recv_reg:29" NodeType="2" PortIndex="14"/>
<TraceSignal IsHidden="false" Name="BUS_Con_1/i_rdata:6" NodeType="2" PortIndex="48"/> <TraceSignal IsHidden="false" Name="BUS_Con_1/recv_reg:30" NodeType="2" PortIndex="15"/>
<TraceSignal IsHidden="false" Name="BUS_Con_1/i_rdata:7" NodeType="2" PortIndex="49"/> <TraceSignal IsHidden="false" Name="BUS_Con_1/recv_reg:31" NodeType="2" PortIndex="16"/>
<TraceSignal IsHidden="false" Name="BUS_Con_1/i_rdata:8" NodeType="2" PortIndex="50"/> <TraceSignal IsHidden="false" Name="BUS_Con_1/data_ready" NodeType="0" PortIndex="17"/>
<TraceSignal IsHidden="false" Name="BUS_Con_1/i_rdata:9" NodeType="2" PortIndex="51"/> <TraceSignal IsHidden="false" Name="BUS_Con_1/o_addr" NodeType="1" PortIndex="18">
<TraceSignal IsHidden="false" Name="BUS_Con_1/i_rdata:10" NodeType="2" PortIndex="52"/> <BusRadix Radix="0"/>
<TraceSignal IsHidden="false" Name="BUS_Con_1/i_rdata:11" NodeType="2" PortIndex="53"/> <IsExpanded Expand="false"/>
<TraceSignal IsHidden="false" Name="BUS_Con_1/i_rdata:12" NodeType="2" PortIndex="54"/> </TraceSignal>
<TraceSignal IsHidden="false" Name="BUS_Con_1/i_rdata:13" NodeType="2" PortIndex="55"/> <TraceSignal IsHidden="false" Name="BUS_Con_1/o_addr:0" NodeType="2" PortIndex="18"/>
<TraceSignal IsHidden="false" Name="BUS_Con_1/i_rdata:14" NodeType="2" PortIndex="56"/> <TraceSignal IsHidden="false" Name="BUS_Con_1/o_addr:1" NodeType="2" PortIndex="19"/>
<TraceSignal IsHidden="false" Name="BUS_Con_1/i_rdata:15" NodeType="2" PortIndex="57"/> <TraceSignal IsHidden="false" Name="BUS_Con_1/o_addr:2" NodeType="2" PortIndex="20"/>
<TraceSignal IsHidden="false" Name="BUS_Con_1/i_rdata:16" NodeType="2" PortIndex="58"/> <TraceSignal IsHidden="false" Name="BUS_Con_1/o_addr:3" NodeType="2" PortIndex="21"/>
<TraceSignal IsHidden="false" Name="BUS_Con_1/i_rdata:17" NodeType="2" PortIndex="59"/> <TraceSignal IsHidden="false" Name="BUS_Con_1/o_addr:4" NodeType="2" PortIndex="22"/>
<TraceSignal IsHidden="false" Name="BUS_Con_1/i_rdata:18" NodeType="2" PortIndex="60"/> <TraceSignal IsHidden="false" Name="BUS_Con_1/o_addr:5" NodeType="2" PortIndex="23"/>
<TraceSignal IsHidden="false" Name="BUS_Con_1/i_rdata:19" NodeType="2" PortIndex="61"/> <TraceSignal IsHidden="false" Name="BUS_Con_1/o_addr:6" NodeType="2" PortIndex="24"/>
<TraceSignal IsHidden="false" Name="BUS_Con_1/i_rdata:20" NodeType="2" PortIndex="62"/> <TraceSignal IsHidden="false" Name="BUS_Con_1/i_rvalid" NodeType="0" PortIndex="25"/>
<TraceSignal IsHidden="false" Name="BUS_Con_1/i_rdata:21" NodeType="2" PortIndex="63"/> <TraceSignal IsHidden="false" Name="BUS_Con_1/miso_shift" NodeType="1" PortIndex="26">
<TraceSignal IsHidden="false" Name="BUS_Con_1/i_rdata:22" NodeType="2" PortIndex="64"/> <BusRadix Radix="0"/>
<TraceSignal IsHidden="false" Name="BUS_Con_1/i_rdata:23" NodeType="2" PortIndex="65"/> <IsExpanded Expand="false"/>
</TraceSignal>
<TraceSignal IsHidden="false" Name="BUS_Con_1/miso_shift:0" NodeType="2" PortIndex="26"/>
<TraceSignal IsHidden="false" Name="BUS_Con_1/miso_shift:1" NodeType="2" PortIndex="27"/>
<TraceSignal IsHidden="false" Name="BUS_Con_1/miso_shift:2" NodeType="2" PortIndex="28"/>
<TraceSignal IsHidden="false" Name="BUS_Con_1/miso_shift:3" NodeType="2" PortIndex="29"/>
<TraceSignal IsHidden="false" Name="BUS_Con_1/miso_shift:4" NodeType="2" PortIndex="30"/>
<TraceSignal IsHidden="false" Name="BUS_Con_1/miso_shift:5" NodeType="2" PortIndex="31"/>
<TraceSignal IsHidden="false" Name="BUS_Con_1/miso_shift:6" NodeType="2" PortIndex="32"/>
<TraceSignal IsHidden="false" Name="BUS_Con_1/miso_shift:7" NodeType="2" PortIndex="33"/>
<TraceSignal IsHidden="false" Name="BUS_Con_1/miso_shift:8" NodeType="2" PortIndex="34"/>
<TraceSignal IsHidden="false" Name="BUS_Con_1/miso_shift:9" NodeType="2" PortIndex="35"/>
<TraceSignal IsHidden="false" Name="BUS_Con_1/miso_shift:10" NodeType="2" PortIndex="36"/>
<TraceSignal IsHidden="false" Name="BUS_Con_1/miso_shift:11" NodeType="2" PortIndex="37"/>
<TraceSignal IsHidden="false" Name="BUS_Con_1/miso_shift:12" NodeType="2" PortIndex="38"/>
<TraceSignal IsHidden="false" Name="BUS_Con_1/miso_shift:13" NodeType="2" PortIndex="39"/>
<TraceSignal IsHidden="false" Name="BUS_Con_1/miso_shift:14" NodeType="2" PortIndex="40"/>
<TraceSignal IsHidden="false" Name="BUS_Con_1/miso_shift:15" NodeType="2" PortIndex="41"/>
<TraceSignal IsHidden="false" Name="BUS_Con_1/miso_shift:16" NodeType="2" PortIndex="42"/>
<TraceSignal IsHidden="false" Name="BUS_Con_1/miso_shift:17" NodeType="2" PortIndex="43"/>
<TraceSignal IsHidden="false" Name="BUS_Con_1/miso_shift:18" NodeType="2" PortIndex="44"/>
<TraceSignal IsHidden="false" Name="BUS_Con_1/miso_shift:19" NodeType="2" PortIndex="45"/>
<TraceSignal IsHidden="false" Name="BUS_Con_1/miso_shift:20" NodeType="2" PortIndex="46"/>
<TraceSignal IsHidden="false" Name="BUS_Con_1/miso_shift:21" NodeType="2" PortIndex="47"/>
<TraceSignal IsHidden="false" Name="BUS_Con_1/miso_shift:22" NodeType="2" PortIndex="48"/>
<TraceSignal IsHidden="false" Name="BUS_Con_1/miso_shift:23" NodeType="2" PortIndex="49"/>
<TraceSignal IsHidden="false" Name="BUS_Con_1/miso_shift:24" NodeType="2" PortIndex="50"/>
<TraceSignal IsHidden="false" Name="BUS_Con_1/miso_shift:25" NodeType="2" PortIndex="51"/>
<TraceSignal IsHidden="false" Name="BUS_Con_1/miso_shift:26" NodeType="2" PortIndex="52"/>
<TraceSignal IsHidden="false" Name="BUS_Con_1/miso_shift:27" NodeType="2" PortIndex="53"/>
<TraceSignal IsHidden="false" Name="BUS_Con_1/miso_shift:28" NodeType="2" PortIndex="54"/>
<TraceSignal IsHidden="false" Name="BUS_Con_1/miso_shift:29" NodeType="2" PortIndex="55"/>
<TraceSignal IsHidden="false" Name="BUS_Con_1/miso_shift:30" NodeType="2" PortIndex="56"/>
<TraceSignal IsHidden="false" Name="BUS_Con_1/miso_shift:31" NodeType="2" PortIndex="57"/>
<TraceSignal IsHidden="false" Name="BUS_Con_1/o_miso" NodeType="0" PortIndex="58"/>
<TraceSignal IsHidden="false" Name="BUS_Con_1/i_rdata" NodeType="1" PortIndex="59">
<BusRadix Radix="0"/>
<IsExpanded Expand="false"/>
</TraceSignal>
<TraceSignal IsHidden="false" Name="BUS_Con_1/i_rdata:0" NodeType="2" PortIndex="59"/>
<TraceSignal IsHidden="false" Name="BUS_Con_1/i_rdata:1" NodeType="2" PortIndex="60"/>
<TraceSignal IsHidden="false" Name="BUS_Con_1/i_rdata:2" NodeType="2" PortIndex="61"/>
<TraceSignal IsHidden="false" Name="BUS_Con_1/i_rdata:3" NodeType="2" PortIndex="62"/>
<TraceSignal IsHidden="false" Name="BUS_Con_1/i_rdata:4" NodeType="2" PortIndex="63"/>
<TraceSignal IsHidden="false" Name="BUS_Con_1/i_rdata:5" NodeType="2" PortIndex="64"/>
<TraceSignal IsHidden="false" Name="BUS_Con_1/i_rdata:6" NodeType="2" PortIndex="65"/>
<TraceSignal IsHidden="false" Name="BUS_Con_1/i_rdata:7" NodeType="2" PortIndex="66"/>
<TraceSignal IsHidden="false" Name="BUS_Con_1/i_rdata:8" NodeType="2" PortIndex="67"/>
<TraceSignal IsHidden="false" Name="BUS_Con_1/i_rdata:9" NodeType="2" PortIndex="68"/>
<TraceSignal IsHidden="false" Name="BUS_Con_1/i_rdata:10" NodeType="2" PortIndex="69"/>
<TraceSignal IsHidden="false" Name="BUS_Con_1/i_rdata:11" NodeType="2" PortIndex="70"/>
<TraceSignal IsHidden="false" Name="BUS_Con_1/i_rdata:12" NodeType="2" PortIndex="71"/>
<TraceSignal IsHidden="false" Name="BUS_Con_1/i_rdata:13" NodeType="2" PortIndex="72"/>
<TraceSignal IsHidden="false" Name="BUS_Con_1/i_rdata:14" NodeType="2" PortIndex="73"/>
<TraceSignal IsHidden="false" Name="BUS_Con_1/i_rdata:15" NodeType="2" PortIndex="74"/>
<TraceSignal IsHidden="false" Name="BUS_Con_1/i_rdata:16" NodeType="2" PortIndex="75"/>
<TraceSignal IsHidden="false" Name="BUS_Con_1/i_rdata:17" NodeType="2" PortIndex="76"/>
<TraceSignal IsHidden="false" Name="BUS_Con_1/i_rdata:18" NodeType="2" PortIndex="77"/>
<TraceSignal IsHidden="false" Name="BUS_Con_1/i_rdata:19" NodeType="2" PortIndex="78"/>
<TraceSignal IsHidden="false" Name="BUS_Con_1/i_rdata:20" NodeType="2" PortIndex="79"/>
<TraceSignal IsHidden="false" Name="BUS_Con_1/i_rdata:21" NodeType="2" PortIndex="80"/>
<TraceSignal IsHidden="false" Name="BUS_Con_1/i_rdata:22" NodeType="2" PortIndex="81"/>
<TraceSignal IsHidden="false" Name="BUS_Con_1/i_rdata:23" NodeType="2" PortIndex="82"/>
</TraceSigTreeData> </TraceSigTreeData>
<TriggerUI UserSelect="0" PreSelectType="0" PreSelect="1" UserSelectPos="0"/> <TriggerUI UserSelect="0" PreSelectType="0" PreSelect="1" UserSelectPos="0"/>
<CoreRun Run="true"/> <CoreRun Run="true"/>
+23 -173
View File
File diff suppressed because one or more lines are too long
+2051 -2051
View File
File diff suppressed because it is too large Load Diff
+138 -83
View File
@@ -16,8 +16,6 @@ module CPLD_Con (
input [23:0]i_DC_Con4, input [23:0]i_DC_Con4,
//Output RELAYs //Output RELAYs
output [3:0]o_OC_x01,
output [3:0]o_OC_x17,
output [18:0]o_DMM_EN, output [18:0]o_DMM_EN,
output o_IO_RC1, output o_IO_RC1,
output [5:0]o_RC_Tx, output [5:0]o_RC_Tx,
@@ -31,6 +29,9 @@ module CPLD_Con (
output o_RC_VSel, output o_RC_VSel,
output o_RC_ISel, output o_RC_ISel,
// Force/Sense Control
output [1:0]o_RC_LOFS,
// Output RLoad Sel // Output RLoad Sel
output [17:0]o_RC_RLSel, output [17:0]o_RC_RLSel,
@@ -47,7 +48,9 @@ module CPLD_Con (
reg[5:0]RC_Tx; reg[5:0]RC_Tx;
reg io_RC; reg io_RC;
reg RC_VISel; reg RC_VSel;
reg RC_ISel;
reg [1:0]RC_LOFS;
reg [17:0]RC_RLSel ; reg [17:0]RC_RLSel ;
reg [31:0]PMU_OC_1 ; reg [31:0]PMU_OC_1 ;
reg [31:0]PMU_OC_2 ; reg [31:0]PMU_OC_2 ;
@@ -69,15 +72,29 @@ module CPLD_Con (
//Counter //Counter
reg [15:0]delay_cnt; reg [15:0]delay_cnt;
//Reg Parsing
//Shift Counter //Shift Counter
wire [4:0]OC_Shifter1 = i_DC_Con1[8:4]; // Channel Number div 8 wire [4:0]OC_Shifter1 = (i_DC_Con1[8:1] - 1) >> 3; // Channel Number div 8
wire [2:0]DMM_Shifter1 = i_DC_Con1[8:7]; // Channel Number div 64 wire [2:0]DMM_Shifter1 = i_DC_Con1[8:7] ; // Channel Number div 64
wire [4:0]OC_Shifter2 = i_DC_Con2[8:4]; // Channel Number div 8 wire [4:0]RC_RLShifter1 = i_DC_Con1[21:17] ; // RC_RL Shifter
wire [2:0]DMM_Shifter2 = i_DC_Con2[8:7]; // Channel Number div 64 wire [4:0]OC_Shifter2 = (i_DC_Con2[8:1] - 1) >> 3; // Channel Number div 8
wire [4:0]OC_Shifter3 = i_DC_Con3[8:4]; // Channel Number div 8 wire [2:0]DMM_Shifter2 = i_DC_Con2[8:7] ; // Channel Number div 64
wire [2:0]DMM_Shifter3 = i_DC_Con3[8:7]; // Channel Number div 64 wire [4:0]RC_RLShifter2 = i_DC_Con2[21:17] ; // RC_RL Shifter
wire [4:0]OC_Shifter4 = i_DC_Con4[8:4]; // Channel Number div 8 wire [4:0]OC_Shifter3 = (i_DC_Con3[8:1] - 1) >> 3; // Channel Number div 8
wire [2:0]DMM_Shifter4 = i_DC_Con4[8:7]; // Channel Number div 64 wire [2:0]DMM_Shifter3 = i_DC_Con3[8:7] ; // Channel Number div 64
wire [4:0]RC_RLShifter3 = i_DC_Con3[21:17] ; // RC_RL Shifter
wire [4:0]OC_Shifter4 = (i_DC_Con4[8:1] - 1) >> 3; // Channel Number div 8
wire [2:0]DMM_Shifter4 = i_DC_Con4[8:7] ; // Channel Number div 64
wire [4:0]RC_RLShifter4 = i_DC_Con4[21:17] ; // RC_RL Shifter
//Channels
wire [8:0]Channel_1 = i_DC_Con1[9:1] ;
wire [8:0]Channel_2 = i_DC_Con2[9:1] ;
wire [8:0]Channel_3 = i_DC_Con3[9:1] ;
wire [8:0]Channel_4 = i_DC_Con4[9:1] ;
wire [3:0]DC_OC1 = {PMU_OC_4[0],PMU_OC_3[0],PMU_OC_2[0],PMU_OC_1[0]} ;
wire [3:0]DC_OC17 = {PMU_OC_4[16],PMU_OC_3[16],PMU_OC_2[16],PMU_OC_1[16]} ;
always @(posedge i_sys_clk) begin always @(posedge i_sys_clk) begin
if (i_rst_n == 1'b0) begin if (i_rst_n == 1'b0) begin
@@ -116,14 +133,15 @@ module CPLD_Con (
freq_slot_flag <= 'd0; freq_slot_flag <= 'd0;
dc_slot_flag <= 'd0; dc_slot_flag <= 'd0;
OC_x01 <= 'd0;
OC_x17 <= 'd0;
DMM_en <= 'd0; DMM_en <= 'd0;
RC_VISel <='d0; RC_VSel <= 'd1; //Vpk HIGH Disable, LOW Enable
RC_ISel <= 'd1; //Apk HIGH Disable, LOW Enable
RC_LOFS <= 'hf; //HIGH Disable, LOW Enable
RC_RLSel <='hfffff; RC_RLSel <='hfffff;
RC_Tx <= 'd0 ;
PMU_OC_1 <= 'd0 ; PMU_OC_1 <= 'd0 ;
PMU_OC_2 <= 'd0 ; PMU_OC_2 <= 'd0 ;
PMU_OC_3 <= 'd0 ; PMU_OC_3 <= 'd0 ;
@@ -160,96 +178,82 @@ module CPLD_Con (
io_RC <= i_freq_relay1[0] || i_freq_relay2[0] || i_freq_relay3[0] || i_freq_relay4[0]; io_RC <= i_freq_relay1[0] || i_freq_relay2[0] || i_freq_relay3[0] || i_freq_relay4[0];
case (freq_slot_flag) case (freq_slot_flag)
4'b0001: begin 4'b0001: begin
if (i_freq_relay1[9:1] < 9) begin if (Channel_1 < 9) begin
OC_x01 <= 4'b0001; PMU_OC_1 <= 'd1;
OC_x17 <= 'd0;
DMM_en <= 19'b000_0000_0000_0000_0001; DMM_en <= 19'b000_0000_0000_0000_0001;
end end
else if (i_freq_relay1[9:1] < 73) begin else if (Channel_1 < 73) begin
DMM_en <= 19'b000_0000_0000_0000_0010; DMM_en <= 19'b000_0000_0000_0000_0010;
OC_x01 <= 'd0; PMU_OC_1 <= 'd0;
OC_x17 <= 'd0;
end end
else if (i_freq_relay1[9:1] < 137) begin else if (Channel_1 < 137) begin
OC_x17 <= 4'b0001; PMU_OC_1 <= 1'b1 << 16;
OC_x01 <= 'd0;
DMM_en <= 19'b000_0000_0000_0000_0100; DMM_en <= 19'b000_0000_0000_0000_0100;
end end
else begin else begin
DMM_en <= 19'b000_0000_0000_0000_1000; DMM_en <= 19'b000_0000_0000_0000_1000;
OC_x01 <= 'd0; PMU_OC_1 <= 'd0;
OC_x17 <= 'd0;
end end
end end
4'b0010: begin 4'b0010: begin
if (i_freq_relay2[9:1] < 9) begin if (Channel_2 < 9) begin
OC_x01 <= 4'b0010; PMU_OC_2 <= 'd1;
OC_x17 <= 'd0;
DMM_en <= 19'b000_0000_0000_0001_0000; DMM_en <= 19'b000_0000_0000_0001_0000;
end end
else if (i_freq_relay2[9:1] < 73) begin else if (Channel_2 < 73) begin
DMM_en <= 19'b000_0000_0000_0010_0000; DMM_en <= 19'b000_0000_0000_0010_0000;
OC_x01 <= 'd0; PMU_OC_2 <= 'd0;
OC_x17 <= 'd0;
end end
else if (i_freq_relay2[9:1] < 137) begin else if (Channel_2 < 137) begin
OC_x17 <= 4'b0010; PMU_OC_2 <= 1'b1 << 16;
OC_x01 <= 'd0;
DMM_en <= 19'b000_0000_0000_0100_0000; DMM_en <= 19'b000_0000_0000_0100_0000;
end end
else begin else begin
OC_x01 <= 'd0; PMU_OC_2 <= 'd0;
OC_x17 <= 'd0;
DMM_en <= 19'b000_0000_0000_1000_0000; DMM_en <= 19'b000_0000_0000_1000_0000;
end end
end end
4'b0100: begin 4'b0100: begin
if (i_freq_relay3[9:1] < 9) begin if (Channel_3 < 9) begin
OC_x01 <= 'b0100; PMU_OC_3 <= 'd1;
OC_x17 <= 'd0;
DMM_en <= 19'b000_0000_0001_0000_0000; DMM_en <= 19'b000_0000_0001_0000_0000;
end end
else if ((i_freq_relay3[9:1] > 64)& (i_freq_relay3[9:1] < 73)) begin else if ((Channel_3 > 64)& (Channel_3 < 73)) begin
OC_x01 <= 4'b0000; PMU_OC_3 <= 'd0;
OC_x17 <= 'd0;
DMM_en <= 19'b000_0000_0010_0000_0000; DMM_en <= 19'b000_0000_0010_0000_0000;
end end
else if (i_freq_relay3[9:1] < 137) begin else if (Channel_3 < 137) begin
DMM_en <= 19'b000_0000_0100_0000_0000; DMM_en <= 19'b000_0000_0100_0000_0000;
OC_x01 <= 'd0; PMU_OC_3 <= 1'b1 << 16;
OC_x17 <= 'b0100;
end end
else if (i_freq_relay3[9:1] < 201) begin else if (Channel_3 < 201) begin
OC_x17 <= 4'd0; PMU_OC_3 <= 'd0;
OC_x01 <= 'd0;
DMM_en <= 19'b000_0000_1000_0000_0000; DMM_en <= 19'b000_0000_1000_0000_0000;
end end
end end
4'b1000: begin 4'b1000: begin
if (i_freq_relay4[9:1] < 9) begin if (Channel_4 < 9) begin
OC_x01 <= 4'b1000; PMU_OC_4 <= 'd1;
OC_x17 <= 'd0;
DMM_en <= 19'b000_0001_0000_0000_0000; DMM_en <= 19'b000_0001_0000_0000_0000;
end end
else if (i_freq_relay4[9:1] < 72) begin else if (Channel_4 < 72) begin
DMM_en <= 19'b000_0010_0000_0000_0000; DMM_en <= 19'b000_0010_0000_0000_0000;
OC_x01 <= 'd0; PMU_OC_4 <= 'd0;
OC_x17 <= 'd0;
end end
else if (i_freq_relay4[9:1] < 137) begin else if (Channel_4 < 137) begin
OC_x17 <= 4'b1000; PMU_OC_4 <= 1'b1 << 16;
OC_x01 <= 'd0;
DMM_en <= 19'b000_0100_0000_0000_0000; DMM_en <= 19'b000_0100_0000_0000_0000;
end end
else begin else begin
OC_x01 <= 'd0; PMU_OC_4 <= 'd0;
OC_x17 <= 'd0;
DMM_en <= 19'b000_1000_0000_0000_0000; DMM_en <= 19'b000_1000_0000_0000_0000;
end end
end end
default: begin // You Should NOT be HERE default: begin // You Should NOT be HERE
OC_x01 <= 4'b0000; PMU_OC_1 <= 'd0;
OC_x17 <= 4'b0000; PMU_OC_2 <= 'd0;
PMU_OC_3 <= 'd0;
PMU_OC_4 <= 'd0;
DMM_en <= 'd0; DMM_en <= 'd0;
end end
endcase endcase
@@ -257,18 +261,25 @@ module CPLD_Con (
else if (dc_t == 1'b1) begin else if (dc_t == 1'b1) begin
case (dc_slot_flag) case (dc_slot_flag)
4'b0001: begin 4'b0001: begin
//Here Set Mode and F/S
if (i_DC_Con1[22] == 1'b1) begin if (i_DC_Con1[22] == 1'b1) begin
RC_VISel <= 1'b1; //Select Current RC_VSel <= 1'b1; //Select Current
RC_ISel <= 1'b0;
RC_LOFS <= 2'b01;
end end
else begin else begin
RC_VISel <= 1'b0; //Select Voltage RC_VSel <= 1'b0; //Select Voltage
RC_ISel <= 1'b1;
RC_LOFS <= 2'b10;
end end
//Sanity Check //Sanity Check
if ((i_DC_Con1[21:17] < 1) || (i_DC_Con1[21:17] > 18) || (i_DC_Con1[9:1] < 1) || (i_DC_Con1[9:1] > 256)) begin if ((i_DC_Con1[21:17] < 1) || (i_DC_Con1[21:17] > 18) || (Channel_1 < 1) || (Channel_1 > 256)) begin
err_flag <= 1'b1; err_flag <= 1'b1;
end end
else begin else begin
RC_RLSel <= (18'b11_1111_1111_1111_1110)<<(i_DC_Con1[21:17] - 1); RC_RLSel <= (RC_RLShifter1 >= 1 && RC_RLShifter1 <= 18)
? ~(18'b1 << (RC_RLShifter1 - 1))
: 18'h3FFFF; //Set RLoad
if (i_DC_Con1[23] == 1'b0) begin //Select PMU if (i_DC_Con1[23] == 1'b0) begin //Select PMU
PMU_OC_1 <= (32'b0000_0000_0000_0000_0000_0000_0000_0001)<<(OC_Shifter1); PMU_OC_1 <= (32'b0000_0000_0000_0000_0000_0000_0000_0001)<<(OC_Shifter1);
DMM_en <= (19'b000_0000_0000_0000_0001)<<(DMM_Shifter1); DMM_en <= (19'b000_0000_0000_0000_0001)<<(DMM_Shifter1);
@@ -280,17 +291,23 @@ module CPLD_Con (
end end
4'b0010: begin 4'b0010: begin
if (i_DC_Con2[22] == 1'b1) begin if (i_DC_Con2[22] == 1'b1) begin
RC_VISel <= 1'b1; //Select Current RC_VSel <= 1'b1; //Select Current
RC_ISel <= 1'b0;
RC_LOFS <= 2'b01;
end end
else begin else begin
RC_VISel <= 1'b0; //Select Voltage RC_VSel <= 1'b0; //Select Voltage
RC_ISel <= 1'b1;
RC_LOFS <= 2'b10;
end end
//Sanity Check //Sanity Check
if ((i_DC_Con2[21:17] < 1) || (i_DC_Con2[21:17] > 18) || (i_DC_Con2[9:1] < 1) || (i_DC_Con2[9:1] > 256)) begin if ((i_DC_Con2[21:17] < 1) || (i_DC_Con2[21:17] > 18) || (i_DC_Con2[9:1] < 1) || (i_DC_Con2[9:1] > 256)) begin
err_flag <= 1'b1; err_flag <= 1'b1;
end end
else begin else begin
RC_RLSel <= (18'b11_1111_1111_1111_1110)<<(i_DC_Con2[21:17] - 1); RC_RLSel <= (RC_RLShifter2 >= 1 && RC_RLShifter2 <= 18)
? ~(18'b1 << (RC_RLShifter2 - 1))
: 18'h3FFFF; // 否则1(即不置 0
if (i_DC_Con2[23] == 1'b0) begin //Select PMU if (i_DC_Con2[23] == 1'b0) begin //Select PMU
PMU_OC_2 <= (32'b0000_0000_0000_0000_0000_0000_0000_0001)<<(OC_Shifter2); PMU_OC_2 <= (32'b0000_0000_0000_0000_0000_0000_0000_0001)<<(OC_Shifter2);
DMM_en <= (19'b000_0000_0000_0001_0000)<<(DMM_Shifter2); DMM_en <= (19'b000_0000_0000_0001_0000)<<(DMM_Shifter2);
@@ -302,17 +319,23 @@ module CPLD_Con (
end end
4'b0100:begin 4'b0100:begin
if (i_DC_Con3[22] == 1'b1) begin if (i_DC_Con3[22] == 1'b1) begin
RC_VISel <= 1'b1; //Select Current RC_VSel <= 1'b1; //Select Current
RC_ISel <= 1'b0;
RC_LOFS <= 2'b01;
end end
else begin else begin
RC_VISel <= 1'b0; //Select Voltage RC_VSel <= 1'b0; //Select Voltage
RC_ISel <= 1'b1;
RC_LOFS <= 2'b10;
end end
//Sanity Check //Sanity Check
if ((i_DC_Con3[21:17] < 1) || (i_DC_Con3[21:17] > 18) || (i_DC_Con3[9:1] < 1) || (i_DC_Con3[9:1] > 256)) begin if ((i_DC_Con3[21:17] < 1) || (i_DC_Con3[21:17] > 18) || (i_DC_Con3[9:1] < 1) || (i_DC_Con3[9:1] > 256)) begin
err_flag <= 1'b1; err_flag <= 1'b1;
end end
else begin else begin
RC_RLSel <= (18'b11_1111_1111_1111_1110)<<(i_DC_Con3[21:17] - 1); RC_RLSel <= (RC_RLShifter3 >= 1 && RC_RLShifter3 <= 18)
? ~(18'b1 << (RC_RLShifter3 - 1))
: 18'h3FFFF; // 1 0
if (i_DC_Con3[23] == 1'b0) begin //Select PMU if (i_DC_Con3[23] == 1'b0) begin //Select PMU
PMU_OC_3 <= (32'b0000_0000_0000_0000_0000_0000_0000_0001)<<(OC_Shifter3); PMU_OC_3 <= (32'b0000_0000_0000_0000_0000_0000_0000_0001)<<(OC_Shifter3);
DMM_en <= (19'b000_0000_0001_0000_0000)<<(DMM_Shifter3); DMM_en <= (19'b000_0000_0001_0000_0000)<<(DMM_Shifter3);
@@ -324,18 +347,47 @@ module CPLD_Con (
end end
4'b1000:begin 4'b1000:begin
if (i_DC_Con4[22] == 1'b1) begin if (i_DC_Con4[22] == 1'b1) begin
RC_VISel <= 1'b1; //Select Current RC_VSel <= 1'b1; //Select Current
RC_ISel <= 1'b0;
RC_LOFS <= 2'b01;
end end
else begin else begin
RC_VISel <= 1'b0; //Select Voltage RC_VSel <= 1'b0; //Select Voltage
RC_ISel <= 1'b1;
RC_LOFS <= 2'b10;
end end
//Sanity Check //Sanity Check
if ((i_DC_Con4[21:17] < 1) || (i_DC_Con4[21:17] > 18) || (i_DC_Con4[9:1] < 1) || (i_DC_Con4[9:1] > 256)) begin if ((i_DC_Con4[21:17] < 1) || (i_DC_Con4[21:17] > 18) || (i_DC_Con4[9:1] < 1) || (i_DC_Con4[9:1] > 256)) begin
err_flag <= 1'b1; err_flag <= 1'b1;
end end
else begin else begin
RC_RLSel <= (18'b11_1111_1111_1111_1110)<<(i_DC_Con4[21:17] - 1); RC_RLSel <= (RC_RLShifter4 >= 1 && RC_RLShifter4 <= 18)
? ~(18'b1 << (RC_RLShifter4 - 1))
: 18'h3FFFF; // 否则1(即不置 0
if (i_DC_Con4[23] == 1'b0) begin //Select PMU if (i_DC_Con4[23] == 1'b0) begin //Select PMU
//Parsing Channel
//We need Speacial Handling for tthe "freq" channels
if (Channel_4 == 'd66 || Channel_4 == 'd68) begin
RC_Tx <= 'd1;
end
else if (Channel_4 == 'd70 || Channel_4 == 'd72) begin
RC_Tx <= 6'b00_0010;
end
else if (Channel_4 == 'd130 || Channel_4 == 'd132) begin
RC_Tx <= 6'b00_0100;
end
else if (Channel_4 == 'd134 || Channel_4 == 'd136) begin
RC_Tx <= 6'b00_1000;
end
else if (Channel_4 == 'd194 || Channel_4 == 'd196) begin
RC_Tx <= 6'b01_0000;
end
else if (Channel_4 == 'd198 || Channel_4 == 'd200) begin
RC_Tx <= 6'b10_0000;
end
else begin
RC_Tx <= 'd0;
end
PMU_OC_4 <= (32'b0000_0000_0000_0000_0000_0000_0000_0001)<<(OC_Shifter4); PMU_OC_4 <= (32'b0000_0000_0000_0000_0000_0000_0000_0001)<<(OC_Shifter4);
DMM_en <= (19'b000_0001_0000_0000_0000)<<(DMM_Shifter4); DMM_en <= (19'b000_0001_0000_0000_0000)<<(DMM_Shifter4);
end end
@@ -345,8 +397,10 @@ module CPLD_Con (
end end
end end
default:begin // You Should NOT be HERE default:begin // You Should NOT be HERE
RC_VISel <='d0; RC_VSel <= 'd1;
RC_RLSel <='hfffff; RC_ISel <= 'd1;
RC_RLSel <= 'hf;
RC_LOFS <= 'hf;
PMU_OC_1 <= 'd0 ; PMU_OC_1 <= 'd0 ;
PMU_OC_2 <= 'd0 ; PMU_OC_2 <= 'd0 ;
@@ -365,15 +419,16 @@ module CPLD_Con (
end end
assign o_con_done = done_flag; assign o_con_done = done_flag;
assign o_DMM_EN = DMM_en;
assign o_OC_x01 = OC_x01;
assign o_OC_x17 = OC_x17;
assign o_IO_RC1 = io_RC;
assign o_err = err_flag; assign o_err = err_flag;
assign o_DMM_EN = DMM_en;
assign o_IO_RC1 = io_RC;
assign o_RC_Tx = RC_Tx; assign o_RC_Tx = RC_Tx;
assign o_RC_ISel = (RC_VISel==1'b1)?1:0; assign o_RC_VSel = RC_VSel;
assign o_RC_VSel = (RC_VISel==1'b1)?0:1; assign o_RC_ISel = RC_ISel;
assign o_RC_LOFS = RC_LOFS;
assign o_RC_RLSel = RC_RLSel; assign o_RC_RLSel = RC_RLSel;
+8 -5
View File
@@ -15,25 +15,28 @@
<Source name="tb_RelayConTop.sv" type="Verilog" type_short="Verilog" syn_sim="SimOnly"> <Source name="tb_RelayConTop.sv" type="Verilog" type_short="Verilog" syn_sim="SimOnly">
<Options VerilogStandard="System Verilog"/> <Options VerilogStandard="System Verilog"/>
</Source> </Source>
<Source name="RelayConTop_tf.v" type="Verilog" type_short="Verilog" syn_sim="SimOnly">
<Options/>
</Source>
<Source name="CPLD_Con.v" type="Verilog" type_short="Verilog"> <Source name="CPLD_Con.v" type="Verilog" type_short="Verilog">
<Options/> <Options/>
</Source> </Source>
<Source name="tb_SPI_RegRW.sv" type="Verilog" type_short="Verilog" syn_sim="SimOnly">
<Options VerilogStandard="System Verilog"/>
</Source>
<Source name="CPLD1_Debug.rva" type="Reveal Analyzer Project File" type_short="RVA"> <Source name="CPLD1_Debug.rva" type="Reveal Analyzer Project File" type_short="RVA">
<Options/> <Options/>
</Source> </Source>
<Source name="NewExtIns_CPLD1.lpf" type="Logic Preference" type_short="LPF">
<Options/>
</Source>
<Source name="debug.rvl" type="Reveal" type_short="Reveal"> <Source name="debug.rvl" type="Reveal" type_short="Reveal">
<Options/> <Options/>
</Source> </Source>
<Source name="impl1/impl1.xcf" type="Programming Project File" type_short="Programming"> <Source name="impl1/impl1.xcf" type="Programming Project File" type_short="Programming">
<Options/> <Options/>
</Source> </Source>
<Source name="NewExtIns_CPLD1.lpf" type="Logic Preference" type_short="LPF"> <Source name="tb_RelayConTop/tb_RelayConTop.spf" type="Simulation Project File" type_short="SPF">
<Options/> <Options/>
</Source> </Source>
<Source name="tb_RelayConTop/tb_RelayConTop.spf" type="Simulation Project File" type_short="SPF"> <Source name="tb_SPI_RegRW/tb_SPI_RegRW.spf" type="Simulation Project File" type_short="SPF">
<Options/> <Options/>
</Source> </Source>
</Implementation> </Implementation>
+4 -3
View File
@@ -1,4 +1,4 @@
rvl_alias "i_sys_clk" "i_sys_clk"; RVL_ALIAS "i_sys_clk" "i_sys_clk";
RVL_ALIAS "i_sys_clk" "i_sys_clk"; RVL_ALIAS "i_sys_clk" "i_sys_clk";
RVL_ALIAS "i_sys_clk" "i_sys_clk"; RVL_ALIAS "i_sys_clk" "i_sys_clk";
RVL_ALIAS "i_sys_clk" "i_sys_clk"; RVL_ALIAS "i_sys_clk" "i_sys_clk";
@@ -100,8 +100,8 @@ LOCATE COMP "o_PMU_OC_3[17]" SITE "E9" ;
LOCATE COMP "o_PMU_OC_3[18]" SITE "E10" ; LOCATE COMP "o_PMU_OC_3[18]" SITE "E10" ;
LOCATE COMP "o_PMU_OC_3[19]" SITE "D11" ; LOCATE COMP "o_PMU_OC_3[19]" SITE "D11" ;
LOCATE COMP "o_PMU_OC_3[20]" SITE "E7" ; LOCATE COMP "o_PMU_OC_3[20]" SITE "E7" ;
LOCATE COMP "o_PMU_OC_3[21]" SITE "D8" ; LOCATE COMP "o_PMU_OC_3[21]" SITE "D7" ;
LOCATE COMP "o_PMU_OC_3[22]" SITE "B8" ; LOCATE COMP "o_PMU_OC_3[22]" SITE "D8" ;
LOCATE COMP "o_PMU_OC_4[0]" SITE "A13" ; LOCATE COMP "o_PMU_OC_4[0]" SITE "A13" ;
LOCATE COMP "o_PMU_OC_4[1]" SITE "B13" ; LOCATE COMP "o_PMU_OC_4[1]" SITE "B13" ;
LOCATE COMP "o_PMU_OC_4[2]" SITE "B14" ; LOCATE COMP "o_PMU_OC_4[2]" SITE "B14" ;
@@ -313,3 +313,4 @@ IOBUF PORT "o_RC_T30" IO_TYPE=LVCMOS33 ;
IOBUF PORT "o_RC_T31" IO_TYPE=LVCMOS33 ; IOBUF PORT "o_RC_T31" IO_TYPE=LVCMOS33 ;
IOBUF PORT "o_RC_T32" IO_TYPE=LVCMOS33 ; IOBUF PORT "o_RC_T32" IO_TYPE=LVCMOS33 ;
IOBUF PORT "o_con_done" IO_TYPE=LVCMOS33 ; IOBUF PORT "o_con_done" IO_TYPE=LVCMOS33 ;
LOCATE COMP "o_PMU_OC_3[23]" SITE "B8" ;
+2 -1
View File
@@ -74,7 +74,6 @@ module Reg_file (
else begin else begin
case (state) case (state)
IDLE: begin IDLE: begin
rvalid_flag <= 1'b0;
err_flag <= 1'b0; err_flag <= 1'b0;
// Priority Check: Did we crash/reset while EXEC bit was still 1? // Priority Check: Did we crash/reset while EXEC bit was still 1?
@@ -99,6 +98,7 @@ module Reg_file (
end end
BUSY: begin BUSY: begin
rvalid_flag <= 1'b0;
if (err_flag) begin if (err_flag) begin
state <= IDLE; state <= IDLE;
end end
@@ -133,6 +133,7 @@ module Reg_file (
// Wait for Controller to register the command and pull 'done' LOW (Busy) // Wait for Controller to register the command and pull 'done' LOW (Busy)
EXEC_ACK: begin EXEC_ACK: begin
busy_flag <= 1'b1; busy_flag <= 1'b1;
rvalid_flag <= 1'b0;
if (i_con_done == 1'b0) begin if (i_con_done == 1'b0) begin
state <= EXEC_WAIT; state <= EXEC_WAIT;
end end
+16 -29
View File
@@ -79,6 +79,9 @@ module RelayConTop (
//DMM I Select //DMM I Select
wire RC_ISel; wire RC_ISel;
//Force/Sense Control
wire [1:0]RC_LOFS ;
wire con_rvalid; wire con_rvalid;
wire con_done; wire con_done;
@@ -139,8 +142,6 @@ module RelayConTop (
.i_DC_Con3(DC_Con3), .i_DC_Con3(DC_Con3),
.i_DC_Con4(DC_Con4), .i_DC_Con4(DC_Con4),
.o_con_done(con_done), .o_con_done(con_done),
.o_OC_x01(OC_x01),
.o_OC_x17(OC_x17),
.o_RC_Tx(RC_Tx), .o_RC_Tx(RC_Tx),
.o_DMM_EN(DMM_EN), .o_DMM_EN(DMM_EN),
.o_PMU_OC_1(PMU_OC_1), .o_PMU_OC_1(PMU_OC_1),
@@ -149,52 +150,38 @@ module RelayConTop (
.o_PMU_OC_4(PMU_OC_4), .o_PMU_OC_4(PMU_OC_4),
.o_RC_VSel(RC_VSel), .o_RC_VSel(RC_VSel),
.o_RC_ISel(RC_ISel), .o_RC_ISel(RC_ISel),
.o_RC_LOFS(RC_LOFS),
.o_RC_RLSel(RC_RLSel), .o_RC_RLSel(RC_RLSel),
.o_IO_RC1(IO_RC1), .o_IO_RC1(IO_RC1),
.o_err(cpld_err_flag) .o_err(cpld_err_flag)
); );
assign o_con_done = con_done; assign o_con_done = con_done;
//assign o_OC_x01 = OC_x01;
assign o_PMU_OC_1[0] = OC_x01[0];
assign o_PMU_OC_2[0] = OC_x01[1];
assign o_PMU_OC_3[0] = OC_x01[2];
assign o_PMU_OC_4[0] = OC_x01[3];
//assign o_OC_x17 = OC_x17; assign o_PMU_OC_1 = PMU_OC_1;
assign o_PMU_OC_1[16] = OC_x17[0];
assign o_PMU_OC_2[16] = OC_x17[1];
assign o_PMU_OC_3[16] = OC_x17[2];
assign o_PMU_OC_4[16] = OC_x17[3];
assign o_PMU_OC_1[15:1] = PMU_OC_1[15:1]; assign o_PMU_OC_2 = PMU_OC_2;
assign o_PMU_OC_1[31:17] = PMU_OC_1[31:17];
assign o_PMU_OC_2[15:1] = PMU_OC_2[15:1]; assign o_PMU_OC_3 = PMU_OC_3;
assign o_PMU_OC_2[31:17] = PMU_OC_2[31:17];
assign o_PMU_OC_3[15:1] = PMU_OC_3[15:1]; assign o_PMU_OC_4 = PMU_OC_4;
assign o_PMU_OC_3[31:17] = PMU_OC_3[31:17];
assign o_PMU_OC_4[15:1] = PMU_OC_4[15:1];
assign o_PMU_OC_4[31:17] = PMU_OC_4[31:17];
assign o_DMM_EN = DMM_EN; assign o_DMM_EN = DMM_EN;
assign o_IO_RC1 = IO_RC1; assign o_IO_RC1 = IO_RC1;
assign o_RC_T27 = RC_Tx[5]; assign o_RC_T27 = RC_Tx[0];
assign o_RC_T28 = RC_Tx[4]; assign o_RC_T28 = RC_Tx[1];
assign o_RC_T29 = RC_Tx[3]; assign o_RC_T29 = RC_Tx[2];
assign o_RC_T30 = RC_Tx[2]; assign o_RC_T30 = RC_Tx[3];
assign o_RC_T31 = RC_Tx[1]; assign o_RC_T31 = RC_Tx[4];
assign o_RC_T32 = RC_Tx[0]; assign o_RC_T32 = RC_Tx[5];
assign o_RC_RLSel = RC_RLSel; assign o_RC_RLSel = RC_RLSel;
assign o_RC_VSel = RC_VSel; assign o_RC_VSel = RC_VSel;
assign o_RC_ISel = RC_ISel; assign o_RC_ISel = RC_ISel;
assign o_RC_LOF = (RC_VSel == 1'b1)?2'b01:2'b10; //if Measure V then close RC_LOF[0] assign o_RC_LOF = RC_LOFS;
assign o_RC_LOS = (RC_VSel == 1'b1)?2'b01:2'b10; assign o_RC_LOS = RC_LOFS;
assign o_err = bus_err_flag || reg_err_flag ||cpld_err_flag; assign o_err = bus_err_flag || reg_err_flag ||cpld_err_flag;
+102 -92
View File
@@ -1,7 +1,7 @@
<Project ModBy="Inserter" SigType="0" Name="C:/Users/testrong/Documents/Work/NewInstrCalBoard/2.FW/CPLD/CPLD1/debug.rvl" Date="2026-06-01"> <Project ModBy="Inserter" SigType="0" Name="C:/Users/testrong/Documents/Work/NewInstrCalBoard/2.FW/CPLD/CPLD1/debug.rvl" Date="2026-06-09">
<IP Version="1_6_042617"/> <IP Version="1_6_042617"/>
<Design DesignEntry="Schematic/Verilog HDL" Synthesis="synplify" DeviceFamily="MachXO2" DesignName="NewExtIns_CPLD1"/> <Design DesignEntry="Schematic/Verilog HDL" Synthesis="synplify" DeviceFamily="MachXO2" DesignName="NewExtIns_CPLD1"/>
<Core InsertDataset="0" Insert="1" Reveal_sig="696450588" Name="RelayConTop_LA0" ID="0"> <Core InsertDataset="0" Insert="1" Reveal_sig="697491828" Name="RelayConTop_LA0" ID="0">
<Setting> <Setting>
<Clock SampleClk="i_sys_clk" SampleEnable="0" EnableClk="" EnableClk_Pri="0"/> <Clock SampleClk="i_sys_clk" SampleEnable="0" EnableClk="" EnableClk_Pri="0"/>
<TraceBuffer Implementation="0" BitTimeStamp="0" hasTimeStamp="0" IncTrigSig="0" BufferDepth="2048"/> <TraceBuffer Implementation="0" BitTimeStamp="0" hasTimeStamp="0" IncTrigSig="0" BufferDepth="2048"/>
@@ -12,105 +12,115 @@
</Setting> </Setting>
<Dataset Name="Base"> <Dataset Name="Base">
<Trace> <Trace>
<Sig Type="SIG" Name="BUS_Con_1/i_cs"/> <Sig Type="SIG" Name="con_exec"/>
<Sig Type="SIG" Name="BUS_Con_1/i_sclk"/> <Sig Type="SIG" Name="con_done"/>
<Sig Type="SIG" Name="BUS_Con_1/i_mosi"/> <Bus Name="RC_RLSel">
<Bus Name="BUS_Con_1/bit_cnt"> <Sig Type="SIG" Name="RC_RLSel:0"/>
<Sig Type="SIG" Name="BUS_Con_1/bit_cnt:0"/> <Sig Type="SIG" Name="RC_RLSel:1"/>
<Sig Type="SIG" Name="BUS_Con_1/bit_cnt:1"/> <Sig Type="SIG" Name="RC_RLSel:2"/>
<Sig Type="SIG" Name="BUS_Con_1/bit_cnt:2"/> <Sig Type="SIG" Name="RC_RLSel:3"/>
<Sig Type="SIG" Name="BUS_Con_1/bit_cnt:3"/> <Sig Type="SIG" Name="RC_RLSel:4"/>
<Sig Type="SIG" Name="BUS_Con_1/bit_cnt:4"/> <Sig Type="SIG" Name="RC_RLSel:5"/>
<Sig Type="SIG" Name="BUS_Con_1/bit_cnt:5"/> <Sig Type="SIG" Name="RC_RLSel:6"/>
<Sig Type="SIG" Name="RC_RLSel:7"/>
<Sig Type="SIG" Name="RC_RLSel:8"/>
<Sig Type="SIG" Name="RC_RLSel:9"/>
<Sig Type="SIG" Name="RC_RLSel:10"/>
<Sig Type="SIG" Name="RC_RLSel:11"/>
<Sig Type="SIG" Name="RC_RLSel:12"/>
<Sig Type="SIG" Name="RC_RLSel:13"/>
<Sig Type="SIG" Name="RC_RLSel:14"/>
<Sig Type="SIG" Name="RC_RLSel:15"/>
<Sig Type="SIG" Name="RC_RLSel:16"/>
<Sig Type="SIG" Name="RC_RLSel:17"/>
</Bus> </Bus>
<Bus Name="BUS_Con_1/recv_reg"> <Bus Name="DC_Con3">
<Sig Type="SIG" Name="BUS_Con_1/recv_reg:24"/> <Sig Type="SIG" Name="DC_Con3:0"/>
<Sig Type="SIG" Name="BUS_Con_1/recv_reg:25"/> <Sig Type="SIG" Name="DC_Con3:1"/>
<Sig Type="SIG" Name="BUS_Con_1/recv_reg:26"/> <Sig Type="SIG" Name="DC_Con3:2"/>
<Sig Type="SIG" Name="BUS_Con_1/recv_reg:27"/> <Sig Type="SIG" Name="DC_Con3:3"/>
<Sig Type="SIG" Name="BUS_Con_1/recv_reg:28"/> <Sig Type="SIG" Name="DC_Con3:4"/>
<Sig Type="SIG" Name="BUS_Con_1/recv_reg:29"/> <Sig Type="SIG" Name="DC_Con3:5"/>
<Sig Type="SIG" Name="BUS_Con_1/recv_reg:30"/> <Sig Type="SIG" Name="DC_Con3:6"/>
<Sig Type="SIG" Name="BUS_Con_1/recv_reg:31"/> <Sig Type="SIG" Name="DC_Con3:7"/>
<Sig Type="SIG" Name="DC_Con3:8"/>
<Sig Type="SIG" Name="DC_Con3:9"/>
<Sig Type="SIG" Name="DC_Con3:10"/>
<Sig Type="SIG" Name="DC_Con3:11"/>
<Sig Type="SIG" Name="DC_Con3:12"/>
<Sig Type="SIG" Name="DC_Con3:13"/>
<Sig Type="SIG" Name="DC_Con3:14"/>
<Sig Type="SIG" Name="DC_Con3:15"/>
<Sig Type="SIG" Name="DC_Con3:16"/>
<Sig Type="SIG" Name="DC_Con3:17"/>
<Sig Type="SIG" Name="DC_Con3:18"/>
<Sig Type="SIG" Name="DC_Con3:19"/>
<Sig Type="SIG" Name="DC_Con3:20"/>
<Sig Type="SIG" Name="DC_Con3:21"/>
<Sig Type="SIG" Name="DC_Con3:22"/>
<Sig Type="SIG" Name="DC_Con3:23"/>
</Bus> </Bus>
<Sig Type="SIG" Name="BUS_Con_1/data_ready"/> <Bus Name="o_PMU_OC_3">
<Bus Name="BUS_Con_1/o_addr"> <Sig Type="SIG" Name="o_PMU_OC_3:0"/>
<Sig Type="SIG" Name="BUS_Con_1/o_addr:0"/> <Sig Type="SIG" Name="o_PMU_OC_3:1"/>
<Sig Type="SIG" Name="BUS_Con_1/o_addr:1"/> <Sig Type="SIG" Name="o_PMU_OC_3:2"/>
<Sig Type="SIG" Name="BUS_Con_1/o_addr:2"/> <Sig Type="SIG" Name="o_PMU_OC_3:3"/>
<Sig Type="SIG" Name="BUS_Con_1/o_addr:3"/> <Sig Type="SIG" Name="o_PMU_OC_3:4"/>
<Sig Type="SIG" Name="BUS_Con_1/o_addr:4"/> <Sig Type="SIG" Name="o_PMU_OC_3:5"/>
<Sig Type="SIG" Name="BUS_Con_1/o_addr:5"/> <Sig Type="SIG" Name="o_PMU_OC_3:6"/>
<Sig Type="SIG" Name="BUS_Con_1/o_addr:6"/> <Sig Type="SIG" Name="o_PMU_OC_3:7"/>
<Sig Type="SIG" Name="o_PMU_OC_3:8"/>
<Sig Type="SIG" Name="o_PMU_OC_3:9"/>
<Sig Type="SIG" Name="o_PMU_OC_3:10"/>
<Sig Type="SIG" Name="o_PMU_OC_3:11"/>
<Sig Type="SIG" Name="o_PMU_OC_3:12"/>
<Sig Type="SIG" Name="o_PMU_OC_3:13"/>
<Sig Type="SIG" Name="o_PMU_OC_3:14"/>
<Sig Type="SIG" Name="o_PMU_OC_3:15"/>
<Sig Type="SIG" Name="o_PMU_OC_3:16"/>
<Sig Type="SIG" Name="o_PMU_OC_3:17"/>
<Sig Type="SIG" Name="o_PMU_OC_3:18"/>
<Sig Type="SIG" Name="o_PMU_OC_3:19"/>
<Sig Type="SIG" Name="o_PMU_OC_3:20"/>
<Sig Type="SIG" Name="o_PMU_OC_3:21"/>
<Sig Type="SIG" Name="o_PMU_OC_3:22"/>
<Sig Type="SIG" Name="o_PMU_OC_3:23"/>
<Sig Type="SIG" Name="o_PMU_OC_3:24"/>
<Sig Type="SIG" Name="o_PMU_OC_3:25"/>
<Sig Type="SIG" Name="o_PMU_OC_3:26"/>
<Sig Type="SIG" Name="o_PMU_OC_3:27"/>
<Sig Type="SIG" Name="o_PMU_OC_3:28"/>
<Sig Type="SIG" Name="o_PMU_OC_3:29"/>
<Sig Type="SIG" Name="o_PMU_OC_3:30"/>
<Sig Type="SIG" Name="o_PMU_OC_3:31"/>
</Bus> </Bus>
<Sig Type="SIG" Name="BUS_Con_1/i_rvalid"/> <Bus Name="o_DMM_EN">
<Bus Name="BUS_Con_1/miso_shift"> <Sig Type="SIG" Name="o_DMM_EN:0"/>
<Sig Type="SIG" Name="BUS_Con_1/miso_shift:0"/> <Sig Type="SIG" Name="o_DMM_EN:1"/>
<Sig Type="SIG" Name="BUS_Con_1/miso_shift:1"/> <Sig Type="SIG" Name="o_DMM_EN:2"/>
<Sig Type="SIG" Name="BUS_Con_1/miso_shift:2"/> <Sig Type="SIG" Name="o_DMM_EN:3"/>
<Sig Type="SIG" Name="BUS_Con_1/miso_shift:3"/> <Sig Type="SIG" Name="o_DMM_EN:4"/>
<Sig Type="SIG" Name="BUS_Con_1/miso_shift:4"/> <Sig Type="SIG" Name="o_DMM_EN:5"/>
<Sig Type="SIG" Name="BUS_Con_1/miso_shift:5"/> <Sig Type="SIG" Name="o_DMM_EN:6"/>
<Sig Type="SIG" Name="BUS_Con_1/miso_shift:6"/> <Sig Type="SIG" Name="o_DMM_EN:7"/>
<Sig Type="SIG" Name="BUS_Con_1/miso_shift:7"/> <Sig Type="SIG" Name="o_DMM_EN:8"/>
<Sig Type="SIG" Name="BUS_Con_1/miso_shift:8"/> <Sig Type="SIG" Name="o_DMM_EN:9"/>
<Sig Type="SIG" Name="BUS_Con_1/miso_shift:9"/> <Sig Type="SIG" Name="o_DMM_EN:10"/>
<Sig Type="SIG" Name="BUS_Con_1/miso_shift:10"/> <Sig Type="SIG" Name="o_DMM_EN:11"/>
<Sig Type="SIG" Name="BUS_Con_1/miso_shift:11"/> <Sig Type="SIG" Name="o_DMM_EN:12"/>
<Sig Type="SIG" Name="BUS_Con_1/miso_shift:12"/> <Sig Type="SIG" Name="o_DMM_EN:13"/>
<Sig Type="SIG" Name="BUS_Con_1/miso_shift:13"/> <Sig Type="SIG" Name="o_DMM_EN:14"/>
<Sig Type="SIG" Name="BUS_Con_1/miso_shift:14"/> <Sig Type="SIG" Name="o_DMM_EN:15"/>
<Sig Type="SIG" Name="BUS_Con_1/miso_shift:15"/> <Sig Type="SIG" Name="o_DMM_EN:16"/>
<Sig Type="SIG" Name="BUS_Con_1/miso_shift:16"/> <Sig Type="SIG" Name="o_DMM_EN:17"/>
<Sig Type="SIG" Name="BUS_Con_1/miso_shift:17"/> <Sig Type="SIG" Name="o_DMM_EN:18"/>
<Sig Type="SIG" Name="BUS_Con_1/miso_shift:18"/>
<Sig Type="SIG" Name="BUS_Con_1/miso_shift:19"/>
<Sig Type="SIG" Name="BUS_Con_1/miso_shift:20"/>
<Sig Type="SIG" Name="BUS_Con_1/miso_shift:21"/>
<Sig Type="SIG" Name="BUS_Con_1/miso_shift:22"/>
<Sig Type="SIG" Name="BUS_Con_1/miso_shift:23"/>
<Sig Type="SIG" Name="BUS_Con_1/miso_shift:24"/>
<Sig Type="SIG" Name="BUS_Con_1/miso_shift:25"/>
<Sig Type="SIG" Name="BUS_Con_1/miso_shift:26"/>
<Sig Type="SIG" Name="BUS_Con_1/miso_shift:27"/>
<Sig Type="SIG" Name="BUS_Con_1/miso_shift:28"/>
<Sig Type="SIG" Name="BUS_Con_1/miso_shift:29"/>
<Sig Type="SIG" Name="BUS_Con_1/miso_shift:30"/>
<Sig Type="SIG" Name="BUS_Con_1/miso_shift:31"/>
</Bus>
<Sig Type="SIG" Name="BUS_Con_1/o_miso"/>
<Bus Name="BUS_Con_1/i_rdata">
<Sig Type="SIG" Name="BUS_Con_1/i_rdata:0"/>
<Sig Type="SIG" Name="BUS_Con_1/i_rdata:1"/>
<Sig Type="SIG" Name="BUS_Con_1/i_rdata:2"/>
<Sig Type="SIG" Name="BUS_Con_1/i_rdata:3"/>
<Sig Type="SIG" Name="BUS_Con_1/i_rdata:4"/>
<Sig Type="SIG" Name="BUS_Con_1/i_rdata:5"/>
<Sig Type="SIG" Name="BUS_Con_1/i_rdata:6"/>
<Sig Type="SIG" Name="BUS_Con_1/i_rdata:7"/>
<Sig Type="SIG" Name="BUS_Con_1/i_rdata:8"/>
<Sig Type="SIG" Name="BUS_Con_1/i_rdata:9"/>
<Sig Type="SIG" Name="BUS_Con_1/i_rdata:10"/>
<Sig Type="SIG" Name="BUS_Con_1/i_rdata:11"/>
<Sig Type="SIG" Name="BUS_Con_1/i_rdata:12"/>
<Sig Type="SIG" Name="BUS_Con_1/i_rdata:13"/>
<Sig Type="SIG" Name="BUS_Con_1/i_rdata:14"/>
<Sig Type="SIG" Name="BUS_Con_1/i_rdata:15"/>
<Sig Type="SIG" Name="BUS_Con_1/i_rdata:16"/>
<Sig Type="SIG" Name="BUS_Con_1/i_rdata:17"/>
<Sig Type="SIG" Name="BUS_Con_1/i_rdata:18"/>
<Sig Type="SIG" Name="BUS_Con_1/i_rdata:19"/>
<Sig Type="SIG" Name="BUS_Con_1/i_rdata:20"/>
<Sig Type="SIG" Name="BUS_Con_1/i_rdata:21"/>
<Sig Type="SIG" Name="BUS_Con_1/i_rdata:22"/>
<Sig Type="SIG" Name="BUS_Con_1/i_rdata:23"/>
</Bus> </Bus>
</Trace> </Trace>
<Trigger> <Trigger>
<TU Serialbits="0" Type="0" ID="1" Sig="i_rst_n,"/> <TU Serialbits="0" Type="0" ID="1" Sig="i_rst_n,"/>
<TU Serialbits="0" Type="0" ID="2" Sig="i_cs,"/> <TU Serialbits="0" Type="0" ID="2" Sig="i_cs,"/>
<TU Serialbits="0" Type="0" ID="3" Sig="con_exec,"/>
<TE MaxSequence="2" MaxEvnCnt="1" ID="1" Resource="0"/> <TE MaxSequence="2" MaxEvnCnt="1" ID="1" Resource="0"/>
<TE MaxSequence="2" MaxEvnCnt="1" ID="2" Resource="0"/>
</Trigger> </Trigger>
</Dataset> </Dataset>
</Core> </Core>
+104 -94
View File
@@ -1,4 +1,4 @@
<Project ModBy="Inserter" Name="C:/Users/testrong/Documents/Work/NewInstrCalBoard/2.FW/CPLD/CPLD1/debug.rvl" Date="2026-06-01"> <Project ModBy="Inserter" Name="C:/Users/testrong/Documents/Work/NewInstrCalBoard/2.FW/CPLD/CPLD1/debug.rvl" Date="2026-06-09">
<Core Name="RelayConTop_LA0"> <Core Name="RelayConTop_LA0">
<Setting> <Setting>
<Capture SamplesPerTrig="2048" NumTrigsCap="1"/> <Capture SamplesPerTrig="2048" NumTrigsCap="1"/>
@@ -7,105 +7,115 @@
</Setting> </Setting>
<Dataset Name="Base"> <Dataset Name="Base">
<Trace> <Trace>
<Sig Name="BUS_Con_1/i_cs"/> <Sig Name="con_exec"/>
<Sig Name="BUS_Con_1/i_sclk"/> <Sig Name="con_done"/>
<Sig Name="BUS_Con_1/i_mosi"/> <Bus Name="RC_RLSel" Radix="0">
<Bus Name="BUS_Con_1/bit_cnt" Radix="0"> <Sig Name="RC_RLSel:0"/>
<Sig Name="BUS_Con_1/bit_cnt:0"/> <Sig Name="RC_RLSel:1"/>
<Sig Name="BUS_Con_1/bit_cnt:1"/> <Sig Name="RC_RLSel:2"/>
<Sig Name="BUS_Con_1/bit_cnt:2"/> <Sig Name="RC_RLSel:3"/>
<Sig Name="BUS_Con_1/bit_cnt:3"/> <Sig Name="RC_RLSel:4"/>
<Sig Name="BUS_Con_1/bit_cnt:4"/> <Sig Name="RC_RLSel:5"/>
<Sig Name="BUS_Con_1/bit_cnt:5"/> <Sig Name="RC_RLSel:6"/>
<Sig Name="RC_RLSel:7"/>
<Sig Name="RC_RLSel:8"/>
<Sig Name="RC_RLSel:9"/>
<Sig Name="RC_RLSel:10"/>
<Sig Name="RC_RLSel:11"/>
<Sig Name="RC_RLSel:12"/>
<Sig Name="RC_RLSel:13"/>
<Sig Name="RC_RLSel:14"/>
<Sig Name="RC_RLSel:15"/>
<Sig Name="RC_RLSel:16"/>
<Sig Name="RC_RLSel:17"/>
</Bus> </Bus>
<Bus Name="BUS_Con_1/recv_reg" Radix="0"> <Bus Name="DC_Con3" Radix="0">
<Sig Name="BUS_Con_1/recv_reg:24"/> <Sig Name="DC_Con3:0"/>
<Sig Name="BUS_Con_1/recv_reg:25"/> <Sig Name="DC_Con3:1"/>
<Sig Name="BUS_Con_1/recv_reg:26"/> <Sig Name="DC_Con3:2"/>
<Sig Name="BUS_Con_1/recv_reg:27"/> <Sig Name="DC_Con3:3"/>
<Sig Name="BUS_Con_1/recv_reg:28"/> <Sig Name="DC_Con3:4"/>
<Sig Name="BUS_Con_1/recv_reg:29"/> <Sig Name="DC_Con3:5"/>
<Sig Name="BUS_Con_1/recv_reg:30"/> <Sig Name="DC_Con3:6"/>
<Sig Name="BUS_Con_1/recv_reg:31"/> <Sig Name="DC_Con3:7"/>
<Sig Name="DC_Con3:8"/>
<Sig Name="DC_Con3:9"/>
<Sig Name="DC_Con3:10"/>
<Sig Name="DC_Con3:11"/>
<Sig Name="DC_Con3:12"/>
<Sig Name="DC_Con3:13"/>
<Sig Name="DC_Con3:14"/>
<Sig Name="DC_Con3:15"/>
<Sig Name="DC_Con3:16"/>
<Sig Name="DC_Con3:17"/>
<Sig Name="DC_Con3:18"/>
<Sig Name="DC_Con3:19"/>
<Sig Name="DC_Con3:20"/>
<Sig Name="DC_Con3:21"/>
<Sig Name="DC_Con3:22"/>
<Sig Name="DC_Con3:23"/>
</Bus> </Bus>
<Sig Name="BUS_Con_1/data_ready"/> <Bus Name="o_PMU_OC_3" Radix="0">
<Bus Name="BUS_Con_1/o_addr" Radix="0"> <Sig Name="o_PMU_OC_3:0"/>
<Sig Name="BUS_Con_1/o_addr:0"/> <Sig Name="o_PMU_OC_3:1"/>
<Sig Name="BUS_Con_1/o_addr:1"/> <Sig Name="o_PMU_OC_3:2"/>
<Sig Name="BUS_Con_1/o_addr:2"/> <Sig Name="o_PMU_OC_3:3"/>
<Sig Name="BUS_Con_1/o_addr:3"/> <Sig Name="o_PMU_OC_3:4"/>
<Sig Name="BUS_Con_1/o_addr:4"/> <Sig Name="o_PMU_OC_3:5"/>
<Sig Name="BUS_Con_1/o_addr:5"/> <Sig Name="o_PMU_OC_3:6"/>
<Sig Name="BUS_Con_1/o_addr:6"/> <Sig Name="o_PMU_OC_3:7"/>
<Sig Name="o_PMU_OC_3:8"/>
<Sig Name="o_PMU_OC_3:9"/>
<Sig Name="o_PMU_OC_3:10"/>
<Sig Name="o_PMU_OC_3:11"/>
<Sig Name="o_PMU_OC_3:12"/>
<Sig Name="o_PMU_OC_3:13"/>
<Sig Name="o_PMU_OC_3:14"/>
<Sig Name="o_PMU_OC_3:15"/>
<Sig Name="o_PMU_OC_3:16"/>
<Sig Name="o_PMU_OC_3:17"/>
<Sig Name="o_PMU_OC_3:18"/>
<Sig Name="o_PMU_OC_3:19"/>
<Sig Name="o_PMU_OC_3:20"/>
<Sig Name="o_PMU_OC_3:21"/>
<Sig Name="o_PMU_OC_3:22"/>
<Sig Name="o_PMU_OC_3:23"/>
<Sig Name="o_PMU_OC_3:24"/>
<Sig Name="o_PMU_OC_3:25"/>
<Sig Name="o_PMU_OC_3:26"/>
<Sig Name="o_PMU_OC_3:27"/>
<Sig Name="o_PMU_OC_3:28"/>
<Sig Name="o_PMU_OC_3:29"/>
<Sig Name="o_PMU_OC_3:30"/>
<Sig Name="o_PMU_OC_3:31"/>
</Bus> </Bus>
<Sig Name="BUS_Con_1/i_rvalid"/> <Bus Name="o_DMM_EN" Radix="0">
<Bus Name="BUS_Con_1/miso_shift" Radix="0"> <Sig Name="o_DMM_EN:0"/>
<Sig Name="BUS_Con_1/miso_shift:0"/> <Sig Name="o_DMM_EN:1"/>
<Sig Name="BUS_Con_1/miso_shift:1"/> <Sig Name="o_DMM_EN:2"/>
<Sig Name="BUS_Con_1/miso_shift:2"/> <Sig Name="o_DMM_EN:3"/>
<Sig Name="BUS_Con_1/miso_shift:3"/> <Sig Name="o_DMM_EN:4"/>
<Sig Name="BUS_Con_1/miso_shift:4"/> <Sig Name="o_DMM_EN:5"/>
<Sig Name="BUS_Con_1/miso_shift:5"/> <Sig Name="o_DMM_EN:6"/>
<Sig Name="BUS_Con_1/miso_shift:6"/> <Sig Name="o_DMM_EN:7"/>
<Sig Name="BUS_Con_1/miso_shift:7"/> <Sig Name="o_DMM_EN:8"/>
<Sig Name="BUS_Con_1/miso_shift:8"/> <Sig Name="o_DMM_EN:9"/>
<Sig Name="BUS_Con_1/miso_shift:9"/> <Sig Name="o_DMM_EN:10"/>
<Sig Name="BUS_Con_1/miso_shift:10"/> <Sig Name="o_DMM_EN:11"/>
<Sig Name="BUS_Con_1/miso_shift:11"/> <Sig Name="o_DMM_EN:12"/>
<Sig Name="BUS_Con_1/miso_shift:12"/> <Sig Name="o_DMM_EN:13"/>
<Sig Name="BUS_Con_1/miso_shift:13"/> <Sig Name="o_DMM_EN:14"/>
<Sig Name="BUS_Con_1/miso_shift:14"/> <Sig Name="o_DMM_EN:15"/>
<Sig Name="BUS_Con_1/miso_shift:15"/> <Sig Name="o_DMM_EN:16"/>
<Sig Name="BUS_Con_1/miso_shift:16"/> <Sig Name="o_DMM_EN:17"/>
<Sig Name="BUS_Con_1/miso_shift:17"/> <Sig Name="o_DMM_EN:18"/>
<Sig Name="BUS_Con_1/miso_shift:18"/>
<Sig Name="BUS_Con_1/miso_shift:19"/>
<Sig Name="BUS_Con_1/miso_shift:20"/>
<Sig Name="BUS_Con_1/miso_shift:21"/>
<Sig Name="BUS_Con_1/miso_shift:22"/>
<Sig Name="BUS_Con_1/miso_shift:23"/>
<Sig Name="BUS_Con_1/miso_shift:24"/>
<Sig Name="BUS_Con_1/miso_shift:25"/>
<Sig Name="BUS_Con_1/miso_shift:26"/>
<Sig Name="BUS_Con_1/miso_shift:27"/>
<Sig Name="BUS_Con_1/miso_shift:28"/>
<Sig Name="BUS_Con_1/miso_shift:29"/>
<Sig Name="BUS_Con_1/miso_shift:30"/>
<Sig Name="BUS_Con_1/miso_shift:31"/>
</Bus>
<Sig Name="BUS_Con_1/o_miso"/>
<Bus Name="BUS_Con_1/i_rdata" Radix="0">
<Sig Name="BUS_Con_1/i_rdata:0"/>
<Sig Name="BUS_Con_1/i_rdata:1"/>
<Sig Name="BUS_Con_1/i_rdata:2"/>
<Sig Name="BUS_Con_1/i_rdata:3"/>
<Sig Name="BUS_Con_1/i_rdata:4"/>
<Sig Name="BUS_Con_1/i_rdata:5"/>
<Sig Name="BUS_Con_1/i_rdata:6"/>
<Sig Name="BUS_Con_1/i_rdata:7"/>
<Sig Name="BUS_Con_1/i_rdata:8"/>
<Sig Name="BUS_Con_1/i_rdata:9"/>
<Sig Name="BUS_Con_1/i_rdata:10"/>
<Sig Name="BUS_Con_1/i_rdata:11"/>
<Sig Name="BUS_Con_1/i_rdata:12"/>
<Sig Name="BUS_Con_1/i_rdata:13"/>
<Sig Name="BUS_Con_1/i_rdata:14"/>
<Sig Name="BUS_Con_1/i_rdata:15"/>
<Sig Name="BUS_Con_1/i_rdata:16"/>
<Sig Name="BUS_Con_1/i_rdata:17"/>
<Sig Name="BUS_Con_1/i_rdata:18"/>
<Sig Name="BUS_Con_1/i_rdata:19"/>
<Sig Name="BUS_Con_1/i_rdata:20"/>
<Sig Name="BUS_Con_1/i_rdata:21"/>
<Sig Name="BUS_Con_1/i_rdata:22"/>
<Sig Name="BUS_Con_1/i_rdata:23"/>
</Bus> </Bus>
</Trace> </Trace>
<Trigger> <Trigger>
<TU Operator="7" Name="TU2" ID="1" Value="0" Radix="0"/> <TU Operator="7" Name="TU1" ID="1" Value="0" Radix="0"/>
<TU Operator="7" Name="TU3" ID="2" Value="0" Radix="0"/> <TU Operator="7" Name="TU2" ID="2" Value="0" Radix="0"/>
<TE Enable="1" Expression="TU2" Name="TE2" ID="1"/> <TU Operator="6" Name="TU3" ID="3" Value="0" Radix="0"/>
<TE Enable="1" Expression="TU3" Name="TE3" ID="2"/> <TE Enable="1" Expression="TU3" Name="TE3" ID="1"/>
</Trigger> </Trigger>
</Dataset> </Dataset>
</Core> </Core>
File diff suppressed because it is too large Load Diff
+2 -2
View File
@@ -20,8 +20,8 @@
<BScanVal>0</BScanVal> <BScanVal>0</BScanVal>
</Bypass> </Bypass>
<File>C:/Users/testrong/Documents/Work/NewInstrCalBoard/2.FW/CPLD/CPLD1/impl1/NewExtIns_CPLD1_impl1.jed</File> <File>C:/Users/testrong/Documents/Work/NewInstrCalBoard/2.FW/CPLD/CPLD1/impl1/NewExtIns_CPLD1_impl1.jed</File>
<FileTime>05/29/26 15:43:40</FileTime> <FileTime>06/04/26 14:18:11</FileTime>
<JedecChecksum>0x092E</JedecChecksum> <JedecChecksum>0x5D88</JedecChecksum>
<Operation>FLASH Erase,Program,Verify</Operation> <Operation>FLASH Erase,Program,Verify</Operation>
<Option> <Option>
<SVFVendor>JTAG STANDARD</SVFVendor> <SVFVendor>JTAG STANDARD</SVFVendor>
+6 -2
View File
@@ -1,3 +1,7 @@
/home/ly0kos/work/prj/New_CalBoard/2.FW/CPLD1/tb_RelayConTop.sv C:/Users/testrong/Documents/Work/NewInstrCalBoard/2.FW/CPLD/CPLD1/Reg_file.v
/home/ly0kos/work/prj/New_CalBoard/2.FW/CPLD1/RelayConTop_tf.v C:/Users/testrong/Documents/Work/NewInstrCalBoard/2.FW/CPLD/CPLD1/BUS_Con.v
C:/Users/testrong/Documents/Work/NewInstrCalBoard/2.FW/CPLD/CPLD1/RelayConTop.v
C:/Users/testrong/Documents/Work/NewInstrCalBoard/2.FW/CPLD/CPLD1/tb_RelayConTop.sv
C:/Users/testrong/Documents/Work/NewInstrCalBoard/2.FW/CPLD/CPLD1/RelayConTop_tf.v
C:/Users/testrong/Documents/Work/NewInstrCalBoard/2.FW/CPLD/CPLD1/CPLD_Con.v
+173 -727
View File
@@ -1,14 +1,13 @@
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
// //
// Testbench: CPLD1 - SPI Communication & Register R/W // Testbench: CPLD1 - SPI Register R/W (Simplified)
// Project: NewCalBoard DIG // Project: NewCalBoard DIG
// Tool: Lattice Diamond Verilog-2001 simulator // Tool: Lattice Diamond Verilog-2001 simulator
// Purpose: Verify SPI protocol (MISO/MOSI timing) and register read/write // Purpose: Verify SPI register read/write using only i_sclk, i_cs, i_mosi, o_miso
// on the full RelayConTop design.
// //
// Protocol: // Protocol:
// Write: [WR=1][Addr:7b][Data:24b] = 32 bits // Write: [1][Addr:7b][Data:24b] = 32 bits
// Read: [WR=0][Addr:7b][Don'tCare:24b] -> MISO returns [8'h00][24-bit rdata] // Read: [0][Addr:7b][Don'tCare:24b] -> MISO returns [8'h00][24-bit rdata]
// //
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
@@ -19,90 +18,17 @@
module tb_SPI_RegRW; module tb_SPI_RegRW;
////==========================================================================
// Signal declarations - mirrors RelayConTop pinout exactly
////==========================================================================
// Clock & reset // Clock & reset
reg i_sys_clk; reg i_sys_clk;
reg i_rst_n; reg i_rst_n;
// SPI interface (Zynq PS drives these) // SPI interface - only 4 signals used in reality
reg i_sclk; reg i_sclk;
reg i_mosi; reg i_mosi;
reg i_cs; reg i_cs;
// Flow control (from Zynq PS / SPI_Con IP)
reg i_rready;
reg i_wvalid;
// Status outputs (monitored by testbench)
wire o_miso; wire o_miso;
wire o_wready;
wire o_err;
wire o_con_done;
// Relay control outputs // Clock generation
wire o_IO_RC1;
wire o_RC_VSel;
wire o_RC_ISel;
wire [17:0] o_RC_RLSel;
wire [1:0] o_RC_LOF;
wire [1:0] o_RC_LOS;
wire o_RC_T27;
wire o_RC_T28;
wire o_RC_T29;
wire o_RC_T30;
wire o_RC_T31;
wire o_RC_T32;
// PMU output channels (4 x 32-bit)
wire [31:0] o_PMU_OC_1;
wire [31:0] o_PMU_OC_2;
wire [31:0] o_PMU_OC_3;
wire [31:0] o_PMU_OC_4;
// DMM enable bus (19 bits)
wire [18:0] o_DMM_EN;
////==========================================================================
// DUT instantiation - connect every pin
////==========================================================================
RelayConTop DUT (
.i_sys_clk (i_sys_clk),
.i_rst_n (i_rst_n),
.i_sclk (i_sclk),
.i_mosi (i_mosi),
.i_cs (i_cs),
.o_miso (o_miso),
.i_rready (i_rready),
.i_wvalid (i_wvalid),
.o_wready (o_wready),
.o_err (o_err),
.o_con_done (o_con_done),
.o_DMM_EN (o_DMM_EN),
.o_IO_RC1 (o_IO_RC1),
.o_RC_T27 (o_RC_T27),
.o_RC_T28 (o_RC_T28),
.o_RC_T29 (o_RC_T29),
.o_RC_T30 (o_RC_T30),
.o_RC_T31 (o_RC_T31),
.o_RC_T32 (o_RC_T32),
.o_RC_RLSel (o_RC_RLSel),
.o_RC_VSel (o_RC_VSel),
.o_RC_ISel (o_RC_ISel),
.o_RC_LOF (o_RC_LOF),
.o_RC_LOS (o_RC_LOS),
.o_PMU_OC_1 (o_PMU_OC_1),
.o_PMU_OC_2 (o_PMU_OC_2),
.o_PMU_OC_3 (o_PMU_OC_3),
.o_PMU_OC_4 (o_PMU_OC_4)
);
//==========================================================================
// Clock Generation
//==========================================================================
initial begin initial begin
i_sys_clk = 0; i_sys_clk = 0;
forever #(`SYS_CLK_PERIOD / 2) i_sys_clk = ~i_sys_clk; forever #(`SYS_CLK_PERIOD / 2) i_sys_clk = ~i_sys_clk;
@@ -113,142 +39,21 @@ module tb_SPI_RegRW;
forever #(`SPI_CLK_PERIOD / 2) i_sclk = ~i_sclk; forever #(`SPI_CLK_PERIOD / 2) i_sclk = ~i_sclk;
end end
//========================================================================== // DUT instantiation - only essential pins
// Test Statistics RelayConTop DUT (
//========================================================================== .i_sys_clk(i_sys_clk),
integer test_pass; .i_rst_n (i_rst_n),
integer test_fail; .i_sclk (i_sclk),
integer test_num; // assertion count .i_mosi (i_mosi),
integer test_case_num; // test case count (7 main tests + optional) .i_cs (i_cs),
.o_miso (o_miso)
initial begin );
test_pass = 0;
test_fail = 0;
test_num = 0;
test_case_num = 0;
end
task tb_pass;
input string msg;
begin
test_pass = test_pass + 1;
$display("[PASS] Assertion %0d: %s", test_num, msg);
end
endtask
task tb_fail;
input string msg;
input string detail;
begin
test_fail = test_fail + 1;
$display("[FAIL] Assertion %0d: %s >> %s", test_num, msg, detail);
end
endtask
task tb_assert;
input condition;
input string msg;
input string detail;
begin
test_num = test_num + 1;
if (condition) begin
tb_pass(msg);
end else begin
tb_fail(msg, detail);
end
end
endtask
//========================================================================== //==========================================================================
// SPI Helper Tasks // SPI Helper Tasks - Mode 0 (CPOL=0, CPHA=0), MSB first, 32 bits
//
// SPI Mode 0: CPOL=0, CPHA=0
// - SCLK idle LOW
// - MOSI sampled on RISING edge
// - MISO shifted on FALLING edge
// - MSB first, 32 bits per transaction
//
// MISO is tri-stated (high-Z) when CS is HIGH.
//========================================================================== //==========================================================================
// --- spi_send: Drive a 32-bit word out through MOSI --- // Build 32-bit write frame: {1'b1, addr[6:0], data[23:0]}
task spi_send;
input [31:0] data;
integer i;
begin
@(negedge i_sclk);
i_cs = 1'b0;
@(negedge i_sclk);
for (i = 31; i >= 0; i = i - 1) begin
i_mosi = data[i];
@(posedge i_sclk);
end
@(negedge i_sclk);
i_cs = 1'b1;
i_mosi = 1'b0;
@(negedge i_sclk);
end
endtask
// --- spi_read: Send command, capture response on MISO ---
// C1 Fix: Added @(posedge i_sys_clk) after CS low to allow BUS_Con
// 2-stage sync chain (cs_sync/sclk_sync) to settle before MISO sampling.
// W2 Fix: #1 delay = 1ps (min time step) for clock-to-Q timing margin.
task spi_read;
input [31:0] cmd;
output [31:0] rdata;
integer i;
begin
@(negedge i_sclk);
i_cs = 1'b0;
@(posedge i_sys_clk); // C1: System clock sync for BUS_Con cross-domain settle
rdata = 32'b0;
for (i = 31; i >= 0; i = i - 1) begin
i_mosi = cmd[i];
@(posedge i_sclk);
@(negedge i_sclk);
#1; // W2: 1ps clock-to-Q timing margin for MISO sampling
rdata[i] = o_miso;
end
@(negedge i_sclk);
i_cs = 1'b1;
i_mosi = 1'b0;
@(negedge i_sclk);
end
endtask
// --- spi_write: Send a write command ---
task spi_write;
input [31:0] data;
begin
spi_send(data);
end
endtask
//--- wait_wready: Wait for SPI to be ready ---
task wait_wready;
input [15:0] max_cycles;
output [1:0] result;
integer i;
begin
result = 2'b0;
for (i = 0; i < max_cycles; i = i + 1) begin
#(`SYS_CLK_PERIOD);
if (o_wready) begin
result = 2'b1;
return;
end
end
end
endtask
//==========================================================================
// Convenience: Build SPI frames
//==========================================================================
function [31:0] mk_write; function [31:0] mk_write;
input [6:0] addr; input [6:0] addr;
input [23:0] data; input [23:0] data;
@@ -257,6 +62,7 @@ module tb_SPI_RegRW;
end end
endfunction endfunction
// Build 32-bit read frame: {1'b0, addr[6:0], 24'b0}
function [31:0] mk_read; function [31:0] mk_read;
input [6:0] addr; input [6:0] addr;
begin begin
@@ -264,6 +70,65 @@ module tb_SPI_RegRW;
end end
endfunction endfunction
// Drive a 32-bit word out through MOSI
// SPI Mode 0: data prepared on falling edge, sampled on rising edge
task spi_send;
input [31:0] data;
integer i;
begin
@(negedge i_sclk); // Wait for any negedge to enter
i_cs = 1'b0;
i_mosi = data[31]; // Drive first bit on SAME edge as CS
for (i = 31; i >= 0; i = i - 1) begin
@(posedge i_sclk); // DUT samples MOSI on rising edge
if (i > 0) begin
@(negedge i_sclk); // Next falling edge
i_mosi = data[i - 1];// Setup next bit for next rising edge
end
end
@(negedge i_sclk);
i_cs = 1'b1;
i_mosi = 1'b0;
@(negedge i_sclk);
end
endtask
// Send command, capture response on MISO
// SPI Mode 0: data prepared on falling edge, sampled on rising edge
// DUT shifts MISO out on falling edge → read MISO on falling edge
task spi_read;
input [31:0] cmd;
output [31:0] rdata;
integer i;
begin
@(negedge i_sclk); // Wait for any negedge to enter
i_cs = 1'b0;
i_mosi = cmd[31]; // Drive first bit on SAME edge as CS
rdata = 32'b0;
for (i = 31; i >= 0; i = i - 1) begin
@(posedge i_sclk); // DUT samples MOSI on rising edge
@(negedge i_sclk); // DUT shifts MISO out on falling edge
#1; // clock-to-Q timing margin
rdata[i] = o_miso; // Read shifted-out bit
if (i > 0) begin
i_mosi = cmd[i - 1]; // Setup next bit for next rising edge
end
end
@(negedge i_sclk);
i_cs = 1'b1;
i_mosi = 1'b0;
@(negedge i_sclk);
end
endtask
// Send a write command
task spi_write;
input [31:0] data;
begin
spi_send(data);
end
endtask
//========================================================================== //==========================================================================
// Main Test Sequence // Main Test Sequence
//========================================================================== //==========================================================================
@@ -279,568 +144,149 @@ module tb_SPI_RegRW;
$display(""); $display("");
$display("============================================================="); $display("=============================================================");
$display(" CPLD1 SPI Communication & Register R/W Testbench"); $display(" CPLD1 SPI Register R/W Testbench (Simplified)");
$display(" System clock: %d MHz | SPI clock: %d MHz", $display(" System clock: %d MHz | SPI clock: %d MHz",
1000 / `SYS_CLK_PERIOD, 1000 / `SPI_CLK_PERIOD); 1000 / `SYS_CLK_PERIOD, 1000 / `SPI_CLK_PERIOD);
$display("============================================================="); $display("=============================================================");
$display(""); $display("");
test_spi_miso_mosi_timing(); test_read_registers();
test_ident_register(); test_write_registers();
test_register_rw_cycle();
test_write_then_read(); test_write_then_read();
test_rapid_spi_transactions();
test_error_conditions();
test_miso_tri_state();
test_con_done_flow(); // S3: execution flow test
print_summary(); $display("");
$display("=============================================================");
$display(" *** ALL TESTS COMPLETED ***");
$display("=============================================================");
$display("");
#(`SYS_CLK_PERIOD * 20); #(`SYS_CLK_PERIOD * 20);
$finish; $finish;
end end
//========================================================================== //==========================================================================
// Test 1: MISO/MOSI SPI Timing // Test 1: Read different registers
//========================================================================== //==========================================================================
task test_spi_miso_mosi_timing; task test_read_registers;
reg [31:0] rdata;
reg [1:0] wait_result;
begin
test_case_num = test_case_num + 1;
$display("");
$display("-------------------------------------------------------------");
$display(" Test 1: MISO/MOSI SPI Timing");
$display("-------------------------------------------------------------");
// 1a. MISO is high-Z when CS is HIGH
$display(" 1a. MISO tri-state when CS=HIGH");
i_cs = 1'b1;
@(negedge i_sclk);
tb_assert(o_miso === 1'bz,
"MISO is high-Z when CS=HIGH",
$sformatf("o_miso = %b (expected z)", o_miso));
// 1b. MISO responds after CS goes LOW
$display(" 1b. MISO active after CS=LOW");
spi_read(mk_read(7'd0), rdata);
tb_assert(o_miso !== 1'bz,
"MISO is active (not high-Z) when CS=LOW",
"");
// 1c. Verify data alignment: first 8 bits are 0, then 24-bit data
$display(" 1c. Verify read response alignment");
spi_read(mk_read(7'd0), rdata);
tb_assert(rdata[7:0] === 8'h00,
"First 8 bits of read response are 0 padding",
$sformatf("rdata[7:0] = 0x%02h (expected 0x00)", rdata[7:0]));
tb_assert(rdata[23:0] === 24'h200010,
"Last 24 bits are IDENT register value",
$sformatf("rdata[23:0] = 0x%06h (expected 0x200010)", rdata[23:0]));
// 1d. Write command: verify MOSI is sampled correctly
$display(" 1d. Write command sent correctly");
spi_write(mk_write(7'd2, (24'h0DEADBEE >> 8))); // W3: parentheses for clarity
wait_wready(100, wait_result); // C2: explicit wready check
tb_assert(wait_result[1] === 1'b1,
"wready asserted after write",
$sformatf("wait_result = %b", wait_result));
#(`SPI_CLK_PERIOD);
end
endtask
//==========================================================================
// Test 2: IDENT Register (ADDR 0)
//==========================================================================
task test_ident_register;
reg [31:0] rdata; reg [31:0] rdata;
begin begin
test_case_num = test_case_num + 1;
$display(""); $display("");
$display("-------------------------------------------------------------"); $display("-------------------------------------------------------------");
$display(" Test 2: IDENT Register (ADDR 0)"); $display(" Test 1: Read Different Registers");
$display("-------------------------------------------------------------"); $display("-------------------------------------------------------------");
// 2a. Read IDENT register // Read IDENT register (ADDR 0) - must return 24'h200010
$display(" 2a. Read IDENT register"); $display(" 1a. Read IDENT register (ADDR 0)");
spi_read(mk_read(7'd0), rdata); spi_read(mk_read(7'd0), rdata);
tb_assert(rdata[23:0] === 24'h200010, $display(" ADDR 0 (IDENT) = 0x%06h %s", rdata[23:0],
"IDENT register returns 24'h200010 (CPLD1, v1.1.0)", rdata[23:0] === 24'h200110 ? " [OK]" : " [FAIL]");
$sformatf("rdata[23:0] = 0x%06h", rdata[23:0]));
// 2b. Read IDENT multiple times (should always return same value) // Read same register again (should be identical)
$display(" 2b. Read IDENT multiple times"); $display(" 1b. Read IDENT register again");
spi_read(mk_read(7'd0), rdata); spi_read(mk_read(7'd0), rdata);
tb_assert(rdata[23:0] === 24'h200010, $display(" ADDR 0 (IDENT) = 0x%06h %s", rdata[23:0],
"IDENT register returns same value on repeat read", rdata[23:0] === 24'h200110 ? " [OK]" : " [FAIL]");
"");
spi_read(mk_read(7'd0), rdata); // Read ADDR 1 (STATE_REG)
tb_assert(rdata[23:0] === 24'h200010, $display(" 1c. Read STATE register (ADDR 1)");
"IDENT register returns same value on 3rd read", spi_read(mk_read(7'd1), rdata);
""); $display(" ADDR 1 (STATE) = 0x%06h %s", rdata[23:0],
rdata[23:0] === 24'h800000 ? " [OK]" : " [FAIL]");
#(`SPI_CLK_PERIOD); // Read ADDR 2 (Freq_Slot1)
end $display(" 1d. Read Freq_Slot1 register (ADDR 2)");
endtask
//==========================================================================
// Test 3: Register Read/Write Cycle
//==========================================================================
task test_register_rw_cycle;
reg [31:0] rdata;
reg [1:0] wait_result;
begin
test_case_num = test_case_num + 1;
$display("");
$display("-------------------------------------------------------------");
$display(" Test 3: Register Read/Write Cycle");
$display("-------------------------------------------------------------");
// 3a. Write to ADDR 2 (Freq_Slot1), then read back
$display(" 3a. Write ADDR 2 = 0x000005, read back");
spi_write(mk_write(7'd2, 24'h000005));
wait_wready(100, wait_result); // C2: explicit wready check
tb_assert(wait_result[1] === 1'b1,
"wready asserted after write to ADDR 2",
$sformatf("wait_result = %b", wait_result));
spi_read(mk_read(7'd2), rdata); spi_read(mk_read(7'd2), rdata);
tb_assert(rdata[23:0] === 24'h000005, $display(" ADDR 2 (FreqSlot1) = 0x%06h %s", rdata[23:0],
"ADDR 2: write 0x000005, read back 0x000005", rdata[23:0] === 24'd0 ? " [OK]" : " [FAIL]");
$sformatf("rdata[23:0] = 0x%06h", rdata[23:0]));
// 3b. Write to ADDR 3, read back
$display(" 3b. Write ADDR 3 = 0x003001, read back");
spi_write(mk_write(7'd3, 24'h003001));
wait_wready(100, wait_result); // C2: explicit wready check
tb_assert(wait_result[1] === 1'b1,
"wready asserted after write to ADDR 3",
$sformatf("wait_result = %b", wait_result));
spi_read(mk_read(7'd3), rdata);
tb_assert(rdata[23:0] === 24'h003001,
"ADDR 3: write 0x003001, read back 0x003001",
$sformatf("rdata[23:0] = 0x%06h", rdata[23:0]));
// 3c. Write to ADDR 4, read back
$display(" 3c. Write ADDR 4 = 0x001040, read back");
spi_write(mk_write(7'd4, 24'h001040));
wait_wready(100, wait_result); // C2: explicit wready check
tb_assert(wait_result[1] === 1'b1,
"wready asserted after write to ADDR 4",
$sformatf("wait_result = %b", wait_result));
spi_read(mk_read(7'd4), rdata);
tb_assert(rdata[23:0] === 24'h001040,
"ADDR 4: write 0x001040, read back 0x001040",
$sformatf("rdata[23:0] = 0x%06h", rdata[23:0]));
// 3d. Write to ADDR 5, read back
$display(" 3d. Write ADDR 5 = 0x000802, read back");
spi_write(mk_write(7'd5, 24'h000802));
wait_wready(100, wait_result); // C2: explicit wready check
tb_assert(wait_result[1] === 1'b1,
"wready asserted after write to ADDR 5",
$sformatf("wait_result = %b", wait_result));
spi_read(mk_read(7'd5), rdata);
tb_assert(rdata[23:0] === 24'h000802,
"ADDR 5: write 0x000802, read back 0x000802",
$sformatf("rdata[23:0] = 0x%06h", rdata[23:0]));
// 3e. Write to ADDR 6 (DC_Slot1), read back
$display(" 3e. Write ADDR 6 = 0x002003, read back");
spi_write(mk_write(7'd6, 24'h002003));
wait_wready(100, wait_result); // C2: explicit wready check
tb_assert(wait_result[1] === 1'b1,
"wready asserted after write to ADDR 6",
$sformatf("wait_result = %b", wait_result));
spi_read(mk_read(7'd6), rdata);
tb_assert(rdata[23:0] === 24'h002003,
"ADDR 6: write 0x002003, read back 0x002003",
$sformatf("rdata[23:0] = 0x%06h", rdata[23:0]));
// 3f. Write all DC registers
$display(" 3f. Write ADDR 7-9, read back");
spi_write(mk_write(7'd7, 24'h004005));
wait_wready(100, wait_result); // C2: explicit wready check
tb_assert(wait_result[1] === 1'b1,
"wready asserted after write to ADDR 7",
$sformatf("wait_result = %b", wait_result));
spi_read(mk_read(7'd7), rdata);
tb_assert(rdata[23:0] === 24'h004005,
"ADDR 7: write 0x004005, read back 0x004005",
"");
spi_write(mk_write(7'd8, 24'h006007));
wait_wready(100, wait_result); // C2: explicit wready check
tb_assert(wait_result[1] === 1'b1,
"wready asserted after write to ADDR 8",
$sformatf("wait_result = %b", wait_result));
spi_read(mk_read(7'd8), rdata);
tb_assert(rdata[23:0] === 24'h006007,
"ADDR 8: write 0x006007, read back 0x006007",
"");
spi_write(mk_write(7'd9, 24'h008009));
wait_wready(100, wait_result); // C2: explicit wready check
tb_assert(wait_result[1] === 1'b1,
"wready asserted after write to ADDR 9",
$sformatf("wait_result = %b", wait_result));
spi_read(mk_read(7'd9), rdata);
tb_assert(rdata[23:0] === 24'h008009,
"ADDR 9: write 0x008009, read back 0x008009",
"");
#(`SPI_CLK_PERIOD); #(`SPI_CLK_PERIOD);
end end
endtask endtask
//========================================================================== //==========================================================================
// Test 4: Write Then Read (separate transactions) // Test 2: Write registers (verify via read-back)
//==========================================================================
task test_write_registers;
reg [31:0] rdata;
begin
$display("");
$display("-------------------------------------------------------------");
$display(" Test 2: Write Registers (verify via read-back)");
$display("-------------------------------------------------------------");
// Write to ADDR 2, then read back
$display(" 2a. Write 0x000005 to ADDR 2, read back");
spi_write(mk_write(7'd2, 24'h000005));
spi_read(mk_read(7'd2), rdata);
$display(" Wrote 0x000005, read 0x%06h %s", rdata[23:0],
rdata[23:0] === 24'h000005 ? " [OK]" : " [FAIL]");
// Write to ADDR 3, then read back
$display(" 2b. Write 0x003001 to ADDR 3, read back");
spi_write(mk_write(7'd3, 24'h003001));
spi_read(mk_read(7'd3), rdata);
$display(" Wrote 0x003001, read 0x%06h %s", rdata[23:0],
rdata[23:0] === 24'h003001 ? " [OK]" : " [FAIL]");
// Write to ADDR 4, then read back
$display(" 2c. Write 0xABCDEF to ADDR 4, read back");
spi_write(mk_write(7'd4, 24'hABCDEF));
spi_read(mk_read(7'd4), rdata);
$display(" Wrote 0xABCDEF, read 0x%06h %s", rdata[23:0],
rdata[23:0] === 24'hABCDEF ? " [OK]" : " [FAIL]");
// Write 0 to ADDR 5, then read back
$display(" 2d. Write 0x000000 to ADDR 5, read back");
spi_write(mk_write(7'd5, 24'h000000));
spi_read(mk_read(7'd5), rdata);
$display(" Wrote 0x000000, read 0x%06h %s", rdata[23:0],
rdata[23:0] === 24'h000000 ? " [OK]" : " [FAIL]");
#(`SPI_CLK_PERIOD);
end
endtask
//==========================================================================
// Test 3: Write then Read / Read then Write (interleaved)
//========================================================================== //==========================================================================
task test_write_then_read; task test_write_then_read;
reg [31:0] rdata; reg [31:0] rdata;
reg [1:0] wait_result;
begin begin
test_case_num = test_case_num + 1;
$display(""); $display("");
$display("-------------------------------------------------------------"); $display("-------------------------------------------------------------");
$display(" Test 4: Write Then Read (separate transactions)"); $display(" Test 3: Write-Then-Read / Read-Then-Write (Interleaved)");
$display("-------------------------------------------------------------"); $display("-------------------------------------------------------------");
// 4a. Write value, wait, then read (verify persistence) // 3a. Write, delay, then read (verify persistence)
$display(" 4a. Write 0xABCDEF to ADDR 2, read after delay"); $display(" 3a. Write 0x112233 to ADDR 6, read after delay");
spi_write(mk_write(7'd2, 24'hABCDEF)); spi_write(mk_write(7'd6, 24'h112233));
wait_wready(100, wait_result); // C2: explicit wready check
tb_assert(wait_result[1] === 1'b1,
"wready asserted after write to ADDR 2",
$sformatf("wait_result = %b", wait_result));
// Simulate some delay (multiple SPI clock cycles)
#(`SPI_CLK_PERIOD * 3); #(`SPI_CLK_PERIOD * 3);
spi_read(mk_read(7'd2), rdata);
tb_assert(rdata[23:0] === 24'hABCDEF,
"ADDR 2: value persists after delay",
$sformatf("rdata[23:0] = 0x%06h (expected 0xABCDEF)", rdata[23:0]));
// 4b. Write another value, read immediately
$display(" 4b. Write 0x112233 to ADDR 3, read immediately");
spi_write(mk_write(7'd3, 24'h112233));
wait_wready(100, wait_result); // C2: explicit wready check
tb_assert(wait_result[1] === 1'b1,
"wready asserted after write to ADDR 3",
$sformatf("wait_result = %b", wait_result));
spi_read(mk_read(7'd3), rdata);
tb_assert(rdata[23:0] === 24'h112233,
"ADDR 3: value reads back immediately",
$sformatf("rdata[23:0] = 0x%06h", rdata[23:0]));
// 4c. Write 0 to register, read back
$display(" 4c. Write 0x000000 to ADDR 4, read back");
spi_write(mk_write(7'd4, 24'h000000));
wait_wready(100, wait_result); // C2: explicit wready check
tb_assert(wait_result[1] === 1'b1,
"wready asserted after write to ADDR 4",
$sformatf("wait_result = %b", wait_result));
spi_read(mk_read(7'd4), rdata);
tb_assert(rdata[23:0] === 24'h000000,
"ADDR 4: write 0x000000, read back 0x000000",
"");
#(`SPI_CLK_PERIOD);
end
endtask
//==========================================================================
// Test 5: Rapid SPI Transactions
//==========================================================================
task test_rapid_spi_transactions;
reg [31:0] rdata;
reg [1:0] wait_result;
begin
test_case_num = test_case_num + 1;
$display("");
$display("-------------------------------------------------------------");
$display(" Test 5: Rapid SPI Transactions");
$display("-------------------------------------------------------------");
// 5a. Multiple rapid writes
$display(" 5a. Rapid successive writes");
spi_write(mk_write(7'd2, 24'h000001));
spi_write(mk_write(7'd3, 24'h000002));
spi_write(mk_write(7'd4, 24'h000003));
spi_write(mk_write(7'd5, 24'h000004));
wait_wready(100, wait_result); // C2: explicit wready check
tb_assert(wait_result[1] === 1'b1,
"wready asserted after rapid writes",
$sformatf("wait_result = %b", wait_result));
// Verify all values
spi_read(mk_read(7'd2), rdata);
tb_assert(rdata[23:0] === 24'h000001,
"Rapid write: ADDR 2 = 0x000001",
$sformatf("rdata[23:0] = 0x%06h", rdata[23:0]));
spi_read(mk_read(7'd3), rdata);
tb_assert(rdata[23:0] === 24'h000002,
"Rapid write: ADDR 3 = 0x000002",
"");
spi_read(mk_read(7'd4), rdata);
tb_assert(rdata[23:0] === 24'h000003,
"Rapid write: ADDR 4 = 0x000003",
"");
spi_read(mk_read(7'd5), rdata);
tb_assert(rdata[23:0] === 24'h000004,
"Rapid write: ADDR 5 = 0x000004",
"");
// 5b. Interleaved write/read
$display(" 5b. Interleaved write/read");
spi_write(mk_write(7'd6, (24'h0DEADBEE >> 8))); // W3: parentheses for clarity
wait_wready(100, wait_result); // C2: explicit wready check
tb_assert(wait_result[1] === 1'b1,
"wready asserted after write to ADDR 6",
$sformatf("wait_result = %b", wait_result));
spi_read(mk_read(7'd6), rdata); spi_read(mk_read(7'd6), rdata);
tb_assert(rdata[23:0] === (24'h0DEADBEE >> 8), $display(" Wrote 0x112233, read 0x%06h %s", rdata[23:0],
"Interleaved: ADDR 6 correct", rdata[23:0] === 24'h112233 ? " [OK]" : " [FAIL]");
"");
spi_write(mk_write(7'd7, (24'hCAFEBE >> 8))); // W3: parentheses for clarity // 3b. Read current value, then write new value, then read again
wait_wready(100, wait_result); // C2: explicit wready check $display(" 3b. Read ADDR 7, write 0x445566, read again");
tb_assert(wait_result[1] === 1'b1,
"wready asserted after write to ADDR 7",
$sformatf("wait_result = %b", wait_result));
spi_read(mk_read(7'd7), rdata); spi_read(mk_read(7'd7), rdata);
tb_assert(rdata[23:0] === (24'hCAFEBE >> 8), $display(" Before write: ADDR 7 = 0x%06h", rdata[23:0]);
"Interleaved: ADDR 7 correct", spi_write(mk_write(7'd7, 24'h445566));
""); spi_read(mk_read(7'd7), rdata);
$display(" After write: ADDR 7 = 0x%06h %s", rdata[23:0],
rdata[23:0] === 24'h445566 ? " [OK]" : " [FAIL]");
// 3c. Rapid successive writes to multiple registers
$display(" 3c. Rapid writes to ADDR 8, 9, then read-back");
spi_write(mk_write(7'd8, 24'h8899AA));
spi_write(mk_write(7'd9, 24'hBBCCDD));
spi_read(mk_read(7'd8), rdata);
$display(" ADDR 8 = 0x%06h %s", rdata[23:0],
rdata[23:0] === 24'h8899AA ? " [OK]" : " [FAIL]");
spi_read(mk_read(7'd9), rdata);
$display(" ADDR 9 = 0x%06h %s", rdata[23:0],
rdata[23:0] === 24'hBBCCDD ? " [OK]" : " [FAIL]");
#(`SPI_CLK_PERIOD); #(`SPI_CLK_PERIOD);
end end
endtask endtask
//==========================================================================
// Test 6: Error Conditions
//==========================================================================
task test_error_conditions;
reg [31:0] rdata;
reg [1:0] wait_result;
begin
test_case_num = test_case_num + 1;
$display("");
$display("-------------------------------------------------------------");
$display(" Test 6: Error Conditions");
$display("-------------------------------------------------------------");
// 6a. Read out-of-bounds address (ADDR 16)
$display(" 6a. Read ADDR 16 (out of bounds)");
tb_assert(o_err === 1'b0, // W1: pre-check o_err is cleared before test
"o_err should be low before Test 6a",
$sformatf("o_err = %b", o_err));
spi_read(mk_read(7'd16), rdata);
@(negedge i_sclk);
#(`SYS_CLK_PERIOD * 5);
tb_assert(o_err === 1'b1,
"o_err HIGH after reading ADDR 16",
"");
i_rst_n = 1'b0;
#(`SYS_CLK_PERIOD * 4);
i_rst_n = 1'b1;
#(`SYS_CLK_PERIOD * 4);
tb_assert(o_err === 1'b0,
"o_err cleared after reset",
"");
// 6b. Write to out-of-bounds address (ADDR 31)
$display(" 6b. Write ADDR 31 (out of bounds)");
tb_assert(o_err === 1'b0, // W1: pre-check o_err is cleared before test
"o_err should be low before Test 6b",
$sformatf("o_err = %b", o_err));
spi_write(mk_write(7'd31, 24'h123456));
wait_wready(100, wait_result); // C2: explicit wready check
#(`SYS_CLK_PERIOD * 5);
tb_assert(o_err === 1'b1,
"o_err HIGH after writing ADDR 31",
"");
i_rst_n = 1'b0;
#(`SYS_CLK_PERIOD * 4);
i_rst_n = 1'b1;
#(`SYS_CLK_PERIOD * 4);
tb_assert(o_err === 1'b0,
"o_err cleared after reset",
"");
// 6c. Short SPI transaction (16 bits)
$display(" 6c. Short SPI transaction (16 bits)");
tb_assert(o_err === 1'b0, // W1: pre-check o_err is cleared before test
"o_err should be low before Test 6c",
$sformatf("o_err = %b", o_err));
i_cs = 1'b0;
#(`SYS_CLK_PERIOD * 2); // W4: allow BUS_Con sync chain to settle
@(negedge i_sclk);
@(negedge i_sclk);
for (integer bi = 0; bi < 16; bi = bi + 1) begin
i_mosi = 1'b0;
@(posedge i_sclk);
@(negedge i_sclk);
end
i_cs = 1'b1;
@(negedge i_sclk);
#(`SYS_CLK_PERIOD * 5);
tb_assert(o_err === 1'b1,
"o_err HIGH after short SPI transaction",
"");
i_rst_n = 1'b0;
#(`SYS_CLK_PERIOD * 4);
i_rst_n = 1'b1;
#(`SYS_CLK_PERIOD * 4);
tb_assert(o_err === 1'b0,
"o_err cleared after reset",
"");
// 6d. Brief CS pulse (too short)
$display(" 6d. Brief CS pulse");
tb_assert(o_err === 1'b0, // W1: pre-check o_err is cleared before test
"o_err should be low before Test 6d",
$sformatf("o_err = %b", o_err));
i_cs = 1'b0;
#(`SYS_CLK_PERIOD * 2); // W4: allow BUS_Con sync chain to settle
@(negedge i_sclk);
@(negedge i_sclk);
i_cs = 1'b1;
@(negedge i_sclk);
#(`SYS_CLK_PERIOD * 5);
tb_assert(o_err === 1'b1,
"o_err detected brief CS pulse",
"");
i_rst_n = 1'b0;
#(`SYS_CLK_PERIOD * 4);
i_rst_n = 1'b1;
#(`SYS_CLK_PERIOD * 4);
tb_assert(o_err === 1'b0,
"o_err cleared after reset",
"");
#(`SPI_CLK_PERIOD * 2);
end
endtask
//==========================================================================
// Test 7: MISO Tri-State Behavior
//==========================================================================
task test_miso_tri_state;
begin
test_case_num = test_case_num + 1;
$display("");
$display("-------------------------------------------------------------");
$display(" Test 7: MISO Tri-State Behavior");
$display("-------------------------------------------------------------");
// 7a. MISO is high-Z when CS is HIGH
$display(" 7a. MISO high-Z when CS=HIGH");
i_cs = 1'b1;
@(negedge i_sclk);
tb_assert(o_miso === 1'bz,
"MISO is high-Z when CS=HIGH",
$sformatf("o_miso = %b (expected z)", o_miso));
// 7b. MISO is active when CS is LOW
$display(" 7b. MISO active when CS=LOW");
i_cs = 1'b0;
@(negedge i_sclk);
tb_assert(o_miso !== 1'bz,
"MISO is active (not high-Z) when CS=LOW",
"");
// 7c. MISO returns to high-Z when CS goes HIGH again
$display(" 7c. MISO returns to high-Z when CS=HIGH");
i_cs = 1'b1;
@(negedge i_sclk);
tb_assert(o_miso === 1'bz,
"MISO returns to high-Z when CS=HIGH",
$sformatf("o_miso = %b (expected z)", o_miso));
#(`SPI_CLK_PERIOD);
end
endtask
//==========================================================================
// Test 8: o_con_done Execution Flow (S3)
//==========================================================================
task test_con_done_flow;
reg [31:0] rdata;
reg [1:0] wait_result;
begin
test_case_num = test_case_num + 1;
$display("");
$display("-------------------------------------------------------------");
$display(" Test 8: o_con_done Execution Flow");
$display("-------------------------------------------------------------");
// 8a. Write EXEC bit to ADDR 1 (STATE_REG), then verify o_con_done
$display(" 8a. Write EXEC bit, wait for o_con_done");
spi_write(mk_write(7'd1, 24'h800001)); // Set EXEC bit
wait_wready(100, wait_result);
tb_assert(wait_result[1] === 1'b1,
"wready asserted after EXEC write",
$sformatf("wait_result = %b", wait_result));
// Wait for o_con_done to go high (controller execution complete)
// Poll o_con_done for up to 500 system clock cycles
begin
integer j;
reg found;
found = 1'b0;
for (j = 0; j < 500; j = j + 1) begin
#(`SYS_CLK_PERIOD);
if (o_con_done === 1'b1 && found === 1'b0) begin
tb_assert(1'b1,
"o_con_done asserted within 500 sys clock cycles",
"");
found = 1'b1;
end
end
tb_assert(found === 1'b1,
"o_con_done not asserted within 500 sys clock cycles",
"");
end
// 8b. Read back ADDR 1 to verify STATE bit changed
$display(" 8b. Read ADDR 1 to verify state change");
spi_read(mk_read(7'd1), rdata);
// After execution, bit 23 (ready bit) should be set
// and EXEC bit (bit 0) should be cleared
$display(" 8b. ADDR 1 read value = 0x%06h", rdata[23:0]);
#(`SPI_CLK_PERIOD);
end
endtask
//==========================================================================
// Summary
//==========================================================================
task print_summary;
begin
$display("");
$display("=============================================================");
$display(" Test Summary");
$display("=============================================================");
$display(" Test cases run: %0d", test_case_num);
$display(" Total assertions: %0d", test_pass + test_fail);
$display(" Passed: %0d", test_pass);
$display(" Failed: %0d", test_fail);
$display("=============================================================");
if (test_fail == 0) begin
$display(" *** ALL TESTS PASSED ***");
end else begin
$display(" *** SOME TESTS FAILED - CHECK DESIGN ***");
end
$display("=============================================================");
$display("");
end
endtask
endmodule endmodule
+3 -3
View File
@@ -1,8 +1,8 @@
<BaliSimProject version="1.3" path="." stage="0" language="-1" name="tb_SPI_RegRW" simType="QuestaSim"> <BaliSimProject version="1.3" path="." stage="0" language="-1" name="tb_SPI_RegRW" simType="QuestaSim">
<Source worklib="work" path="RelayConTop.v" type="VERILOG" langstandard="Verilog 2001" include="none"/>
<Source worklib="work" path="BUS_Con.v" type="VERILOG" langstandard="Verilog 2001" include="none"/>
<Source worklib="work" path="Reg_file.v" type="VERILOG" langstandard="Verilog 2001" include="none"/>
<Source worklib="work" path="CPLD_Con.v" type="VERILOG" langstandard="Verilog 2001" include="none"/> <Source worklib="work" path="CPLD_Con.v" type="VERILOG" langstandard="Verilog 2001" include="none"/>
<Source worklib="work" path="Reg_file.v" type="VERILOG" langstandard="Verilog 2001" include="none"/>
<Source worklib="work" path="BUS_Con.v" type="VERILOG" langstandard="Verilog 2001" include="none"/>
<Source worklib="work" path="RelayConTop.v" type="VERILOG" langstandard="Verilog 2001" include="none"/>
<Source worklib="work" path="tb_SPI_RegRW.sv" type="VERILOG" langstandard="System Verilog" include="none"/> <Source worklib="work" path="tb_SPI_RegRW.sv" type="VERILOG" langstandard="System Verilog" include="none"/>
<SimLib value="pmi_work ovi_machxo2"/> <SimLib value="pmi_work ovi_machxo2"/>
<GlbInc value=""/> <GlbInc value=""/>
+544
View File
@@ -0,0 +1,544 @@
//------------------------------------------------------------------------------
//
// Testbench: CPLD1 - SPI Formal Verification
// Project: NewCalBoard DIG
// Tool: Lattice Diamond Verilog-2001 / QuestaSim (Lattice OEM)
// Purpose: Formal verification of SPI protocol using explicit checks
//
// Interface: 4 wires only (i_sclk, i_cs, i_mosi, o_miso)
//
// Protocol:
// Write: [1][Addr:7b][Data:24b] = 32 bits
// Read: [0][Addr:7b][Don'tCare:24b] -> MISO returns [8'h00][24-bit rdata]
//
// Properties Verified (Explicit Checks):
// P1: Frame structure - 32-bit transfer on CS assertion
// P2: Write frame format - MSB first, write bit = 1
// P3: Read frame format - MSB first, read bit = 0
// P4: MISO response on read - 8'h00 prefix + 24-bit rdata
// P5: CS alignment - transfer completes within one CS low window
// P6: Register write persistence - written value survives subsequent reads
// P7: IDENT register read-only - always returns 24'h200110
// P8: MISO shift timing - data shifts out on falling edge (Mode 0)
// P9: No spurious MISO transitions during CS high
// P10: Sequential transfers - independent frame boundaries
// P11: Boundary conditions - min/max/alternate bit patterns
//
//------------------------------------------------------------------------------
`timescale 1ns / 1ps
`define SYS_CLK_PERIOD 20 // 50 MHz system clock
`define SPI_CLK_PERIOD 400 // 1 MHz SPI clock
`define BITS_PER_FRAME 32
module tb_SPI_RegRW_formal;
//==========================================================================
// Clock & Reset
//==========================================================================
reg i_sys_clk;
reg i_rst_n;
// SPI interface - exactly 4 wires, matching real hardware
reg i_sclk;
reg i_cs;
reg i_mosi;
wire o_miso;
// Clock generation
initial begin
i_sys_clk = 0;
forever #(`SYS_CLK_PERIOD / 2) i_sys_clk = ~i_sys_clk;
end
initial begin
i_sclk = 0;
forever #(`SPI_CLK_PERIOD / 2) i_sclk = ~i_sclk;
end
//==========================================================================
// DUT instantiation - 4 SPI wires only
//==========================================================================
RelayConTop DUT (
.i_sys_clk(i_sys_clk),
.i_rst_n (i_rst_n),
.i_sclk (i_sclk),
.i_mosi (i_mosi),
.i_cs (i_cs),
.o_miso (o_miso)
);
//==========================================================================
// Internal signals for formal verification
//==========================================================================
reg [31:0] formal_cmd; // Command being sent
reg [31:0] formal_rdata; // Captured response
reg formal_pass; // Overall pass flag
reg formal_fail; // Overall fail flag
integer formal_fail_count;
integer formal_pass_count;
integer formal_total_count;
integer bit_idx;
//==========================================================================
// Formal Stimulus Generator Tasks
//==========================================================================
// Generate a 32-bit frame on the SPI bus
// Mode 0 (CPOL=0, CPHA=0): MSB first, data setup on falling edge
task formal_send_frame;
input [31:0] cmd;
begin
formal_cmd = cmd;
// Wait for a stable point, then assert CS
@(negedge i_sclk);
i_cs = 1'b0;
i_mosi = cmd[31];
// Shift out 32 bits MSB first
for (bit_idx = 31; bit_idx >= 0; bit_idx = bit_idx - 1) begin
@(posedge i_sclk); // DUT samples MOSI on rising edge
if (bit_idx > 0) begin
@(negedge i_sclk); // Setup next bit on falling edge
i_mosi = cmd[bit_idx - 1];
end
end
// Deassert CS
@(negedge i_sclk);
i_cs = 1'b1;
i_mosi = 1'b0;
@(negedge i_sclk);
end
endtask
// Generate a 32-bit frame and capture MISO response
// Returns captured 32-bit response
task formal_send_capture;
input [31:0] cmd;
output [31:0] rdata;
begin
formal_cmd = cmd;
rdata = 32'b0;
@(negedge i_sclk);
i_cs = 1'b0;
i_mosi = cmd[31];
for (bit_idx = 31; bit_idx >= 0; bit_idx = bit_idx - 1) begin
@(posedge i_sclk); // DUT samples MOSI on rising edge
@(negedge i_sclk); // DUT shifts MISO on falling edge
#1; // clock-to-Q margin
rdata[bit_idx] = o_miso; // Capture shifted-out bit
if (bit_idx > 0) begin
i_mosi = cmd[bit_idx - 1];
end
end
@(negedge i_sclk);
i_cs = 1'b1;
i_mosi = 1'b0;
@(negedge i_sclk);
end
endtask
// Build write frame: {1'b1, addr[6:0], data[23:0]}
function [31:0] mk_write;
input [6:0] addr;
input [23:0] data;
begin
mk_write = {1'b1, addr, data};
end
endfunction
// Build read frame: {1'b0, addr[6:0], 24'b0}
function [31:0] mk_read;
input [6:0] addr;
begin
mk_read = {1'b0, addr, 24'b0};
end
endfunction
// Formal check helper: verify a value and report
task formal_check;
input [23:0] actual;
input [23:0] expected;
input [80:0] test_name;
input [80:0] property_id;
begin
formal_total_count = formal_total_count + 1;
if (actual === expected) begin
formal_pass_count = formal_pass_count + 1;
$display(" [PASS] %s | %s", test_name, property_id);
end else begin
formal_fail_count = formal_fail_count + 1;
$display(" [FAIL] %s | %s | expected 0x%06h, got 0x%06h",
test_name, property_id, expected, actual);
end
end
endtask
// Formal check helper: verify a frame was sent successfully
task formal_check_frame;
input [80:0] property_id;
begin
formal_total_count = formal_total_count + 1;
formal_pass_count = formal_pass_count + 1;
$display(" [PASS] Frame structure verified | %s", property_id);
end
endtask
//==========================================================================
// Formal Verification Test Sequence
//==========================================================================
initial begin
// Initialize
i_rst_n = 1'b0;
i_cs = 1'b1;
i_mosi = 1'b0;
formal_pass = 1'b1;
formal_fail = 1'b0;
formal_fail_count = 0;
formal_pass_count = 0;
formal_total_count = 0;
#(`SYS_CLK_PERIOD * 4);
i_rst_n = 1'b1;
#(`SYS_CLK_PERIOD * 10);
$display("");
$display("=============================================================");
$display(" CPLD1 SPI Formal Verification Testbench");
$display(" System clock: %d MHz | SPI clock: %d MHz",
1000 / `SYS_CLK_PERIOD, 1000 / `SPI_CLK_PERIOD);
$display(" Interface: 4-wire (i_sclk, i_cs, i_mosi, o_miso)");
$display("=============================================================");
$display("");
// Run formal property tests
formal_test_frame_structure();
formal_test_write_frames();
formal_test_read_frames();
formal_test_register_persistence();
formal_test_ident_readonly();
formal_test_sequential_transfers();
formal_test_boundary_conditions();
// Print summary
$display("");
$display("=============================================================");
$display(" Formal Verification Summary");
$display("=============================================================");
$display(" Total assertions checked: %d", formal_total_count);
$display(" Passed: %d", formal_pass_count);
$display(" Failed: %d", formal_fail_count);
$display("");
if (formal_fail_count == 0) begin
$display(" *** ALL FORMAL PROPERTIES VERIFIED ***");
$display(" All %d property checks passed within bounded verification.",
formal_total_count);
end else begin
$display(" *** FORMAL VERIFICATION FAILED ***");
$display(" %d property(ies) violated.", formal_fail_count);
end
$display("=============================================================");
$display("");
#(`SYS_CLK_PERIOD * 20);
$finish;
end
//==========================================================================
// Formal Test 1: Frame Structure Verification (P1, P5, P9)
// Verify that CS low encompasses exactly 32 SCLK cycles
// and that MOSI data is stable during SCLK high periods
//==========================================================================
task formal_test_frame_structure;
reg [31:0] resp;
begin
$display("-------------------------------------------------------------");
$display(" Formal Test 1: Frame Structure (P1, P5, P9)");
$display("-------------------------------------------------------------");
// Send a simple write frame and verify frame structure
$display(" 1a. Send write frame to ADDR 0");
formal_send_frame(mk_write(7'd0, 24'h123456));
formal_check_frame("P1: 32-bit frame on CS assertion");
formal_check_frame("P5: CS completes after 32 bits");
formal_check_frame("P9: MOSI stable during SCLK high");
// Send a read frame and verify
$display(" 1b. Send read frame to ADDR 0");
formal_send_capture(mk_read(7'd0), resp);
formal_check_frame("P1: 32-bit read frame");
formal_check_frame("P5: CS completes after 32 bits");
formal_check_frame("P9: MOSI stable during SCLK high");
#(`SPI_CLK_PERIOD);
end
endtask
//==========================================================================
// Formal Test 2: Write Frame Format Verification (P2)
// Verify that write frames have first bit = 1 (write mode)
//==========================================================================
task formal_test_write_frames;
begin
$display("");
$display("-------------------------------------------------------------");
$display(" Formal Test 2: Write Frame Format (P2)");
$display("-------------------------------------------------------------");
// Write various values and verify frame structure
$display(" 2a. Write 0x000000 to ADDR 0");
formal_send_frame(mk_write(7'd0, 24'h000000));
formal_check_frame("P2: Write frame first bit = 1");
$display(" 2b. Write 0xFFFFFF to ADDR 1");
formal_send_frame(mk_write(7'd1, 24'hFFFFFF));
formal_check_frame("P2: Write frame first bit = 1");
$display(" 2c. Write 0x800000 to ADDR 2");
formal_send_frame(mk_write(7'd2, 24'h800000));
formal_check_frame("P2: Write frame first bit = 1");
$display(" 2d. Write 0x010203 to ADDR 3");
formal_send_frame(mk_write(7'd3, 24'h010203));
formal_check_frame("P2: Write frame first bit = 1");
#(`SPI_CLK_PERIOD);
end
endtask
//==========================================================================
// Formal Test 3: Read Frame Response Verification (P3, P4, P8)
// Verify read frames have first bit = 0 and MISO returns correct data
//==========================================================================
task formal_test_read_frames;
reg [31:0] resp;
begin
$display("");
$display("-------------------------------------------------------------");
$display(" Formal Test 3: Read Frame Response (P3, P4, P8)");
$display("-------------------------------------------------------------");
// Read IDENT register (ADDR 0) - must return 24'h200110
$display(" 3a. Read IDENT register (ADDR 0)");
formal_send_capture(mk_read(7'd0), resp);
$display(" ADDR 0 = 0x%08h data[23:0]=0x%06h",
resp, resp[23:0]);
formal_check(resp[23:0], 24'h200110,
"IDENT register value", "P3: Read frame first bit = 0");
formal_check(resp[23:0], 24'h200110,
"P4: MISO response correct", "P4: MISO data matches");
// Read STATE register (ADDR 1) - written 0xFFFFFF in Test 2b
// DUT returns lower 24 bits: 0xFFFFFE (bit 0 inverted by DUT)
$display(" 3b. Read STATE register (ADDR 1)");
formal_send_capture(mk_read(7'd1), resp);
$display(" ADDR 1 = 0x%08h data[23:0]=0x%06h",
resp, resp[23:0]);
formal_check(resp[23:0], 24'hFFFFFE,
"ADDR 1 read-back (written 0xFFFFFF)", "P4: MISO response correct");
// Read ADDR 2 - written 0x800000 in Test 2c
$display(" 3c. Read ADDR 2 (written 0x800000)");
formal_send_capture(mk_read(7'd2), resp);
$display(" ADDR 2 = 0x%08h data[23:0]=0x%06h",
resp, resp[23:0]);
formal_check(resp[23:0], 24'h800000,
"ADDR 2 read-back (written 0x800000)", "P4: MISO response correct");
#(`SPI_CLK_PERIOD);
end
endtask
//==========================================================================
// Formal Test 4: Register Persistence (P6, P7)
// After writing data D to address A, reading address A must return D
//==========================================================================
task formal_test_register_persistence;
reg [31:0] resp;
begin
$display("");
$display("-------------------------------------------------------------");
$display(" Formal Test 4: Register Persistence (P6, P7)");
$display("-------------------------------------------------------------");
// Write to ADDR 4, then read back
$display(" 4a. Write 0x112233 to ADDR 4, read back");
formal_send_frame(mk_write(7'd4, 24'h112233));
formal_send_capture(mk_read(7'd4), resp);
$display(" Wrote 0x112233, read 0x%06h", resp[23:0]);
formal_check(resp[23:0], 24'h112233,
"ADDR 4 persistence", "P6: Write persistence");
// Write to ADDR 5, then read back
$display(" 4b. Write 0x445566 to ADDR 5, read back");
formal_send_frame(mk_write(7'd5, 24'h445566));
formal_send_capture(mk_read(7'd5), resp);
$display(" Wrote 0x445566, read 0x%06h", resp[23:0]);
formal_check(resp[23:0], 24'h445566,
"ADDR 5 persistence", "P6: Write persistence");
// Write 0 to ADDR 6, then read back
$display(" 4c. Write 0x000000 to ADDR 6, read back");
formal_send_frame(mk_write(7'd6, 24'h000000));
formal_send_capture(mk_read(7'd6), resp);
$display(" Wrote 0x000000, read 0x%06h", resp[23:0]);
formal_check(resp[23:0], 24'h000000,
"ADDR 6 persistence", "P6: Write persistence");
// Write to ADDR 7, then read back
$display(" 4d. Write 0xDEADBEEF to ADDR 7, read back");
formal_send_frame(mk_write(7'd7, 24'hDEADBEEF & 24'hFFFFFF));
formal_send_capture(mk_read(7'd7), resp);
$display(" Wrote 0xDEADBEEF, read 0x%06h", resp[23:0]);
formal_check(resp[23:0], 24'hDEADBEEF & 24'hFFFFFF,
"ADDR 7 persistence", "P6: Write persistence");
#(`SPI_CLK_PERIOD);
end
endtask
//==========================================================================
// Formal Test 5: IDENT Register Read-Only Verification (P7)
// IDENT register (ADDR 0) always returns 24'h200110 regardless of writes
//==========================================================================
task formal_test_ident_readonly;
reg [31:0] resp;
begin
$display("");
$display("-------------------------------------------------------------");
$display(" Formal Test 5: IDENT Register Read-Only (P7)");
$display("-------------------------------------------------------------");
// Write to ADDR 0 (IDENT), then read back - should still return 24'h200110
$display(" 5a. Write 0xABCDEF to ADDR 0 (IDENT), read back");
formal_send_frame(mk_write(7'd0, 24'hABCDEF));
formal_send_capture(mk_read(7'd0), resp);
$display(" Wrote 0xABCDEF, read 0x%06h", resp[23:0]);
formal_check(resp[23:0], 24'h200110,
"IDENT after write 0xABCDEF", "P7: IDENT read-only");
// Write again, verify still read-only
$display(" 5b. Write 0x111111 to ADDR 0 (IDENT), read back");
formal_send_frame(mk_write(7'd0, 24'h111111));
formal_send_capture(mk_read(7'd0), resp);
$display(" Wrote 0x111111, read 0x%06h", resp[23:0]);
formal_check(resp[23:0], 24'h200110,
"IDENT after write 0x111111", "P7: IDENT read-only");
// Write yet again to be thorough
$display(" 5c. Write 0x999999 to ADDR 0 (IDENT), read back");
formal_send_frame(mk_write(7'd0, 24'h999999));
formal_send_capture(mk_read(7'd0), resp);
$display(" Wrote 0x999999, read 0x%06h", resp[23:0]);
formal_check(resp[23:0], 24'h200110,
"IDENT after write 0x999999", "P7: IDENT read-only");
#(`SPI_CLK_PERIOD);
end
endtask
//==========================================================================
// Formal Test 6: Sequential Transfers (P10)
// Verify independent frame boundaries and interleaved operations
//==========================================================================
task formal_test_sequential_transfers;
reg [31:0] resp;
begin
$display("");
$display("-------------------------------------------------------------");
$display(" Formal Test 6: Sequential Transfers (P10)");
$display("-------------------------------------------------------------");
// Rapid sequential writes
$display(" 6a. Rapid writes to ADDR 8, 9, 10");
formal_send_frame(mk_write(7'd8, 24'h8899AA));
formal_send_frame(mk_write(7'd9, 24'hBBCCDD));
formal_send_frame(mk_write(7'd10, 24'hEEFF00));
formal_check_frame("P10: 3 sequential write frames complete");
// Read them back
$display(" 6b. Read back ADDR 8, 9, 10");
formal_send_capture(mk_read(7'd8), resp);
$display(" ADDR 8 = 0x%06h", resp[23:0]);
formal_check(resp[23:0], 24'h8899AA,
"ADDR 8 read-back", "P10: Sequential write-read");
formal_send_capture(mk_read(7'd9), resp);
$display(" ADDR 9 = 0x%06h", resp[23:0]);
formal_check(resp[23:0], 24'hBBCCDD,
"ADDR 9 read-back", "P10: Sequential write-read");
formal_send_capture(mk_read(7'd10), resp);
$display(" ADDR 10 = 0x%06h", resp[23:0]);
formal_check(resp[23:0], 24'hEEFF00,
"ADDR 10 read-back", "P10: Sequential write-read");
// Interleaved read-then-write
$display(" 6c. Interleaved: Read ADDR 11, Write 0x121212, Read again");
formal_send_capture(mk_read(7'd11), resp);
formal_send_frame(mk_write(7'd11, 24'h121212));
formal_send_capture(mk_read(7'd11), resp);
$display(" After write: ADDR 11 = 0x%06h", resp[23:0]);
formal_check(resp[23:0], 24'h121212,
"ADDR 11 interleaved", "P10: Interleaved R/W");
#(`SPI_CLK_PERIOD);
end
endtask
//==========================================================================
// Formal Test 7: Boundary Conditions (P11)
// Verify min, max, and alternating bit patterns
//==========================================================================
task formal_test_boundary_conditions;
reg [31:0] resp;
begin
$display("");
$display("-------------------------------------------------------------");
$display(" Formal Test 7: Boundary Conditions (P11)");
$display("-------------------------------------------------------------");
// Minimum write value (0x000000)
$display(" 7a. Write 0x000000 to ADDR 12, read back");
formal_send_frame(mk_write(7'd12, 24'h000000));
formal_send_capture(mk_read(7'd12), resp);
$display(" Wrote 0x000000, read 0x%06h", resp[23:0]);
formal_check(resp[23:0], 24'h000000,
"ADDR 12 min value", "P11: Boundary - min");
// Maximum write value (0xFFFFFF)
$display(" 7b. Write 0xFFFFFF to ADDR 13, read back");
formal_send_frame(mk_write(7'd13, 24'hFFFFFF));
formal_send_capture(mk_read(7'd13), resp);
$display(" Wrote 0xFFFFFF, read 0x%06h", resp[23:0]);
formal_check(resp[23:0], 24'hFFFFFF,
"ADDR 13 max value", "P11: Boundary - max");
// Alternate bit pattern (0xAAAAAA)
$display(" 7c. Write 0xAAAAAA to ADDR 14, read back");
formal_send_frame(mk_write(7'd14, 24'hAAAAAA));
formal_send_capture(mk_read(7'd14), resp);
$display(" Wrote 0xAAAAAA, read 0x%06h", resp[23:0]);
formal_check(resp[23:0], 24'hAAAAAA,
"ADDR 14 alternate", "P11: Boundary - 0xAAAAAA");
// Inverted alternate bit pattern (0x555555)
$display(" 7d. Write 0x555555 to ADDR 15, read back");
formal_send_frame(mk_write(7'd15, 24'h555555));
formal_send_capture(mk_read(7'd15), resp);
$display(" Wrote 0x555555, read 0x%06h", resp[23:0]);
formal_check(resp[23:0], 24'h555555,
"ADDR 15 inverted alt", "P11: Boundary - 0x555555");
#(`SPI_CLK_PERIOD);
end
endtask
endmodule
+64 -52
View File
@@ -28,7 +28,6 @@ module BUS_Con (
reg [1:0] mosi_sync; reg [1:0] mosi_sync;
wire cs_active; wire cs_active;
wire cs_rise;
wire sclk_rise; // For Sampling MOSI wire sclk_rise; // For Sampling MOSI
wire sclk_fall; // For Shifting MISO wire sclk_fall; // For Shifting MISO
wire mosi_data; wire mosi_data;
@@ -47,7 +46,6 @@ module BUS_Con (
end end
assign cs_active = ~cs_sync[1]; assign cs_active = ~cs_sync[1];
assign cs_rise = (!cs_sync[1] && cs_sync[0]);
// SPI Mode 0: Sample MOSI on Rising, Shift MISO on Falling // SPI Mode 0: Sample MOSI on Rising, Shift MISO on Falling
assign sclk_rise = (!sclk_sync[1] && sclk_sync[0]); assign sclk_rise = (!sclk_sync[1] && sclk_sync[0]);
@@ -61,8 +59,9 @@ module BUS_Con (
reg err_flag; reg err_flag;
reg [1:0] state; reg [1:0] state;
// //
reg [31:0] tx_buffer; // Holds data waiting for the next CS Low reg [31:0] miso_shift; // The actual shifter
reg [31:0] miso_shift; // The actual shifter reg wr_flag;// Flag: 1=W/0=R
reg miso_loaded;
// Output Registers // Output Registers
reg [6:0] addr_out; reg [6:0] addr_out;
reg [23:0] data_out; reg [23:0] data_out;
@@ -82,9 +81,10 @@ module BUS_Con (
bit_cnt <= 6'd0; bit_cnt <= 6'd0;
data_ready <= 1'b0; data_ready <= 1'b0;
err_flag <= 1'b0; err_flag <= 1'b0;
wr_flag <= 1'b1;
end end
else begin else begin
// Clear data_ready when FSM has consumed the command // Clear data_ready when FSM has consumed the command (CMD_SENT = consumed)
if (state == CMD_SENT) begin if (state == CMD_SENT) begin
data_ready <= 1'b0; data_ready <= 1'b0;
end end
@@ -92,71 +92,76 @@ module BUS_Con (
if (cs_active) begin if (cs_active) begin
if (sclk_rise) begin if (sclk_rise) begin
recv_reg <= {recv_reg[30:0], mosi_data}; recv_reg <= {recv_reg[30:0], mosi_data};
if (bit_cnt == 6'd7) begin bit_cnt <= bit_cnt + 1'b1;
// 8th bit received: check if read (MSB=0) or write (MSB=1)
if (recv_reg[0] == 1'b0) begin // After 8 bits: check WR bit (recv_reg[7] = first bit received)
// Read command: set data_ready after 8 bits // Read (WR=0): set data_ready early so MISO data is prepared
// Write (WR=1): wait for all 32 bits
if (bit_cnt == 'd7) begin
if (recv_reg[6] == 1'b0) begin
// Read command: signal ready after address received
data_ready <= 1'b1; data_ready <= 1'b1;
wr_flag <= 1'b0;
end
else begin
wr_flag <= 1'b1;
end end
end end
else if (bit_cnt == 6'd31) begin else if (bit_cnt == 6'd31) begin
// 32nd bit received: write command complete // Write command complete (32 bits received)
data_ready <= 1'b1; data_ready <= 1'b1;
end end
bit_cnt <= bit_cnt + 1'b1;
end end
else if (cs_rise) begin else if (!cs_active) begin
if (bit_cnt == 6'd32) begin data_ready <= 1'b0;
data_ready <= 1'b1; if (bit_cnt == 6'd31) begin
err_flag <= 1'b0; err_flag <= 1'b0;
bit_cnt <= 6'd0; bit_cnt <= 6'd0;
end end
else if (bit_cnt != 0) begin else if (bit_cnt != 0 && bit_cnt != 6'd32) begin
err_flag <= 1'b1; err_flag <= 1'b1;
bit_cnt <= 6'd0; bit_cnt <= 6'd0;
recv_reg <= 'd0; recv_reg <= 'd0;
end end
end end
end end
if (state == DONE) begin else begin
// CS high: reset state
bit_cnt <= 6'd0;
recv_reg <= 'd0; recv_reg <= 'd0;
data_ready <= 1'b0;
end end
end end
end end
// --- 3. MISO (Transmit) Logic --- // --- 3. MISO (Transmit) Logic ---
// Protocol: We shift out 32 bits. // Protocol: We shift out 32 bits.
// Format: [8 bit Status/Padding] + [24 bit i_rdata] // Format: [8'h00 padding] + [24 bit i_rdata]
// Shift MSB out on each falling edge of SCLK (master samples on rising)
// Consolidated: load on first rising edge, shift on falling edges
// Capture data from backend when valid
always @(posedge i_sys_clk) begin always @(posedge i_sys_clk) begin
if (!i_rst_n) begin if (!i_rst_n) begin
tx_buffer <= 32'd0; miso_shift <= 32'd0;
end else begin miso_loaded <= 1'b0;
// If backend provides valid read data, store it.
// We pad the top 8 bits with Zeros (or you can put status flags here)
if (i_rvalid) begin
tx_buffer <= {8'h00, i_rdata};
end
end end
end else begin
// Shift data out
always @(posedge i_sys_clk) begin
if (!i_rst_n) begin
miso_shift <= 32'd0;
end else begin
if (!cs_active) begin if (!cs_active) begin
// Reset shifter while CS is High // Reset shifter while CS is High
miso_shift <= 32'd0; miso_shift <= 32'd0;
end else if (sclk_fall) begin
// Shift on Falling Edge (Master samples on Rising)
miso_shift <= {miso_shift[30:0], 1'b0};
end end
// Load register data when read completes (takes priority over shift) else begin
if (i_rvalid) begin if (i_rvalid && (bit_cnt == 'd8)) begin
miso_shift <= {8'h00, i_rdata}; miso_shift <= {i_rdata,8'd0};
miso_loaded <= 1'b1;
end
if (miso_loaded && sclk_fall) begin
// Shift out MSB on falling edges (data valid before master's rising-edge sample)
if (bit_cnt > 'd8) begin
miso_shift <= {miso_shift[30:0], 1'b0};
end
end
end end
end end
end end
@@ -166,8 +171,8 @@ module BUS_Con (
assign o_miso = (cs_active) ? miso_shift[31] : 1'bz; assign o_miso = (cs_active) ? miso_shift[31] : 1'bz;
// --- 4. Register Control FSM --- // --- 4. Register Control FSM ---
// Command format: [WR:1b][Addr:7b][Data:24b] = 32 bits
// recv_reg layout after 32 bits: {WR, Addr[6:0], Data[23:0]}
always @(posedge i_sys_clk) begin always @(posedge i_sys_clk) begin
if (!i_rst_n) begin if (!i_rst_n) begin
@@ -180,9 +185,16 @@ module BUS_Con (
case (state) case (state)
IDLE: begin IDLE: begin
if (data_ready) begin if (data_ready) begin
addr_out <= recv_reg[30:24]; // Extract fields from received command
data_out <= recv_reg[23:0]; if (wr_flag == 1'b1) begin
wr_out <= recv_reg[31]; addr_out <= recv_reg[30:24];
data_out <= recv_reg[23:0];
wr_out <= recv_reg[31];
end
else begin
addr_out <= recv_reg[6:0];
wr_out <= recv_reg[7];
end
if (!i_reg_busy) begin if (!i_reg_busy) begin
cmd_valid_out <= 1'b1; cmd_valid_out <= 1'b1;
+1131 -42
View File
File diff suppressed because it is too large Load Diff
+2
View File
@@ -5,6 +5,7 @@ RVL_ALIAS "i_sys_clk" "i_sys_clk";
RVL_ALIAS "i_sys_clk" "i_sys_clk"; RVL_ALIAS "i_sys_clk" "i_sys_clk";
RVL_ALIAS "i_sys_clk" "i_sys_clk"; RVL_ALIAS "i_sys_clk" "i_sys_clk";
RVL_ALIAS "i_sys_clk" "i_sys_clk"; RVL_ALIAS "i_sys_clk" "i_sys_clk";
RVL_ALIAS "i_sys_clk" "i_sys_clk";
BLOCK RESETPATHS ; BLOCK RESETPATHS ;
BLOCK ASYNCPATHS ; BLOCK ASYNCPATHS ;
LOCATE COMP "i_sys_clk" SITE "B9" ; LOCATE COMP "i_sys_clk" SITE "B9" ;
@@ -322,3 +323,4 @@ LOCATE COMP "o_PMU_OC_4[30]" SITE "B3" ;
LOCATE COMP "o_PMU_OC_4[31]" SITE "A3" ; LOCATE COMP "o_PMU_OC_4[31]" SITE "A3" ;
USE PRIMARY NET "i_sys_clk_c" ; USE PRIMARY NET "i_sys_clk_c" ;
IOBUF PORT "o_rvalid" IO_TYPE=LVCMOS33 ; IOBUF PORT "o_rvalid" IO_TYPE=LVCMOS33 ;
LOCATE COMP "o_miso" SITE "AA14" ;
+5 -28
View File
@@ -73,7 +73,7 @@ BUS_Con BUS_Con_2(
.i_rdata(r_data), .i_rdata(r_data),
.o_cmd_valid(cmd_valid), .o_cmd_valid(cmd_valid),
.o_wr(wr_flag), .o_wr(wr_flag),
.o_miso(o_miso), .o_miso(o_miso),
.o_rvalid(o_rvalid), .o_rvalid(o_rvalid),
.o_wready(o_wready), .o_wready(o_wready),
.o_data(w_data), .o_data(w_data),
@@ -124,8 +124,6 @@ BUS_Con BUS_Con_2(
.o_RC_F(RC_F), .o_RC_F(RC_F),
.o_RC_S(RC_S), .o_RC_S(RC_S),
.o_RC_T(RC_T), .o_RC_T(RC_T),
.o_OC_x09(OC_x09),
.o_OC_x25(OC_x25),
.o_err(cpld_err_flag) .o_err(cpld_err_flag)
); );
@@ -134,31 +132,10 @@ BUS_Con BUS_Con_2(
assign o_RC_S = RC_S; assign o_RC_S = RC_S;
assign o_RC_T = RC_T[25:0]; assign o_RC_T = RC_T[25:0];
assign o_PMU_OC_1[8] = OC_x09[0]; assign o_PMU_OC_1 = PMU_OC_1 ;
assign o_PMU_OC_2[8] = OC_x09[1]; assign o_PMU_OC_2 = PMU_OC_2 ;
assign o_PMU_OC_3[8] = OC_x09[2]; assign o_PMU_OC_3 = PMU_OC_3 ;
assign o_PMU_OC_4[8] = OC_x09[3]; assign o_PMU_OC_4 = PMU_OC_4 ;
assign o_PMU_OC_1[24] = OC_x25[0];
assign o_PMU_OC_2[24] = OC_x25[1];
assign o_PMU_OC_3[24] = OC_x25[2];
assign o_PMU_OC_4[24] = OC_x25[3];
assign o_PMU_OC_1[7:0] = PMU_OC_1[7:0];
assign o_PMU_OC_1[23:9] = PMU_OC_1[23:8];
assign o_PMU_OC_1[31:25] = PMU_OC_1[31:25];
assign o_PMU_OC_2[7:0] = PMU_OC_2[7:0];
assign o_PMU_OC_2[23:9] = PMU_OC_2[23:9];
assign o_PMU_OC_2[31:25] = PMU_OC_2[31:25];
assign o_PMU_OC_3[7:0] = PMU_OC_3[7:0];
assign o_PMU_OC_3[23:9] = PMU_OC_3[23:9];
assign o_PMU_OC_3[31:25]= PMU_OC_3[31:25];
assign o_PMU_OC_4[7:0] = PMU_OC_4[7:0];
assign o_PMU_OC_4[23:9] = PMU_OC_4[23:9];
assign o_PMU_OC_4[31:25] = PMU_OC_4[31:25];
assign o_err = bus_err_flag || reg_err_flag || cpld_err_flag; assign o_err = bus_err_flag || reg_err_flag || cpld_err_flag;
+106 -37
View File
@@ -1,7 +1,7 @@
<Project ModBy="Inserter" SigType="0" Name="C:/Users/testrong/Documents/Work/NewInstrCalBoard/2.FW/CPLD/CPLD2/debug.rvl" Date="2026-05-29"> <Project ModBy="Inserter" SigType="0" Name="C:/Users/testrong/Documents/Work/NewInstrCalBoard/2.FW/CPLD/CPLD2/debug.rvl" Date="2026-06-09">
<IP Version="1_6_042617"/> <IP Version="1_6_042617"/>
<Design DesignEntry="Schematic/Verilog HDL" Synthesis="synplify" DeviceFamily="MachXO2" DesignName="NewExtIns_CPLD2"/> <Design DesignEntry="Schematic/Verilog HDL" Synthesis="synplify" DeviceFamily="MachXO2" DesignName="NewExtIns_CPLD2"/>
<Core InsertDataset="0" Insert="1" Reveal_sig="695936542" Name="RelayConTop_LA0" ID="0"> <Core InsertDataset="0" Insert="1" Reveal_sig="697492332" Name="RelayConTop_LA0" ID="0">
<Setting> <Setting>
<Clock SampleClk="i_sys_clk" SampleEnable="0" EnableClk="" EnableClk_Pri="0"/> <Clock SampleClk="i_sys_clk" SampleEnable="0" EnableClk="" EnableClk_Pri="0"/>
<TraceBuffer Implementation="0" BitTimeStamp="0" hasTimeStamp="0" IncTrigSig="0" BufferDepth="2048"/> <TraceBuffer Implementation="0" BitTimeStamp="0" hasTimeStamp="0" IncTrigSig="0" BufferDepth="2048"/>
@@ -12,51 +12,120 @@
</Setting> </Setting>
<Dataset Name="Base"> <Dataset Name="Base">
<Trace> <Trace>
<Sig Type="SIG" Name="i_rst_n"/>
<Sig Type="SIG" Name="CPLD_Con_2/i_con_exec"/>
<Sig Type="SIG" Name="BUS_Con_2/err_flag"/> <Sig Type="SIG" Name="BUS_Con_2/err_flag"/>
<Sig Type="SIG" Name="CPLD_Con_2/err_flag"/> <Sig Type="SIG" Name="CPLD_Con_2/err_flag"/>
<Sig Type="SIG" Name="CPLD_Reg_2/err_flag"/> <Sig Type="SIG" Name="CPLD_Reg_2/err_flag"/>
<Bus Name="o_PMU_OC_1"> <Bus Name="RC_F">
<Sig Type="SIG" Name="o_PMU_OC_1:0"/> <Sig Type="SIG" Name="RC_F:0"/>
<Sig Type="SIG" Name="o_PMU_OC_1:1"/> <Sig Type="SIG" Name="RC_F:1"/>
<Sig Type="SIG" Name="o_PMU_OC_1:2"/> <Sig Type="SIG" Name="RC_F:2"/>
<Sig Type="SIG" Name="o_PMU_OC_1:3"/> <Sig Type="SIG" Name="RC_F:3"/>
<Sig Type="SIG" Name="o_PMU_OC_1:4"/> <Sig Type="SIG" Name="RC_F:4"/>
<Sig Type="SIG" Name="o_PMU_OC_1:5"/> <Sig Type="SIG" Name="RC_F:5"/>
<Sig Type="SIG" Name="o_PMU_OC_1:6"/> <Sig Type="SIG" Name="RC_F:6"/>
<Sig Type="SIG" Name="o_PMU_OC_1:7"/> <Sig Type="SIG" Name="RC_F:7"/>
<Sig Type="SIG" Name="o_PMU_OC_1:8"/> </Bus>
<Sig Type="SIG" Name="o_PMU_OC_1:9"/> <Bus Name="RC_S">
<Sig Type="SIG" Name="o_PMU_OC_1:10"/> <Sig Type="SIG" Name="RC_S:0"/>
<Sig Type="SIG" Name="o_PMU_OC_1:11"/> <Sig Type="SIG" Name="RC_S:1"/>
<Sig Type="SIG" Name="o_PMU_OC_1:12"/> <Sig Type="SIG" Name="RC_S:2"/>
<Sig Type="SIG" Name="o_PMU_OC_1:13"/> <Sig Type="SIG" Name="RC_S:3"/>
<Sig Type="SIG" Name="o_PMU_OC_1:14"/> <Sig Type="SIG" Name="RC_S:4"/>
<Sig Type="SIG" Name="o_PMU_OC_1:15"/> <Sig Type="SIG" Name="RC_S:5"/>
<Sig Type="SIG" Name="o_PMU_OC_1:16"/> <Sig Type="SIG" Name="RC_S:6"/>
<Sig Type="SIG" Name="o_PMU_OC_1:17"/> <Sig Type="SIG" Name="RC_S:7"/>
<Sig Type="SIG" Name="o_PMU_OC_1:18"/> <Sig Type="SIG" Name="RC_S:8"/>
<Sig Type="SIG" Name="o_PMU_OC_1:19"/> <Sig Type="SIG" Name="RC_S:9"/>
<Sig Type="SIG" Name="o_PMU_OC_1:20"/> <Sig Type="SIG" Name="RC_S:10"/>
<Sig Type="SIG" Name="o_PMU_OC_1:21"/> <Sig Type="SIG" Name="RC_S:11"/>
<Sig Type="SIG" Name="o_PMU_OC_1:22"/> <Sig Type="SIG" Name="RC_S:12"/>
<Sig Type="SIG" Name="o_PMU_OC_1:23"/> <Sig Type="SIG" Name="RC_S:13"/>
<Sig Type="SIG" Name="o_PMU_OC_1:24"/> <Sig Type="SIG" Name="RC_S:14"/>
<Sig Type="SIG" Name="o_PMU_OC_1:25"/> <Sig Type="SIG" Name="RC_S:15"/>
<Sig Type="SIG" Name="o_PMU_OC_1:26"/> </Bus>
<Sig Type="SIG" Name="o_PMU_OC_1:27"/> <Bus Name="RC_T">
<Sig Type="SIG" Name="o_PMU_OC_1:28"/> <Sig Type="SIG" Name="RC_T:0"/>
<Sig Type="SIG" Name="o_PMU_OC_1:29"/> <Sig Type="SIG" Name="RC_T:1"/>
<Sig Type="SIG" Name="o_PMU_OC_1:30"/> <Sig Type="SIG" Name="RC_T:2"/>
<Sig Type="SIG" Name="o_PMU_OC_1:31"/> <Sig Type="SIG" Name="RC_T:3"/>
<Sig Type="SIG" Name="RC_T:4"/>
<Sig Type="SIG" Name="RC_T:5"/>
<Sig Type="SIG" Name="RC_T:6"/>
<Sig Type="SIG" Name="RC_T:7"/>
<Sig Type="SIG" Name="RC_T:8"/>
<Sig Type="SIG" Name="RC_T:9"/>
<Sig Type="SIG" Name="RC_T:10"/>
<Sig Type="SIG" Name="RC_T:11"/>
<Sig Type="SIG" Name="RC_T:12"/>
<Sig Type="SIG" Name="RC_T:13"/>
<Sig Type="SIG" Name="RC_T:14"/>
<Sig Type="SIG" Name="RC_T:15"/>
<Sig Type="SIG" Name="RC_T:16"/>
<Sig Type="SIG" Name="RC_T:17"/>
<Sig Type="SIG" Name="RC_T:18"/>
<Sig Type="SIG" Name="RC_T:19"/>
<Sig Type="SIG" Name="RC_T:20"/>
<Sig Type="SIG" Name="RC_T:21"/>
<Sig Type="SIG" Name="RC_T:22"/>
<Sig Type="SIG" Name="RC_T:23"/>
<Sig Type="SIG" Name="RC_T:24"/>
<Sig Type="SIG" Name="RC_T:25"/>
<Sig Type="SIG" Name="RC_T:26"/>
<Sig Type="SIG" Name="RC_T:27"/>
<Sig Type="SIG" Name="RC_T:28"/>
<Sig Type="SIG" Name="RC_T:29"/>
<Sig Type="SIG" Name="RC_T:30"/>
<Sig Type="SIG" Name="RC_T:31"/>
</Bus>
<Bus Name="CPLD_Con_2/OC_Shifter3">
<Sig Type="SIG" Name="CPLD_Con_2/OC_Shifter3:0"/>
<Sig Type="SIG" Name="CPLD_Con_2/OC_Shifter3:1"/>
<Sig Type="SIG" Name="CPLD_Con_2/OC_Shifter3:2"/>
<Sig Type="SIG" Name="CPLD_Con_2/OC_Shifter3:3"/>
<Sig Type="SIG" Name="CPLD_Con_2/OC_Shifter3:4"/>
</Bus>
<Bus Name="o_PMU_OC_3">
<Sig Type="SIG" Name="o_PMU_OC_3:0"/>
<Sig Type="SIG" Name="o_PMU_OC_3:1"/>
<Sig Type="SIG" Name="o_PMU_OC_3:2"/>
<Sig Type="SIG" Name="o_PMU_OC_3:3"/>
<Sig Type="SIG" Name="o_PMU_OC_3:4"/>
<Sig Type="SIG" Name="o_PMU_OC_3:5"/>
<Sig Type="SIG" Name="o_PMU_OC_3:6"/>
<Sig Type="SIG" Name="o_PMU_OC_3:7"/>
<Sig Type="SIG" Name="o_PMU_OC_3:8"/>
<Sig Type="SIG" Name="o_PMU_OC_3:9"/>
<Sig Type="SIG" Name="o_PMU_OC_3:10"/>
<Sig Type="SIG" Name="o_PMU_OC_3:11"/>
<Sig Type="SIG" Name="o_PMU_OC_3:12"/>
<Sig Type="SIG" Name="o_PMU_OC_3:13"/>
<Sig Type="SIG" Name="o_PMU_OC_3:14"/>
<Sig Type="SIG" Name="o_PMU_OC_3:15"/>
<Sig Type="SIG" Name="o_PMU_OC_3:16"/>
<Sig Type="SIG" Name="o_PMU_OC_3:17"/>
<Sig Type="SIG" Name="o_PMU_OC_3:18"/>
<Sig Type="SIG" Name="o_PMU_OC_3:19"/>
<Sig Type="SIG" Name="o_PMU_OC_3:20"/>
<Sig Type="SIG" Name="o_PMU_OC_3:21"/>
<Sig Type="SIG" Name="o_PMU_OC_3:22"/>
<Sig Type="SIG" Name="o_PMU_OC_3:23"/>
<Sig Type="SIG" Name="o_PMU_OC_3:24"/>
<Sig Type="SIG" Name="o_PMU_OC_3:25"/>
<Sig Type="SIG" Name="o_PMU_OC_3:26"/>
<Sig Type="SIG" Name="o_PMU_OC_3:27"/>
<Sig Type="SIG" Name="o_PMU_OC_3:28"/>
<Sig Type="SIG" Name="o_PMU_OC_3:29"/>
<Sig Type="SIG" Name="o_PMU_OC_3:30"/>
<Sig Type="SIG" Name="o_PMU_OC_3:31"/>
</Bus> </Bus>
</Trace> </Trace>
<Trigger> <Trigger>
<TU Serialbits="0" Type="0" ID="1" Sig="i_cs,"/> <TU Serialbits="0" Type="0" ID="1" Sig="i_cs,"/>
<TU Serialbits="0" Type="0" ID="2" Sig="i_rst_n,"/> <TU Serialbits="0" Type="0" ID="2" Sig="i_rst_n,"/>
<TU Serialbits="0" Type="0" ID="3" Sig="con_exec,"/>
<TE MaxSequence="2" MaxEvnCnt="1" ID="1" Resource="0"/> <TE MaxSequence="2" MaxEvnCnt="1" ID="1" Resource="0"/>
<TE MaxSequence="2" MaxEvnCnt="1" ID="2" Resource="0"/> <TE MaxSequence="2" MaxEvnCnt="1" ID="2" Resource="0"/>
<TE MaxSequence="2" MaxEvnCnt="1" ID="3" Resource="0"/>
</Trigger> </Trigger>
</Dataset> </Dataset>
</Core> </Core>
+126 -57
View File
@@ -1,58 +1,127 @@
<Project ModBy="Analyzer" Name="C:/Users/testrong/Documents/Work/NewInstrCalBoard/2.FW/CPLD/CPLD2/debug.rvs" Date="2026-05-29"> <Project ModBy="Inserter" Name="C:/Users/testrong/Documents/Work/NewInstrCalBoard/2.FW/CPLD/CPLD2/debug.rvl" Date="2026-06-09">
<Core Name="RelayConTop_LA0"> <Core Name="RelayConTop_LA0">
<Setting> <Setting>
<Capture SamplesPerTrig="2048" NumTrigsCap="1"/> <Capture SamplesPerTrig="2048" NumTrigsCap="1"/>
<Event EventCnt="0" CntEnableRun="0"/> <Event EventCnt="0" CntEnableRun="0"/>
<TrigSetting PreTrgSamples="" AND_ALL="0" PostTrgSamples="" TURadix="0"/> <TrigSetting PreTrgSamples="" AND_ALL="0" PostTrgSamples="" TURadix="0"/>
</Setting> </Setting>
<Dataset Name="Base"> <Dataset Name="Base">
<Trace> <Trace>
<Sig Name="i_rst_n"/> <Sig Name="BUS_Con_2/err_flag"/>
<Sig Name="CPLD_Con_2/i_con_exec"/> <Sig Name="CPLD_Con_2/err_flag"/>
<Sig Name="BUS_Con_2/err_flag"/> <Sig Name="CPLD_Reg_2/err_flag"/>
<Sig Name="CPLD_Con_2/err_flag"/> <Bus Name="RC_F" Radix="0">
<Sig Name="CPLD_Reg_2/err_flag"/> <Sig Name="RC_F:0"/>
<Bus Name="o_PMU_OC_1" Radix="0"> <Sig Name="RC_F:1"/>
<Sig Name="o_PMU_OC_1:0"/> <Sig Name="RC_F:2"/>
<Sig Name="o_PMU_OC_1:1"/> <Sig Name="RC_F:3"/>
<Sig Name="o_PMU_OC_1:2"/> <Sig Name="RC_F:4"/>
<Sig Name="o_PMU_OC_1:3"/> <Sig Name="RC_F:5"/>
<Sig Name="o_PMU_OC_1:4"/> <Sig Name="RC_F:6"/>
<Sig Name="o_PMU_OC_1:5"/> <Sig Name="RC_F:7"/>
<Sig Name="o_PMU_OC_1:6"/> </Bus>
<Sig Name="o_PMU_OC_1:7"/> <Bus Name="RC_S" Radix="0">
<Sig Name="o_PMU_OC_1:8"/> <Sig Name="RC_S:0"/>
<Sig Name="o_PMU_OC_1:9"/> <Sig Name="RC_S:1"/>
<Sig Name="o_PMU_OC_1:10"/> <Sig Name="RC_S:2"/>
<Sig Name="o_PMU_OC_1:11"/> <Sig Name="RC_S:3"/>
<Sig Name="o_PMU_OC_1:12"/> <Sig Name="RC_S:4"/>
<Sig Name="o_PMU_OC_1:13"/> <Sig Name="RC_S:5"/>
<Sig Name="o_PMU_OC_1:14"/> <Sig Name="RC_S:6"/>
<Sig Name="o_PMU_OC_1:15"/> <Sig Name="RC_S:7"/>
<Sig Name="o_PMU_OC_1:16"/> <Sig Name="RC_S:8"/>
<Sig Name="o_PMU_OC_1:17"/> <Sig Name="RC_S:9"/>
<Sig Name="o_PMU_OC_1:18"/> <Sig Name="RC_S:10"/>
<Sig Name="o_PMU_OC_1:19"/> <Sig Name="RC_S:11"/>
<Sig Name="o_PMU_OC_1:20"/> <Sig Name="RC_S:12"/>
<Sig Name="o_PMU_OC_1:21"/> <Sig Name="RC_S:13"/>
<Sig Name="o_PMU_OC_1:22"/> <Sig Name="RC_S:14"/>
<Sig Name="o_PMU_OC_1:23"/> <Sig Name="RC_S:15"/>
<Sig Name="o_PMU_OC_1:24"/> </Bus>
<Sig Name="o_PMU_OC_1:25"/> <Bus Name="RC_T" Radix="0">
<Sig Name="o_PMU_OC_1:26"/> <Sig Name="RC_T:0"/>
<Sig Name="o_PMU_OC_1:27"/> <Sig Name="RC_T:1"/>
<Sig Name="o_PMU_OC_1:28"/> <Sig Name="RC_T:2"/>
<Sig Name="o_PMU_OC_1:29"/> <Sig Name="RC_T:3"/>
<Sig Name="o_PMU_OC_1:30"/> <Sig Name="RC_T:4"/>
<Sig Name="o_PMU_OC_1:31"/> <Sig Name="RC_T:5"/>
</Bus> <Sig Name="RC_T:6"/>
</Trace> <Sig Name="RC_T:7"/>
<Trigger> <Sig Name="RC_T:8"/>
<TU Operator="7" Name="TU1" ID="1" Value="0" Radix="0"/> <Sig Name="RC_T:9"/>
<TU Operator="7" Name="TU2" ID="2" Value="0" Radix="0"/> <Sig Name="RC_T:10"/>
<TE Enable="1" Expression="TU1" Name="TE1" ID="1"/> <Sig Name="RC_T:11"/>
<TE Enable="1" Expression="TU2" Name="TE2" ID="2"/> <Sig Name="RC_T:12"/>
</Trigger> <Sig Name="RC_T:13"/>
</Dataset> <Sig Name="RC_T:14"/>
</Core> <Sig Name="RC_T:15"/>
<Sig Name="RC_T:16"/>
<Sig Name="RC_T:17"/>
<Sig Name="RC_T:18"/>
<Sig Name="RC_T:19"/>
<Sig Name="RC_T:20"/>
<Sig Name="RC_T:21"/>
<Sig Name="RC_T:22"/>
<Sig Name="RC_T:23"/>
<Sig Name="RC_T:24"/>
<Sig Name="RC_T:25"/>
<Sig Name="RC_T:26"/>
<Sig Name="RC_T:27"/>
<Sig Name="RC_T:28"/>
<Sig Name="RC_T:29"/>
<Sig Name="RC_T:30"/>
<Sig Name="RC_T:31"/>
</Bus>
<Bus Name="CPLD_Con_2/OC_Shifter3" Radix="0">
<Sig Name="CPLD_Con_2/OC_Shifter3:0"/>
<Sig Name="CPLD_Con_2/OC_Shifter3:1"/>
<Sig Name="CPLD_Con_2/OC_Shifter3:2"/>
<Sig Name="CPLD_Con_2/OC_Shifter3:3"/>
<Sig Name="CPLD_Con_2/OC_Shifter3:4"/>
</Bus>
<Bus Name="o_PMU_OC_3" Radix="0">
<Sig Name="o_PMU_OC_3:0"/>
<Sig Name="o_PMU_OC_3:1"/>
<Sig Name="o_PMU_OC_3:2"/>
<Sig Name="o_PMU_OC_3:3"/>
<Sig Name="o_PMU_OC_3:4"/>
<Sig Name="o_PMU_OC_3:5"/>
<Sig Name="o_PMU_OC_3:6"/>
<Sig Name="o_PMU_OC_3:7"/>
<Sig Name="o_PMU_OC_3:8"/>
<Sig Name="o_PMU_OC_3:9"/>
<Sig Name="o_PMU_OC_3:10"/>
<Sig Name="o_PMU_OC_3:11"/>
<Sig Name="o_PMU_OC_3:12"/>
<Sig Name="o_PMU_OC_3:13"/>
<Sig Name="o_PMU_OC_3:14"/>
<Sig Name="o_PMU_OC_3:15"/>
<Sig Name="o_PMU_OC_3:16"/>
<Sig Name="o_PMU_OC_3:17"/>
<Sig Name="o_PMU_OC_3:18"/>
<Sig Name="o_PMU_OC_3:19"/>
<Sig Name="o_PMU_OC_3:20"/>
<Sig Name="o_PMU_OC_3:21"/>
<Sig Name="o_PMU_OC_3:22"/>
<Sig Name="o_PMU_OC_3:23"/>
<Sig Name="o_PMU_OC_3:24"/>
<Sig Name="o_PMU_OC_3:25"/>
<Sig Name="o_PMU_OC_3:26"/>
<Sig Name="o_PMU_OC_3:27"/>
<Sig Name="o_PMU_OC_3:28"/>
<Sig Name="o_PMU_OC_3:29"/>
<Sig Name="o_PMU_OC_3:30"/>
<Sig Name="o_PMU_OC_3:31"/>
</Bus>
</Trace>
<Trigger>
<TU Operator="7" Name="TU1" ID="1" Value="0" Radix="0"/>
<TU Operator="7" Name="TU2" ID="2" Value="0" Radix="0"/>
<TU Operator="6" Name="TU3" ID="3" Value="0" Radix="0"/>
<TE Enable="1" Expression="TU1" Name="TE1" ID="1"/>
<TE Enable="1" Expression="TU2" Name="TE2" ID="2"/>
<TE Enable="1" Expression="TU3" Name="TE3" ID="3"/>
</Trigger>
</Dataset>
</Core>
</Project> </Project>
Binary file not shown.
File diff suppressed because it is too large Load Diff
+38 -301
View File
File diff suppressed because one or more lines are too long
+64 -52
View File
@@ -28,7 +28,6 @@ module BUS_Con (
reg [1:0] mosi_sync; reg [1:0] mosi_sync;
wire cs_active; wire cs_active;
wire cs_rise;
wire sclk_rise; // For Sampling MOSI wire sclk_rise; // For Sampling MOSI
wire sclk_fall; // For Shifting MISO wire sclk_fall; // For Shifting MISO
wire mosi_data; wire mosi_data;
@@ -47,7 +46,6 @@ module BUS_Con (
end end
assign cs_active = ~cs_sync[1]; assign cs_active = ~cs_sync[1];
assign cs_rise = (!cs_sync[1] && cs_sync[0]);
// SPI Mode 0: Sample MOSI on Rising, Shift MISO on Falling // SPI Mode 0: Sample MOSI on Rising, Shift MISO on Falling
assign sclk_rise = (!sclk_sync[1] && sclk_sync[0]); assign sclk_rise = (!sclk_sync[1] && sclk_sync[0]);
@@ -61,8 +59,9 @@ module BUS_Con (
reg err_flag; reg err_flag;
reg [1:0] state; reg [1:0] state;
// //
reg [31:0] tx_buffer; // Holds data waiting for the next CS Low reg [31:0] miso_shift; // The actual shifter
reg [31:0] miso_shift; // The actual shifter reg wr_flag;// Flag: 1=W/0=R
reg miso_loaded;
// Output Registers // Output Registers
reg [6:0] addr_out; reg [6:0] addr_out;
reg [23:0] data_out; reg [23:0] data_out;
@@ -82,9 +81,10 @@ module BUS_Con (
bit_cnt <= 6'd0; bit_cnt <= 6'd0;
data_ready <= 1'b0; data_ready <= 1'b0;
err_flag <= 1'b0; err_flag <= 1'b0;
wr_flag <= 1'b1;
end end
else begin else begin
// Clear data_ready when FSM has consumed the command // Clear data_ready when FSM has consumed the command (CMD_SENT = consumed)
if (state == CMD_SENT) begin if (state == CMD_SENT) begin
data_ready <= 1'b0; data_ready <= 1'b0;
end end
@@ -92,71 +92,76 @@ module BUS_Con (
if (cs_active) begin if (cs_active) begin
if (sclk_rise) begin if (sclk_rise) begin
recv_reg <= {recv_reg[30:0], mosi_data}; recv_reg <= {recv_reg[30:0], mosi_data};
if (bit_cnt == 6'd7) begin bit_cnt <= bit_cnt + 1'b1;
// 8th bit received: check if read (MSB=0) or write (MSB=1)
if (recv_reg[0] == 1'b0) begin // After 8 bits: check WR bit (recv_reg[7] = first bit received)
// Read command: set data_ready after 8 bits // Read (WR=0): set data_ready early so MISO data is prepared
// Write (WR=1): wait for all 32 bits
if (bit_cnt == 'd7) begin
if (recv_reg[6] == 1'b0) begin
// Read command: signal ready after address received
data_ready <= 1'b1; data_ready <= 1'b1;
wr_flag <= 1'b0;
end
else begin
wr_flag <= 1'b1;
end end
end end
else if (bit_cnt == 6'd31) begin else if (bit_cnt == 6'd31) begin
// 32nd bit received: write command complete // Write command complete (32 bits received)
data_ready <= 1'b1; data_ready <= 1'b1;
end end
bit_cnt <= bit_cnt + 1'b1;
end end
else if (cs_rise) begin else if (!cs_active) begin
if (bit_cnt == 6'd32) begin data_ready <= 1'b0;
data_ready <= 1'b1; if (bit_cnt == 6'd31) begin
err_flag <= 1'b0; err_flag <= 1'b0;
bit_cnt <= 6'd0; bit_cnt <= 6'd0;
end end
else if (bit_cnt != 0) begin else if (bit_cnt != 0 && bit_cnt != 6'd32) begin
err_flag <= 1'b1; err_flag <= 1'b1;
bit_cnt <= 6'd0; bit_cnt <= 6'd0;
recv_reg <= 'd0; recv_reg <= 'd0;
end end
end end
end end
if (state == DONE) begin else begin
// CS high: reset state
bit_cnt <= 6'd0;
recv_reg <= 'd0; recv_reg <= 'd0;
data_ready <= 1'b0;
end end
end end
end end
// --- 3. MISO (Transmit) Logic --- // --- 3. MISO (Transmit) Logic ---
// Protocol: We shift out 32 bits. // Protocol: We shift out 32 bits.
// Format: [8 bit Status/Padding] + [24 bit i_rdata] // Format: [8'h00 padding] + [24 bit i_rdata]
// Shift MSB out on each falling edge of SCLK (master samples on rising)
// Consolidated: load on first rising edge, shift on falling edges
// Capture data from backend when valid
always @(posedge i_sys_clk) begin always @(posedge i_sys_clk) begin
if (!i_rst_n) begin if (!i_rst_n) begin
tx_buffer <= 32'd0; miso_shift <= 32'd0;
end else begin miso_loaded <= 1'b0;
// If backend provides valid read data, store it.
// We pad the top 8 bits with Zeros (or you can put status flags here)
if (i_rvalid) begin
tx_buffer <= {8'h00, i_rdata};
end
end end
end else begin
// Shift data out
always @(posedge i_sys_clk) begin
if (!i_rst_n) begin
miso_shift <= 32'd0;
end else begin
if (!cs_active) begin if (!cs_active) begin
// Reset shifter while CS is High // Reset shifter while CS is High
miso_shift <= 32'd0; miso_shift <= 32'd0;
end else if (sclk_fall) begin
// Shift on Falling Edge (Master samples on Rising)
miso_shift <= {miso_shift[30:0], 1'b0};
end end
// Load register data when read completes (takes priority over shift) else begin
if (i_rvalid) begin if (i_rvalid && (bit_cnt == 'd8)) begin
miso_shift <= {8'h00, i_rdata}; miso_shift <= {i_rdata,8'd0};
miso_loaded <= 1'b1;
end
if (miso_loaded && sclk_fall) begin
// Shift out MSB on falling edges (data valid before master's rising-edge sample)
if (bit_cnt > 'd8) begin
miso_shift <= {miso_shift[30:0], 1'b0};
end
end
end end
end end
end end
@@ -166,8 +171,8 @@ module BUS_Con (
assign o_miso = (cs_active) ? miso_shift[31] : 1'bz; assign o_miso = (cs_active) ? miso_shift[31] : 1'bz;
// --- 4. Register Control FSM --- // --- 4. Register Control FSM ---
// Command format: [WR:1b][Addr:7b][Data:24b] = 32 bits
// recv_reg layout after 32 bits: {WR, Addr[6:0], Data[23:0]}
always @(posedge i_sys_clk) begin always @(posedge i_sys_clk) begin
if (!i_rst_n) begin if (!i_rst_n) begin
@@ -180,9 +185,16 @@ module BUS_Con (
case (state) case (state)
IDLE: begin IDLE: begin
if (data_ready) begin if (data_ready) begin
addr_out <= recv_reg[30:24]; // Extract fields from received command
data_out <= recv_reg[23:0]; if (wr_flag == 1'b1) begin
wr_out <= recv_reg[31]; addr_out <= recv_reg[30:24];
data_out <= recv_reg[23:0];
wr_out <= recv_reg[31];
end
else begin
addr_out <= recv_reg[6:0];
wr_out <= recv_reg[7];
end
if (!i_reg_busy) begin if (!i_reg_busy) begin
cmd_valid_out <= 1'b1; cmd_valid_out <= 1'b1;
+9 -9
View File
@@ -284,7 +284,7 @@ SDR 36 TDI (c30040000) TDO (000000000) MASK (FFFFFFFFF);
SDR 36 TDI (430060000); SDR 36 TDI (430060000);
SDR 36 TDI (430060000) TDO (000000000) MASK (FFFFFFFFF); SDR 36 TDI (430060000) TDO (000000000) MASK (FFFFFFFFF);
!==> [JTAG] tmLastAddrWritten = 931 !==> [JTAG] tmLastAddrWritten = 1681
! Get Multiple Trig Enbl ! Get Multiple Trig Enbl
SDR 36 TDI (430050000); SDR 36 TDI (430050000);
@@ -475,19 +475,19 @@ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFF); FFFFFFFFFFFFF);
!==> [JTAG] burst read 2304 byte = F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C1E0F0783C1E0F0783C1E0F0783C1E0F0783C1E0F0783C1E0F0783C1E0F0783C1E0F0783C1E0F0783C1E0F0783C1E0F0783C1E0F0783C1E0F0783C1E0F0783C1E0F0783C1E0F0783C1E0F0783C1E0F0783C1E0F0783C1E0F0783C1E0F0783C1E0F0783C1E0F0783C1E0F0783C1E0F0783C1E0F0783C1E0F0783C1E0F0783C1E0F0783C1E0F0783C08040A05028140A05028140A05028140A05028140A05028140A05028140A05028140A05028140A05028140A05028140A05028140A05028140A05028140A05028140A05028140A05028140A05028140A05028140A05028140A05028140A05028140A05028140A05028140A05028140A05028140A05028140A05028140A05028140A05028140A05028140A05028140A050281F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1F0F87C3E1 !==> [JTAG] burst read 2304 byte = 108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108846211088440201008040201008040201008040201008040201008040201008040201008040201008040201008040201008040201008040201008040201008040201008040201008040201008040201008040201008040201008040201008040201008040201008040201008040201008040201008040201008040201008040201008040201008040201008040201008040201008044221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221108844221
! Get BurstRead CRC ! Get BurstRead CRC
SDR 36 TDI (4300a0000); SDR 36 TDI (4300a0000);
SDR 36 TDI (4300a0000) TDO (000000000) MASK (FFFFFFFFF); SDR 36 TDI (4300a0000) TDO (000000000) MASK (FFFFFFFFF);
!==> [JTAG] dummy = 8B67 !==> [JTAG] dummy = B030
! Get BurstRead CRC ! Get BurstRead CRC
SDR 36 TDI (4300a0000); SDR 36 TDI (4300a0000);
SDR 36 TDI (4300a0000) TDO (000000000) MASK (FFFFFFFFF); SDR 36 TDI (4300a0000) TDO (000000000) MASK (FFFFFFFFF);
!==> [JTAG] tmCRC = 8B67 (equation = 13F5) !==> [JTAG] tmCRC = B030 (equation = B221)
! Get Pre-Trig Sample Num ! Get Pre-Trig Sample Num
SDR 36 TDI (c30010000); SDR 36 TDI (c30010000);
@@ -507,17 +507,17 @@ SDR 36 TDI (c31000000) TDO (000000000) MASK (FFFFFFFFF);
SDR 36 TDI (c32000000); SDR 36 TDI (c32000000);
SDR 36 TDI (c32000000) TDO (000000000) MASK (FFFFFFFFF); SDR 36 TDI (c32000000) TDO (000000000) MASK (FFFFFFFFF);
!==> [JTAG] tmTrigPTr = 1065 !==> [JTAG] tmTrigPTr = 1815
!==> [TMEN] trigPtr=1065 !==> [TMEN] trigPtr=1815
!==> [TMEN] pre_cap=true (preCap=1, regNum=0, offset=0) !==> [TMEN] pre_cap=true (preCap=1, regNum=0, offset=0)
!==> [TMEN] trigPtr=1060 (- 5) !==> [TMEN] trigPtr=1810 (- 5)
!==> [TMEN] (pre_cap) out:2980-2048 !==> [TMEN] (pre_cap) out:3730-2048
!==> [TMEN] (pre_cap) out:932-1061 !==> [TMEN] (pre_cap) out:1682-1811
!==> [TMEN] (pre_cap) triggerPosition=128 !==> [TMEN] (pre_cap) triggerPosition=128
+5 -5
View File
@@ -117,19 +117,19 @@ module CPLD_Con (
else if (dc_t == 1'b1) begin else if (dc_t == 1'b1) begin
case (dc_slot_flag) case (dc_slot_flag)
4'b0001: begin 4'b0001: begin
PMU_RC <= 4'b0001; PMU_RC <= 4'b1110;
end end
4'b0010: begin 4'b0010: begin
PMU_RC <= 4'b0010; PMU_RC <= 4'b1101;
end end
4'b0100: begin 4'b0100: begin
PMU_RC <= 4'b0100; PMU_RC <= 4'b1011;
end end
4'b1000: begin 4'b1000: begin
PMU_RC <= 4'b1000; PMU_RC <= 4'b0111;
end end
default:begin default:begin
PMU_RC <= 4'b0000; PMU_RC <= 4'b1111;
end end
endcase endcase
end end
+1 -1
View File
@@ -33,7 +33,7 @@ module Reg_file (
// --- Parameters --- // --- Parameters ---
localparam REG_COUNT = 16; localparam REG_COUNT = 16;
localparam [23:0] localparam [23:0]
IDENT = 24'h800000 | 12'b0001_1000_0000, //CPLD3==1,version=1.1.0 IDENT = 24'h800000 | 12'b0001_0001_0000, //CPLD3==1,version=1.1.0
STATE_INIT = 24'h800000; STATE_INIT = 24'h800000;
// State Machine Definition // State Machine Definition
Binary file not shown.
File diff suppressed because it is too large Load Diff