手把手一起开发SV4E-I3C设备(二)

JEDEC DDR5 SPD Hub Devices例程

DDR5生态系统的核心是SidebandBus Protocol

参考下图,可以将SV4E-I3C的端口1声明为主服务器(模拟主机控制器),并且它可以属于SV4E-I3C上的一个总线。端口2可以作为SPD Hub DUT的Local Bus侧的从站连接。这个从站可以被编程来模拟,端口2属于SV4E-I3C上的第二个总线,并且独立于端口1进行编程。SV4E-I3C的端口3和4也可以连接到SPD集线器的本地总线侧,它们可以用来模拟PMIC和/或RCD设备。这些端口属于SV4E-I3C上的同一第二条总线。这些端口的可用性为SPD Hub执行地址修改等功能提供了完整的覆盖范围。

在这里插入图片描述
图片来源《EN-W002E-E-21090-Component-Validation-of-JEDEC-DDR5-SPD-Hub-Devices》

以下所有例程,SV4E-I3C设备连接器件均为SPD5芯片,Reg表示MR寄存器,Mem表示NVM存储器

1、I2C模式读Reg

SV4E-I3C设备在i2c模式下读SPD5的Reg(MR寄存器),Python代码如下:

i3cDataCapture.start()
sidebandBusController.setup()
regAddr = 0x00
byte_num = 64
sidebandBusController.enableLowBitRateMode()
bytesFromTarget = sidebandBusController.spdLegacyReadReg('DIMM0-SPD', regAddr, numBytes = byte_num, twoByteAddressing=False)
for value in range(int(regAddr),int(byte_num+regAddr)):print("regAddr: 0x%02X mrbyte: 0x%02X" % (value, bytesFromTarget[(value-(int(regAddr)))]))
i3cDataCapture.stop()

Procedure区域编辑代码,点击Run运行,如图,LOG区域已经打印运行结果:

在这里插入图片描述
打开生成的波形结果,如图:

在这里插入图片描述

2、I3C模式读Reg

SV4E-I3C设备在i3c模式下读SPD5的Reg(MR寄存器),Python代码如下:

import dftm.svt as svt
i3cDataCapture.start()
sidebandBusController.setup()
regAddr = 0x00
byte_num = 64
sidebandBusController.enableLowBitRateMode()
status = sidebandBusController.doBroadcastWrite('SETAASA')
if status == True:svt.printMsg('SETAASA CCC PASS', 'green')
else:svt.printMsg('SETAASA CCC FAIL', 'red')
sidebandBusController.disableLowBitRateMode()
bytesFromTarget = sidebandBusController.spdReadReg('DIMM0-SPD', regAddr, numBytes = byte_num)
for value in range(int(regAddr),int(byte_num+regAddr)):print("regAddr: 0x%02X mrbyte: 0x%02X" % (value, bytesFromTarget[(value-(int(regAddr)))]))
status = sidebandBusController.doBroadcastWrite('RSTDAA')
if status == True:svt.printMsg('RSTDAA CCC PASS', 'green')
else:svt.printMsg('RSTDAA CCC FAIL', 'red')
i3cDataCapture.stop()

Procedure区域编辑代码,点击Run运行,LOG区域已经打印运行结果,如图所示:

在这里插入图片描述
打开生成的波形结果,如图:

在这里插入图片描述

3、使能ENEC+获取器件状态

3、4、5部分的工作主要是测试SV4E-I3C设备的PEC注错功能,PEC注错方式有多种,这里仅对sidebandBusController.startPecErrorInjection()进行测试,首先使能ENEC,但是pecEnable为False(如图sidebandBusController部分的参数设置),Python代码如下:

