手把手一起开发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.mzph.cn/news/687753.shtml

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

相关文章

12(S)-HETE ELISA kit--灵敏的ELISA试剂盒

灵敏的ELISA试剂盒,能够检测任何物种的培养上清液和血浆中的12(S)-HETE HETE是由脂氧合酶代谢花生四烯酸产生的副产物。12(S)-HETE是12(S)-氢过氧四烯酸(12(S)-HpETE)还原的立体特异性羟基产物,其本身是花生四烯酸的12-脂氧酶代谢…

23年秋招结束,同学们陆陆续续拿到心仪的offer!24年秋招出发!

续接上次上岸同学的分享:还在担心秋招吗?看看24届已上岸同学的经验分享! 秋招的时间过程相同,但经历却各不相同。学历、专业似乎都影响着同学们的面试经历和感受。校招的面试毫无疑问学历的加持是巨大的优势,学历好会…

票房25亿!《热辣滚烫》的创造性模仿,普通人赚钱的落地方法

最近很火的电影《热辣滚烫》包含了我们很多普通人做点小事儿,赚点小钱非常落地的方法,叫做创造性模仿。 很多人说《热辣滚烫》是翻拍的日本《百元之恋》,知道这个有什么用?就证明贾玲不是那么优秀吗?对我们普通人想赚…

全新超大屏三防加固平板为什么做到Intel core i7的高性能

在小编看来,一款加固三防平板电脑结构规划的思路:一定是要在三防规划中留意取舍的。如果是三防要求高的的商品,则需要将三防规划作为一个主线来做,其他方面环绕三防要求打开,并要有清晰的三防思路和总体思想&#xff0…

java面试微服务篇

目录 目录 SpringCloud Spring Cloud 的5大组件 服务注册 Eureka Nacos Eureka和Nacos的对比 负载均衡 负载均衡流程 Ribbon负载均衡策略 自定义负载均衡策略 熔断、降级 服务雪崩 服务降级 服务熔断 服务监控 为什么需要监控 服务监控的组件 skywalking 业务…

【c++】const引用

Hello everybody!今天给大家讲讲有关const引用部分的知识,因为这部分知识涉及到const与引用直接如何灵活的运用,且不太好理解。所以我认为讲一下这里的知识还是很有必要的! 1.权限可缩小 首先,当我们定义了a,在给a取别…

人工智能学习与实训笔记(二):神经网络之图像分类问题

人工智能专栏文章汇总:人工智能学习专栏文章汇总-CSDN博客 目录 二、图像分类问题 2.1 尝试使用全连接神经网络 2.2 引入卷积神经网络 2.3 分类函数Softmax 2.4 交叉熵损失函数 2.5 学习率优化算法 2.6 图像预处理算法 2.6.1 随机改变亮暗、对比度和颜色等 …

这才是大学生该做的副业,别再痴迷于游戏了!

感谢大家一直以来的支持和关注,尤其是在我的上一个公众号被关闭后,仍然选择跟随我的老粉丝们,你们的支持是我继续前行的动力。为了回馈大家长期以来的陪伴,我决定分享一些实用的干货,这些都是我亲身实践并且取得成功的…

Typora的下载安装(文末有安装包,2024亲测可用)

一、安装步骤 1、首先下载安装包,解压到你的目录下面 2、进入到解压后的文件夹下面,看到如下的内容: 3、双击exe文件开始安装,选择安装目录,并记下安装地址!!! 选择创建桌面快捷方…

2024年腾讯云4核8G12M轻量应用服务器测评,2月更新

4核8G服务器支持多少人同时在线访问?阿腾云的4核8G服务器可以支持20个访客同时访问,关于4核8G服务器承载量并发数qps计算测评,云服务器上运行程序效率不同支持人数在线人数不同,公网带宽也是影响4核8G服务器并发数的一大因素&…

树和二叉树的基本知识

一、树的概念及结构 1.树的概念 树是一种 非线性 的数据结构,它是由 n ( n>0 )个有限结点组成一个具有层次关系的集合。 把它叫做树是因 为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的 。 有一个 特殊…

2024春节过后,抖店爆款出单类目产品,应季产品需要提前布局

我是王路飞。 之前给你们强调过,“应季品”是最容易爆单的产品类型,没有之一。 那么在2024年春节刚过的现在,当别人还沉浸在过年的氛围中时,有心的商家早就开始布局未来三个月的爆款类目和产品了。 今天的内容,就给…

软件实例分享,乒乓球俱乐部会员系统管理软件教程

软件实例分享,乒乓球俱乐部会员系统管理软件教程 一、前言 以下软件程序教程以 佳易王乒乓球馆计时计费软件V17.0为例说明 软件文件下载可以点击最下方官网卡片——软件下载——试用版软件下载 多种计费方式,可以按单价,也可以按时间段 可…

2942. 查找包含给定字符的单词【简单】

2942. 查找包含给定字符的单词【简单】 题目描述: 给你一个下标从 0 开始的字符串数组 words 和一个字符 x 。 请你返回一个 下标数组 ,表示下标在数组中对应的单词包含字符 x 。 注意:返回的数组可以是 任意 顺序 示例 1: 输…

vue3 Element Plus 基于webstorm练习

提要 vue是前端框架,Elemen是组件库。前端框架和组件库的区别与联系 nodejs 脚本语言需要一个解析器才能运行,JavaScript是脚本语言,在不同的位置有不一样的解析器,如写入html的js语言,浏览器是它的解析器角色。而对…

python in Vscode

背景 对于后端的语言选择: python,java,JavaScript备选。 选择Python 原因:可能是非IT专业的人中,会Python的人比较多。 目的 之前使用的IDE是VSCODE,在WSL的环境下使用。现在需要在在WSL的VSCODE下使…

【Java程序员面试专栏 Java领域】Java Spring框架 核心面试指引

关于Java Spring框架部分的核心知识进行一网打尽,主要包括Spring框架中的重点概念IOC和AOP,以及SpringBoot的自动装配机制,SpringMVC的核心执行流程,通过一篇文章串联面试重点,并且帮助加强日常基础知识的理解,全局思维导图如下所示 基础概念 Spring框架的基本概念,S…

浅谈语义分割、图像分类与目标检测中的TP、TN、FP、FN

语义分割 TP:正确地预测出了正类,即原本是正类,识别的也是正类 TN:正确地预测出了负类,即原本是负类,识别的也是负类 FP:错误地预测为了正类,即原本是负类,识别的是正类…

秒懂百科,C++如此简单丨第二十一天:栈和队列

目录 前言 Everyday English 栈(Stack) 图文解释 实现添加删除元素 实现查看清空栈 完整代码 运行示例 栈的选择题 队列(Queue) 图文解释 队列的基本用法 完整代码 运行结果 队列的好处 结尾 前言 今天我们将…

java 培训班预定管理系统Myeclipse开发mysql数据库web结构jsp编程servlet计算机网页项目

一、源码特点 java 培训班预定管理系统是一套完善的java web信息管理系统 采用serlvetdaobean,对理解JSP java编程开发语言有帮助,系统具有完整的源代码和数据库,系统主要采用B/S模式开发。开发环境为TOMCAT7.0,Myeclipse8.5开发&#xf…