import dftm.svt as svt
i3cDataCapture.start()
sidebandBusController.setup()
sidebandBusController.initializeBus()
status = sidebandBusController.doBroadcastWrite('SETAASA')
if status == True:svt.printMsg('SETAASA CCC PASS', 'green')
else:svt.printMsg('SETAASA CCC FAIL', 'red')
sidebandBusController.disableLowBitRateMode()
status = sidebandBusController.doBroadcastWrite('ENEC', cccDefiningBytes = [0x01])
if status == True:svt.printMsg('ENEC CCC PASS', 'green')
else:svt.printMsg('ENEC CCC FAIL', 'red')
targetAddr = 'DIMM0-SPD'
regAddr = 0x0C
dataByte = 0x01 # one byte
status = sidebandBusController.spdWriteReg(targetAddr, regAddr, dataByte)
if status == True:svt.printMsg('spdWriteReg PASS', 'green')
else:svt.printMsg('spdWriteReg FAIL', 'red')
statusTuple = sidebandBusController.getTargetStatus('DIMM0-SPD')
if statusTuple is not None:(pecErr, protocolErr, pendingInterrupt) = statusTupleprint("pecErr: 0x%02X protocolErr: 0x%02X pendingInterrupt: 0x%02X" % (pecErr, protocolErr, pendingInterrupt))
status = sidebandBusController.doBroadcastWrite('RSTDAA')
if status == True:svt.printMsg('RSTDAA CCC PASS', 'green')
else:svt.printMsg('RSTDAA CCC FAIL', 'red')    
i3cDataCapture.stop()

Procedure区域编辑代码,点击Run运行,如图:

在这里插入图片描述
打开生成的波形结果,如图:

在这里插入图片描述

4、使能ENEC+使能PEC+获取器件状态

接下来,pecEnable为True(如图sidebandBusController部分的参数设置),Python代码如下:

import dftm.svt as svt
i3cDataCapture.start()
sidebandBusController.setup()
sidebandBusController.initializeBus()
status = sidebandBusController.doBroadcastWrite('SETAASA')
if status == True:svt.printMsg('SETAASA CCC PASS', 'green')
else:svt.printMsg('SETAASA CCC FAIL', 'red')
sidebandBusController.disableLowBitRateMode()
status = sidebandBusController.doBroadcastWrite('ENEC', cccDefiningBytes = [0x01])
if status == True:svt.printMsg('ENEC CCC PASS', 'green')
else:svt.printMsg('ENEC CCC FAIL', 'red')
targetAddr = 'DIMM0-SPD'
regAddr = 0x0C
dataByte = 0x01 # one byte
status = sidebandBusController.spdWriteReg(targetAddr, regAddr, dataByte)
if status == True:svt.printMsg('spdWriteReg PASS', 'green')
else:svt.printMsg('spdWriteReg FAIL', 'red')
statusTuple = sidebandBusController.getTargetStatus('DIMM0-SPD')
if statusTuple is not None:(pecErr, protocolErr, pendingInterrupt) = statusTupleprint("pecErr: 0x%02X protocolErr: 0x%02X pendingInterrupt: 0x%02X" % (pecErr, protocolErr, pendingInterrupt))
status = sidebandBusController.doBroadcastWrite('RSTDAA')
if status == True:svt.printMsg('RSTDAA CCC PASS', 'green')
else:svt.printMsg('RSTDAA CCC FAIL', 'red')    
i3cDataCapture.stop()

代码没有改变,点击Run运行,如图:

在这里插入图片描述
打开生成的波形结果,对比与刚刚生成的结果,由于使能PEC,故结果中包含pec byte:

在这里插入图片描述

5、使能ENEC+使能PEC+注入PEC错误+获取器件状态

然后开始注入PEC error,Python代码如下:

import dftm.svt as svt
i3cDataCapture.start()
sidebandBusController.setup()
sidebandBusController.initializeBus()
status = sidebandBusController.doBroadcastWrite('SETAASA')
if status == True:svt.printMsg('SETAASA CCC PASS', 'green')
else:svt.printMsg('SETAASA CCC FAIL', 'red')
sidebandBusController.disableLowBitRateMode()
status = sidebandBusController.doBroadcastWrite('ENEC', cccDefiningBytes = [0x01])
if status == True:svt.printMsg('ENEC CCC PASS', 'green')
else:svt.printMsg('ENEC CCC FAIL', 'red')
sidebandBusController.startPecErrorInjection()
targetAddr = 'DIMM0-SPD'
regAddr = 0x0C
dataByte = 0x01 # one byte
status = sidebandBusController.spdWriteReg(targetAddr, regAddr, dataByte)
if status == True:svt.printMsg('spdWriteReg PASS', 'green')
else:svt.printMsg('spdWriteReg FAIL', 'red')
sidebandBusController.stopPecErrorInjection()
statusTuple = sidebandBusController.getTargetStatus('DIMM0-SPD')
if statusTuple is not None:(pecErr, protocolErr, pendingInterrupt) = statusTupleprint("pecErr: 0x%02X protocolErr: 0x%02X pendingInterrupt: 0x%02X" % (pecErr, protocolErr, pendingInterrupt))
status = sidebandBusController.doBroadcastWrite('RSTDAA')
if status == True:svt.printMsg('RSTDAA CCC PASS', 'green')
else:svt.printMsg('RSTDAA CCC FAIL', 'red')    
i3cDataCapture.stop()

Procedure区域编辑代码,点击Run运行,如图,LOG区域已经打印运行结果:

在这里插入图片描述
打开生成的波形结果,如图,在写Reg时注入错误的PEC byte:

在这里插入图片描述
ibi payload自动完成,如图所示:

在这里插入图片描述

6、使能ENEC+未注入parity错误+获取器件状态

6、7部分的工作主要是测试SV4E-I3C设备的parity注错功能,这里对sidebandBusController.startErrorInjection(errorSpecs)进行测试,首先是未进行parity注错,Python代码如下:

import dftm.svt as svt
i3cDataCapture.start()
sidebandBusController.setup()
sidebandBusController.enableLowBitRateMode()
status = sidebandBusController.doBroadcastWrite('SETAASA')
if status == True:svt.printMsg('SETAASA CCC PASS', 'green')
else:svt.printMsg('SETAASA CCC FAIL', 'red')
sidebandBusController.disableLowBitRateMode()
status = sidebandBusController.doBroadcastWrite('ENEC', cccDefiningBytes = [0x01])
if status == True:svt.printMsg('ENEC CCC PASS', 'green')
else:svt.printMsg('ENEC CCC FAIL', 'red')
bytesFromTarget = sidebandBusController.spdWriteReg('DIMM0-SPD', 0x00,0x00)
statusTuple = sidebandBusController.getTargetStatus('DIMM0-SPD')
if statusTuple is not None:(pecErr, protocolErr, pendingInterrupt) = statusTupleprint("pecErr: 0x%02X protocolErr: 0x%02X pendingInterrupt: 0x%02X" % (pecErr, protocolErr, pendingInterrupt))
status = sidebandBusController.doBroadcastWrite('RSTDAA')
if status == True:svt.printMsg('RSTDAA CCC PASS', 'green')
else:svt.printMsg('RSTDAA CCC FAIL', 'red')
i3cDataCapture.stop()

Procedure区域编辑代码,点击Run运行,如图,LOG区域已经打印运行结果:

在这里插入图片描述
打开生成的波形结果,如图:

在这里插入图片描述

7、使能ENEC+注入parity错误+获取器件状态

注入parity错误,Python代码如下:

import dftm.svt as svt
i3cDataCapture.start()
sidebandBusController.setup()
sidebandBusController.enableLowBitRateMode()
status = sidebandBusController.doBroadcastWrite('SETAASA')
if status == True:svt.printMsg('SETAASA CCC PASS', 'green')
else:svt.printMsg('SETAASA CCC FAIL', 'red')
sidebandBusController.disableLowBitRateMode()
status = sidebandBusController.doBroadcastWrite('ENEC', cccDefiningBytes = [0x01])
if status == True:svt.printMsg('ENEC CCC PASS', 'green')
else:svt.printMsg('ENEC CCC FAIL', 'red')
errorSpecs = [ (2, 3) ]
sidebandBusController.startErrorInjection(errorSpecs)
bytesFromTarget = sidebandBusController.spdWriteReg('DIMM0-SPD', 0x00,0x00)
sidebandBusController.stopErrorInjection()
statusTuple = sidebandBusController.getTargetStatus('DIMM0-SPD')
if statusTuple is not None:(pecErr, protocolErr, pendingInterrupt) = statusTupleprint("pecErr: 0x%02X protocolErr: 0x%02X pendingInterrupt: 0x%02X" % (pecErr, protocolErr, pendingInterrupt))
status = sidebandBusController.doBroadcastWrite('RSTDAA')
if status == True:svt.printMsg('RSTDAA CCC PASS', 'green')
else:svt.printMsg('RSTDAA CCC FAIL', 'red')
i3cDataCapture.stop()

Procedure区域编辑代码,点击Run运行,如图:

在这里插入图片描述
打开生成的波形结果,如图,写Reg注入parity error,ibi payload自动完成:

在这里插入图片描述

8、使能ENEC+注入parity错误+读Reg+ibiResponse(ackAndDisable)+获取器件状态

8、9部分的工作主要是测试SV4E-I3C设备的ibiResponse设置,首先controllerParams部分ibiResponse设置为ackAndDisable,Python代码如下:

import dftm.svt as svt
i3cDataCapture.start()
sidebandBusController.setup()
sidebandBusController.enableLowBitRateMode()
status = sidebandBusController.doBroadcastWrite('SETAASA')
if status == True:svt.printMsg('SETAASA CCC PASS', 'green')
else:svt.printMsg('SETAASA CCC FAIL', 'red')
sidebandBusController.disableLowBitRateMode()
status = sidebandBusController.doBroadcastWrite('ENEC', cccDefiningBytes = [0x01])
if status == True:svt.printMsg('ENEC CCC PASS', 'green')
else:svt.printMsg('ENEC CCC FAIL', 'red')
errorSpecs = [ (2, 3) ]
sidebandBusController.startErrorInjection(errorSpecs)
bytesFromTarget = sidebandBusController.spdWriteReg('DIMM0-SPD', 0x00,0x00)
sidebandBusController.stopErrorInjection()
bytesFromTarget = sidebandBusController.spdReadReg('DIMM0-SPD', 0x30, numBytes = 5)
for value in range(int(0x30),int(5+0x30)):print("regAddr: 0x%02X mrbyte: 0x%02X" % (value, bytesFromTarget[(value-(int(0x30)))]))
statusTuple = sidebandBusController.getTargetStatus('DIMM0-SPD')
if statusTuple is not None:(pecErr, protocolErr, pendingInterrupt) = statusTupleprint("pecErr: 0x%02X protocolErr: 0x%02X pendingInterrupt: 0x%02X" % (pecErr, protocolErr, pendingInterrupt))
status = sidebandBusController.doBroadcastWrite('RSTDAA')
if status == True:svt.printMsg('RSTDAA CCC PASS', 'green')
else:svt.printMsg('RSTDAA CCC FAIL', 'red')
i3cDataCapture.stop()

Procedure区域编辑代码,点击Run运行,如图,LOG区域已经打印运行结果:

在这里插入图片描述
打开生成的波形结果,如图,注意与下个波形结果进行对比:

在这里插入图片描述

9、使能ENEC+注入parity错误+读Reg+ibiResponse(ackAndProceed)+获取器件状态

controllerParams部分ibiResponse设置为ackAndProceed,Python代码未改变,如下:

import dftm.svt as svt
i3cDataCapture.start()
sidebandBusController.setup()
sidebandBusController.enableLowBitRateMode()
status = sidebandBusController.doBroadcastWrite('SETAASA')
if status == True:svt.printMsg('SETAASA CCC PASS', 'green')
else:svt.printMsg('SETAASA CCC FAIL', 'red')
sidebandBusController.disableLowBitRateMode()
status = sidebandBusController.doBroadcastWrite('ENEC', cccDefiningBytes = [0x01])
if status == True:svt.printMsg('ENEC CCC PASS', 'green')
else:svt.printMsg('ENEC CCC FAIL', 'red')
errorSpecs = [ (2, 3) ]
sidebandBusController.startErrorInjection(errorSpecs)
bytesFromTarget = sidebandBusController.spdWriteReg('DIMM0-SPD', 0x00,0x00)
sidebandBusController.stopErrorInjection()
bytesFromTarget = sidebandBusController.spdReadReg('DIMM0-SPD', 0x30, numBytes = 5)
for value in range(int(0x30),int(5+0x30)):print("regAddr: 0x%02X mrbyte: 0x%02X" % (value, bytesFromTarget[(value-(int(0x30)))]))
statusTuple = sidebandBusController.getTargetStatus('DIMM0-SPD')
if statusTuple is not None:(pecErr, protocolErr, pendingInterrupt) = statusTupleprint("pecErr: 0x%02X protocolErr: 0x%02X pendingInterrupt: 0x%02X" % (pecErr, protocolErr, pendingInterrupt))
status = sidebandBusController.doBroadcastWrite('RSTDAA')
if status == True:svt.printMsg('RSTDAA CCC PASS', 'green')
else:svt.printMsg('RSTDAA CCC FAIL', 'red')
i3cDataCapture.stop()

点击Run运行,如图:

在这里插入图片描述
打开生成的波形结果,如图:

在这里插入图片描述

10、I2C模式写Reg

SV4E-I3C设备在i2c模式下写SPD5的Reg(MR寄存器),Python代码如下:

import dftm.svt as svt
i3cDataCapture.start()
sidebandBusController.setup()
regAddr = 0x00
dataByte = 0x00
sidebandBusController.enableLowBitRateMode()
status = sidebandBusController.spdLegacyWriteReg('DIMM0-SPD', regAddr, dataByte, twoByteAddressing=False)
if status == True:svt.printMsg('spdLegacyWriteReg PASS', 'green')
else:svt.printMsg('spdLegacyWriteReg FAIL', 'red')
i3cDataCapture.stop()

Procedure区域编辑代码,点击Run运行,如图:

在这里插入图片描述
打开生成的波形结果,如图:

在这里插入图片描述

11、I2C模式写Mem

SV4E-I3C设备在i2c模式下写SPD5的Mem(NVM寄存器),Python代码如下:

import dftm.svt as svt
i3cDataCapture.start()
sidebandBusController.setup()
sidebandBusController.enableLowBitRateMode()
memBlock = 0x00
data16Bytes = []
for datanum in range(16):data16Bytes.append(0xFF)
for block in range(16):for addr in range(4):status = sidebandBusController.spdLegacyWriteMem('DIMM0-SPD', memBlock, 0x00, data16Bytes)if status == True:print("memBlock: %d  write 0x%02X PASS" % (block,data16Bytes[0]))else:print("memBlock: %d  write 0x%02X FAIL" % (block,data16Bytes[0]))
memBlock = memBlock + 1
i3cDataCapture.stop()

Procedure区域编辑代码,点击Run运行,如图,LOG区域已经打印运行结果:

在这里插入图片描述
打开生成的波形结果,如图:

在这里插入图片描述

12、I2C模式读Mem

SV4E-I3C设备在i2c模式下读SPD5的Mem(NVM寄存器),Python代码如下:

import dftm.svt as svt
i3cDataCapture.start()
sidebandBusController.setup()
sidebandBusController.enableLowBitRateMode()
memBlock = 0x00
for block in range(16):
bytesFromTarget = sidebandBusController.spdLegacyReadMem('DIMM0-SPD', memBlock, 0x00, numBytes = 64, twoByteAddressing=False)for value in range(64):print("memBlock: %d memAddr: 0x%02X mrbyte: 0x%02X" % (block, value, bytesFromTarget[value]))
memBlock = memBlock + 1
i3cDataCapture.stop()

Procedure区域编辑代码,点击Run运行,如图,LOG区域已经打印运行结果:

在这里插入图片描述

打开生成的波形结果,如图:

在这里插入图片描述

13、I3C模式读Reg

SV4E-I3C设备在i3c模式下读SPD5的Reg(MR寄存器),Python代码如下:

import dftm.svt as svt
i3cDataCapture.start()
sidebandBusController.setup()
regAddr = 0x00
byte_num = 64
sidebandBusController.enableLowBitRateMode()
status = sidebandBusController.doBroadcastWrite('SETAASA')
if status == True:svt.printMsg('SETAASA CCC PASS', 'green')
else:svt.printMsg('SETAASA CCC FAIL', 'red')
sidebandBusController.disableLowBitRateMode()
bytesFromTarget = sidebandBusController.spdReadReg('DIMM0-SPD', regAddr, numBytes = byte_num)
for value in range(int(regAddr),int(byte_num+regAddr)):print("regAddr: 0x%02X mrbyte: 0x%02X" % (value, bytesFromTarget[(value-(int(regAddr)))]))
status = sidebandBusController.doBroadcastWrite('RSTDAA')
if status == True:svt.printMsg('RSTDAA CCC PASS', 'green')
else:svt.printMsg('RSTDAA CCC FAIL', 'red')
i3cDataCapture.stop()

Procedure区域编辑代码,点击Run运行,如图,LOG区域已经打印运行结果:

在这里插入图片描述
打开生成的波形结果,如图:

在这里插入图片描述

14、I3C模式写Reg

SV4E-I3C设备在i3c模式下写SPD5的Reg(MR寄存器),Python代码如下:

import dftm.svt as svt
i3cDataCapture.start()
sidebandBusController.setup()
sidebandBusController.enableLowBitRateMode()
status = sidebandBusController.doBroadcastWrite('SETAASA')
if status == True:svt.printMsg('SETAASA CCC PASS', 'green')
else:svt.printMsg('SETAASA CCC FAIL', 'red')
sidebandBusController.disableLowBitRateMode()
regAddr = 0x00
dataByte = 0x00
status = sidebandBusController.spdWriteReg('DIMM0-SPD', regAddr, dataByte)
if status == True:svt.printMsg('spdWriteReg PASS', 'green')
else:svt.printMsg('spdWriteReg FAIL', 'red')
status = sidebandBusController.doBroadcastWrite('RSTDAA')
if status == True:svt.printMsg('RSTDAA CCC PASS', 'green')
else:svt.printMsg('RSTDAA CCC FAIL', 'red')
i3cDataCapture.stop()

Procedure区域编辑代码,点击Run运行,如图,LOG区域已经打印运行结果:

在这里插入图片描述

打开生成的波形结果,如图:

在这里插入图片描述

15、I3C模式写Mem

SV4E-I3C设备在i3c模式下写SPD5的Mem(NVM寄存器),Python代码如下:

import dftm.svt as svt
i3cDataCapture.start()
sidebandBusController.setup()
sidebandBusController.enableLowBitRateMode()
status = sidebandBusController.doBroadcastWrite('SETAASA')
if status == True:svt.printMsg('SETAASA CCC PASS', 'green')
else:svt.printMsg('SETAASA CCC FAIL', 'red')
sidebandBusController.disableLowBitRateMode()
memBlock = 0x00
data16Bytes = []
for datanum in range(16):data16Bytes.append(0xFF)
for block in range(16):for addr in range(4):status = sidebandBusController.spdWriteMem('DIMM0-SPD', memBlock, 0x00, data16Bytes)if status == True:print("memBlock: %d  write 0x%02X PASS" % (block,data16Bytes[0]))else:print("memBlock: %d  write 0x%02X FAIL" % (block,data16Bytes[0]))
memBlock = memBlock + 1
status = sidebandBusController.doBroadcastWrite('RSTDAA')
if status == True:svt.printMsg('RSTDAA CCC PASS', 'green')
else:svt.printMsg('RSTDAA CCC FAIL', 'red')
i3cDataCapture.stop()

Procedure区域编辑代码,点击Run运行,如图,LOG区域已经打印运行结果:

在这里插入图片描述

打开生成的波形结果,如图:

在这里插入图片描述

16、I3C模式读Mem

SV4E-I3C设备在i3c模式下读SPD5的Mem(NVM寄存器),Python代码如下:

import dftm.svt as svt
i3cDataCapture.start()
sidebandBusController.setup()
sidebandBusController.enableLowBitRateMode()
status = sidebandBusController.doBroadcastWrite('SETAASA')
if status == True:
svt.printMsg('SETAASA CCC PASS', 'green')
else:
svt.printMsg('SETAASA CCC FAIL', 'red')
sidebandBusController.disableLowBitRateMode()
memBlock = 0x00
for block in range(16):
bytesFromTarget = sidebandBusController.spdReadMem('DIMM0-SPD', memBlock, 0x00, numBytes = 64)for value in range(64):
print("memBlock: %d memAddr: 0x%02X mrbyte: 0x%02X" % (block, value, bytesFromTarget[value]))
memBlock = memBlock + 1
status = sidebandBusController.doBroadcastWrite('RSTDAA')
if status == True:
svt.printMsg('RSTDAA CCC PASS', 'green')
else:
svt.printMsg('RSTDAA CCC FAIL', 'red')
i3cDataCapture.stop()

Procedure区域编辑代码,点击Run运行,如图,LOG区域已经打印运行结果:

在这里插入图片描述

打开生成的波形结果,如图:

在这里插入图片描述
上述程序可能存在少量错误和可优化的地方,后续博文将进行修改和优化

希望本文对大家有帮助,上文若有不妥之处,欢迎指正

分享决定高度,学习拉开差距

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/259032.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2.17C语言学习

P1678 烦恼的高考志愿 写完后发现题解里面用的是优先队列或者二分什么的,其实这个题可以贪心,我们把学校的分数线和学生的成绩分别进行排序,然后从前往后遍历,每次比较当前学校的分数与学生成绩的差距和下一个学校的分数与学生成…

Linux CentOS stream 9 安装docker

在计算机技术中,虑拟化是一种资源管理技术,是将计算机的各种实体资源(CPU、内存、磁盘空间、网络适配器等),予以抽象、转换后呈现出来并可供分区、组合为一个或多个电脑配置环境。 目前,大多数服务器的容量的利用率不足15%,这导致服务器数量激增以及增加了复杂性。服务…

(二)【Jmeter】专栏实战项目靶场drupal部署

该专栏后续实战示例,都以该篇部署的项目展开操作。 前置条件 参考“(一)【Jmeter】JDK及Jmeter的安装部署及简单配置” 安装部署Jmeter,从文章最后下载“Postman、Rancher.ova、VirtualBox-7.0.12-159484-Win.exe、Xshell-7.0.01…

【第三十六节】工程与模块管理

IDEA 项目结构 层级关系: project(工程)-module(模块)-package(包)-class(类) 具体的: 一个project中可以创建多个module 一个module可以创建多个package 一个package中可以创…

[C# WPF] DataGrid选中行或选中单元格的背景和字体颜色修改

问题描述 WPF中DataGrid的选中行或选中者单元格&#xff0c;在焦点失去后&#xff0c;颜色会很淡&#xff0c;很不明显&#xff0c;不容易区分。 解决方法 在失去焦点的情况下&#xff0c;如何设置行或单元格与选中的时候颜色一样&#xff1f; <DataGrid.Resources>&…

如何在Spring Boot中启用HTTPS?

在Spring Boot中启用HTTPS是一个增强应用程序安全性的重要步骤。下面我将介绍如何将一个Spring Boot项目配置成支持HTTPS协议。 引入 在现代的网络通信中&#xff0c;安全性成为了一个不能忽视的要求。特别是当我们谈论到数据传输时&#xff0c;保护用户信息的安全性是非常重要…

【大厂AI课学习笔记】【2.1 人工智能项目开发规划与目标】(2)项目开发周期

我们来学习项目开发的周期。 再次声明&#xff0c;本文来自腾讯AI课的学习笔记&#xff0c;图片和文字&#xff0c;仅用于大家学习&#xff0c;想了解更多知识&#xff0c;请访问腾讯云相关章节。如果争议&#xff0c;请联系作者。 今天&#xff0c;我们来学习AI项目的周期。 主…

黑马鸿蒙教程学习1:Helloworld

今年打算粗略学习下鸿蒙开发&#xff0c;当作兴趣爱好&#xff0c;通过下华为那个鸿蒙开发认证&#xff0c; 发现黑马的课程不错&#xff0c;有视频和完整的代码和课件下载&#xff0c;装个devstudio就行了&#xff0c;建议32G内存。 今年的确是鸿蒙大爆发的一年呀&#xff0c;…

【以解决】Pyinstaller打包报错IndexError: tuple index out of range

问题 这个问题主要是在Python3.7以上的版本中遇到&#xff0c;用pyinstaller打包的时候发现报错 (pyinstallerEnv) D:\virtualEnv\pyinstallerEnv\Scripts>auto-py-to-exe pygame 2.5.2 (SDL 2.28.3, Python 3.10.0) Hello from the pygame community. https://www.pygame…

人工智能学习与实训笔记(四):神经网络之NLP基础—词向量

人工智能专栏文章汇总&#xff1a;人工智能学习专栏文章汇总-CSDN博客 本篇目录 四、自然语言处理 4.1 词向量 (Word Embedding) 4.1.1 词向量的生成过程 4.1.2 word2vec介绍 4.1.3 word2vec&#xff1a;skip-gram算法的实现 4.2 句向量 - 情感分析 4.2.1 LSTM (Long S…

第六节笔记:OpenCompass 大模型评测

视频链接&#xff1a;https://www.bilibili.com/video/BV1Gg4y1U7uc/?spm_id_from333.788&vd_source3bbd0d74033e31cbca9ee35e111ed3d1

普中51单片机学习(六)

点亮第一个LED LED相关知识 LED,即发光二极管&#xff0c;是一种半导体固体发光器件。工作原理为&#xff1a;LED的工作是有方向性的&#xff0c;只有当正级接到LED阳极&#xff0c;负极接到LED的阴极的时候才能工作&#xff0c;如果反接LED是不能正常工作的。其原理图如下 …

【机器学习】机器学习常见算法详解第4篇:KNN算法计算过程(已分享,附代码)

本系列文章md笔记&#xff08;已分享&#xff09;主要讨论机器学习算法相关知识。机器学习算法文章笔记以算法、案例为驱动的学习&#xff0c;伴随浅显易懂的数学知识&#xff0c;让大家掌握机器学习常见算法原理&#xff0c;应用Scikit-learn实现机器学习算法的应用&#xff0…

机器学习3----决策树

这是前期准备 import numpy as np import pandas as pd import matplotlib.pyplot as plt #ID3算法 #每个特征的信息熵 # target : 账号是否真实&#xff0c;共2种情况 # yes 7个 p0.7 # no 3个 p0.3 info_D-(0.7*np.log2(0.7)0.3*np.log2(0.3)) info_D #日志密度…

Positive SSL 证书介绍

Positive SSL 是一种受欢迎的 SSL 证书&#xff0c;提供了卓越的安全性、性价比和品牌信任。以下是对 Positive SSL 在这些方面的简要介绍&#xff1a; 1. 安全性&#xff1a; Positive SSL 证书采用强大的加密技术&#xff0c;确保网站和用户之间的数据传输是安全的。它使用…

普法GraphicBuffer诞生以及跨进程传递

GraphicBuffer诞生以及跨进程传递重认识 引言 对于Android的Graphics图形堆栈这块&#xff0c;自我感觉看了蛮多的博客啊文档(不管是比较老的还是新一点的)。但是仅仅只是看了而已&#xff0c;都是蜻蜓点水&#xff0c;没有进行记录也没有总结。所以每次哪怕阅读过程中产业了很…

【PCB】Allegro PCB 的模块复用操作

【PCB】Allegro PCB 的模块复用操作

(01)Hive的相关概念——架构、数据存储、读写文件机制

目录 一、架构及组件介绍 1.1 Hive整体架构 1.2 Hive组件 1.3 Hive数据模型&#xff08;Data Model&#xff09; 1.3.1 Databases 1.3.2 Tables 1.3.3 Partitions 1.3.4 Buckets 二、Hive读写文件机制 2.1 SerDe 作用 2.2 Hive读写文件流程 2.2.1 读取文件的过程 …

Java 抽象容器类源码剖析

总体介绍 抽象容器类接口和具体容器类的关系如图所示&#xff0c;顶层包括Collection、List、Set、Queue、Deque和Map6个抽象容器类。 AbstractCollection&#xff1a;实现了Collection接口&#xff0c;被抽象类AbstractList、AbstractSet、AbstractQueue继承&#xff0c;Arra…

文件上传漏洞--Upload-labs--Pass01--前端绕过

一、前端绕过原理 通俗解释&#xff0c;我们将写有恶意代码的php后缀文件上传到网页&#xff0c;网页中的javascript代码会先对文件的后缀名进行检测&#xff0c;若检测到上传文件的后缀名为非法&#xff0c;则会进行alert警告。若想上传php后缀的文件&#xff0c;就要想办法对…