diff --git a/.gitignore b/.gitignore index 2b9909f..259704a 100644 --- a/.gitignore +++ b/.gitignore @@ -1,353 +1,353 @@ - -/project/.*/ -### Project Specific stuff -test_run_dir/* -### XilinxISE template -# intermediate build files -*.bgn -*.bit -*.bld -*.cmd_log -*.drc -*.ll -*.lso -*.msd -*.msk -*.ncd -*.ngc -*.ngd -*.ngr -*.pad -*.par -*.pcf -*.prj -*.ptwx -*.rbb -*.rbd -*.stx -*.syr -*.twr -*.twx -*.unroutes -*.ut -*.xpi -*.xst -*_bitgen.xwbt -*_envsettings.html -*_map.map -*_map.mrp -*_map.ngm -*_map.xrpt -*_ngdbuild.xrpt -*_pad.csv -*_pad.txt -*_par.xrpt -*_summary.html -*_summary.xml -*_usage.xml -*_xst.xrpt - -# project-wide generated files -*.gise -par_usage_statistics.html -usage_statistics_webtalk.html -webtalk.log -webtalk_pn.xml - -# generated folders -iseconfig/ -xlnx_auto_0_xdb/ -xst/ -_ngo/ -_xmsgs/ -### Eclipse template -*.pydevproject -.metadata -.gradle -bin/ -tmp/ -*.tmp -*.bak -*.swp -*~.nib -local.properties -.settings/ -.loadpath - -# Eclipse Core -.project - -# External tool builders -.externalToolBuilders/ - -# Locally stored "Eclipse launch configurations" -*.launch - -# CDT-specific -.cproject - -# JDT-specific (Eclipse Java Development Tools) -.classpath - -# Java annotation processor (APT) -.factorypath - -# PDT-specific -.buildpath - -# sbteclipse plugin -.target - -# TeXlipse plugin -.texlipse -### C template -# Object files -*.o -*.ko -*.obj -*.elf - -# Precompiled Headers -*.gch -*.pch - -# Libraries -*.lib -*.a -*.la -*.lo - -# Shared objects (inc. Windows DLLs) -*.dll -*.so -*.so.* -*.dylib - -# Executables -*.exe -*.out -*.app -*.i*86 -*.x86_64 -*.hex - -# Debug files -*.dSYM/ -### SBT template -# Simple Build Tool -# http://www.scala-sbt.org/release/docs/Getting-Started/Directories.html#configuring-version-control - -target/ -lib_managed/ -src_managed/ -project/boot/ -.history -.cache -### Emacs template -# -*- mode: gitignore; -*- -*~ -\#*\# -/.emacs.desktop -/.emacs.desktop.lock -*.elc -auto-save-list -tramp -.\#* - -# Org-mode -.org-id-locations -*_archive - -# flymake-mode -*_flymake.* - -# eshell files -/eshell/history -/eshell/lastdir - -# elpa packages -/elpa/ - -# reftex files -*.rel - -# AUCTeX auto folder -/auto/ - -# cask packages -.cask/ -### Vim template -[._]*.s[a-w][a-z] -[._]s[a-w][a-z] -*.un~ -Session.vim -.netrwhist -*~ -### JetBrains template -# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio - -*.iml - -## Directory-based project format: -.idea/ -# if you remove the above rule, at least ignore the following: - -# User-specific stuff: -# .idea/workspace.xml -# .idea/tasks.xml -# .idea/dictionaries - -# Sensitive or high-churn files: -# .idea/dataSources.ids -# .idea/dataSources.xml -# .idea/sqlDataSources.xml -# .idea/dynamic.xml -# .idea/uiDesigner.xml - -# Gradle: -# .idea/gradle.xml -# .idea/libraries - -# Mongo Explorer plugin: -# .idea/mongoSettings.xml - -## File-based project format: -*.ipr -*.iws - -## Plugin-specific files: - -# IntelliJ -/out/ - -# mpeltonen/sbt-idea plugin -.idea_modules/ - -# JIRA plugin -atlassian-ide-plugin.xml - -# Crashlytics plugin (for Android Studio and IntelliJ) -com_crashlytics_export_strings.xml -crashlytics.properties -crashlytics-build.properties -### C++ template -# Compiled Object files -*.slo -*.lo -*.o -*.obj - -# Precompiled Headers -*.gch -*.pch - -# Compiled Dynamic libraries -*.so -*.dylib -*.dll - -# Fortran module files -*.mod - -# Compiled Static libraries -*.lai -*.la -*.a -*.lib - -# Executables -*.exe -*.out -*.app -### OSX template -.DS_Store -.AppleDouble -.LSOverride - -# Icon must end with two \r -Icon - -# Thumbnails -._* - -# Files that might appear in the root of a volume -.DocumentRevisions-V100 -.fseventsd -.Spotlight-V100 -.TemporaryItems -.Trashes -.VolumeIcon.icns - -# Directories potentially created on remote AFP share -.AppleDB -.AppleDesktop -Network Trash Folder -Temporary Items -.apdisk -### Xcode template -# Xcode -# -# gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore - -## Build generated -build/ -DerivedData - -## Various settings -*.pbxuser -!default.pbxuser -*.mode1v3 -!default.mode1v3 -*.mode2v3 -!default.mode2v3 -*.perspectivev3 -!default.perspectivev3 -xcuserdata - -## Other -*.xccheckout -*.moved-aside -*.xcuserstate -### Scala template -*.class -*.log -/.bsp - -# sbt specific -.cache -.history -.lib/ -dist/* -target/ -lib_managed/ -src_managed/ -project/boot/ -project/plugins/project/ - -# Scala-IDE specific -.scala_dependencies -.worksheet -### Java template -*.class - -# Mobile Tools for Java (J2ME) -.mtj.tmp/ - -# Package Files # -*.jar -*.war -*.ear - -# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml -hs_err_pid* - -.metals/ -generated/ -project/.bloop/riscv-mac-swich-build.json -src/main/scala/mac/MacTilelink.scala -doc/ -tb/CDRIn.v -tb/CDROut.v -tb/crc32_8.v -*.pyc -spi_trans_data.txt + +/project/.*/ +### Project Specific stuff +test_run_dir/* +### XilinxISE template +# intermediate build files +*.bgn +*.bit +*.bld +*.cmd_log +*.drc +*.ll +*.lso +*.msd +*.msk +*.ncd +*.ngc +*.ngd +*.ngr +*.pad +*.par +*.pcf +*.prj +*.ptwx +*.rbb +*.rbd +*.stx +*.syr +*.twr +*.twx +*.unroutes +*.ut +*.xpi +*.xst +*_bitgen.xwbt +*_envsettings.html +*_map.map +*_map.mrp +*_map.ngm +*_map.xrpt +*_ngdbuild.xrpt +*_pad.csv +*_pad.txt +*_par.xrpt +*_summary.html +*_summary.xml +*_usage.xml +*_xst.xrpt + +# project-wide generated files +*.gise +par_usage_statistics.html +usage_statistics_webtalk.html +webtalk.log +webtalk_pn.xml + +# generated folders +iseconfig/ +xlnx_auto_0_xdb/ +xst/ +_ngo/ +_xmsgs/ +### Eclipse template +*.pydevproject +.metadata +.gradle +bin/ +tmp/ +*.tmp +*.bak +*.swp +*~.nib +local.properties +.settings/ +.loadpath + +# Eclipse Core +.project + +# External tool builders +.externalToolBuilders/ + +# Locally stored "Eclipse launch configurations" +*.launch + +# CDT-specific +.cproject + +# JDT-specific (Eclipse Java Development Tools) +.classpath + +# Java annotation processor (APT) +.factorypath + +# PDT-specific +.buildpath + +# sbteclipse plugin +.target + +# TeXlipse plugin +.texlipse +### C template +# Object files +*.o +*.ko +*.obj +*.elf + +# Precompiled Headers +*.gch +*.pch + +# Libraries +*.lib +*.a +*.la +*.lo + +# Shared objects (inc. Windows DLLs) +*.dll +*.so +*.so.* +*.dylib + +# Executables +*.exe +*.out +*.app +*.i*86 +*.x86_64 +*.hex + +# Debug files +*.dSYM/ +### SBT template +# Simple Build Tool +# http://www.scala-sbt.org/release/docs/Getting-Started/Directories.html#configuring-version-control + +target/ +lib_managed/ +src_managed/ +project/boot/ +.history +.cache +### Emacs template +# -*- mode: gitignore; -*- +*~ +\#*\# +/.emacs.desktop +/.emacs.desktop.lock +*.elc +auto-save-list +tramp +.\#* + +# Org-mode +.org-id-locations +*_archive + +# flymake-mode +*_flymake.* + +# eshell files +/eshell/history +/eshell/lastdir + +# elpa packages +/elpa/ + +# reftex files +*.rel + +# AUCTeX auto folder +/auto/ + +# cask packages +.cask/ +### Vim template +[._]*.s[a-w][a-z] +[._]s[a-w][a-z] +*.un~ +Session.vim +.netrwhist +*~ +### JetBrains template +# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio + +*.iml + +## Directory-based project format: +.idea/ +# if you remove the above rule, at least ignore the following: + +# User-specific stuff: +# .idea/workspace.xml +# .idea/tasks.xml +# .idea/dictionaries + +# Sensitive or high-churn files: +# .idea/dataSources.ids +# .idea/dataSources.xml +# .idea/sqlDataSources.xml +# .idea/dynamic.xml +# .idea/uiDesigner.xml + +# Gradle: +# .idea/gradle.xml +# .idea/libraries + +# Mongo Explorer plugin: +# .idea/mongoSettings.xml + +## File-based project format: +*.ipr +*.iws + +## Plugin-specific files: + +# IntelliJ +/out/ + +# mpeltonen/sbt-idea plugin +.idea_modules/ + +# JIRA plugin +atlassian-ide-plugin.xml + +# Crashlytics plugin (for Android Studio and IntelliJ) +com_crashlytics_export_strings.xml +crashlytics.properties +crashlytics-build.properties +### C++ template +# Compiled Object files +*.slo +*.lo +*.o +*.obj + +# Precompiled Headers +*.gch +*.pch + +# Compiled Dynamic libraries +*.so +*.dylib +*.dll + +# Fortran module files +*.mod + +# Compiled Static libraries +*.lai +*.la +*.a +*.lib + +# Executables +*.exe +*.out +*.app +### OSX template +.DS_Store +.AppleDouble +.LSOverride + +# Icon must end with two \r +Icon + +# Thumbnails +._* + +# Files that might appear in the root of a volume +.DocumentRevisions-V100 +.fseventsd +.Spotlight-V100 +.TemporaryItems +.Trashes +.VolumeIcon.icns + +# Directories potentially created on remote AFP share +.AppleDB +.AppleDesktop +Network Trash Folder +Temporary Items +.apdisk +### Xcode template +# Xcode +# +# gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore + +## Build generated +build/ +DerivedData + +## Various settings +*.pbxuser +!default.pbxuser +*.mode1v3 +!default.mode1v3 +*.mode2v3 +!default.mode2v3 +*.perspectivev3 +!default.perspectivev3 +xcuserdata + +## Other +*.xccheckout +*.moved-aside +*.xcuserstate +### Scala template +*.class +*.log +/.bsp + +# sbt specific +.cache +.history +.lib/ +dist/* +target/ +lib_managed/ +src_managed/ +project/boot/ +project/plugins/project/ + +# Scala-IDE specific +.scala_dependencies +.worksheet +### Java template +*.class + +# Mobile Tools for Java (J2ME) +.mtj.tmp/ + +# Package Files # +*.jar +*.war +*.ear + +# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml +hs_err_pid* + +.metals/ +generated/ +project/.bloop/riscv-mac-swich-build.json +src/main/scala/mac/MacTilelink.scala +doc/ +tb/CDRIn.v +tb/CDROut.v +tb/crc32_8.v +*.pyc +spi_trans_data.txt diff --git a/Makefile b/Makefile index 7255f6d..30fd84c 100644 --- a/Makefile +++ b/Makefile @@ -1,92 +1,92 @@ -TARGET=riscv64-unknown-elf -RVCC=$(TARGET)-gcc -RVCCVERSION=$(shell $(RVCC) --version | grep ^$(RVCC) | sed 's/^.* //g') -ISR_MARCH=-march=rv32i -mabi=ilp32 -APP_MARCH=-march=rv32i -mabi=ilp32 -ISR_CFLAGS=-O2 -APP_CFLAGS=-O2 - -SPI_TYPE ?= -spi 0 -TRANS_CODE ?= -DEVCLK ?= --dev1 0 90 --dev2 0 -90 -CDRCLK ?= --clk 0 40 -CDR_TYPE ?= -cdr 0 - -ifeq "$(RVCCVERSION)" "12.2.0" - ISR_MARCH=-march=rv32izicsr -mabi=ilp32 - APP_MARCH=-march=rv32izicsr -mabi=ilp32 -endif - -.PHONY: compile tb wave - -shin: - rm -f ./generated/shin/* - rm -f ./generated/SimCDR/* - sbt "test:runMain test.testShinModule" - -testShin: - python3 ./tb/shinTest/gen_pkt.py ${SPI_TYPE} ${TRANS_CODE} ${CDR_TYPE} - mkdir -p generated/log - rm -rf generated/log/* - iverilog -Wall \ - -o ./tb/build/shinTest.iverilog \ - -y ./generated/shin \ - -I ./generated/shin \ - -D RANDOMIZE_REG_INIT \ - -D IVERILOG_COMPILE \ - ./tb/shinTest/ShinTopSpiTb.v - vvp -N ./tb/build/shinTest.iverilog -lxt2 -fst || true - python3 ./tb/shinTest/check_testcase.py - -testShinClk: - python3 ./tb/shinTest/gen_pkt_clk.py ${DEVCLK} ${SPI_TYPE} ${TRANS_CODE} ${CDR_TYPE} - mkdir -p generated/log - rm -rf generated/log/* - iverilog -Wall \ - -o ./tb/build/shinTest_clk.iverilog \ - -y ./generated/shin \ - -I ./generated/shin \ - -D RANDOMIZE_REG_INIT \ - -D IVERILOG_COMPILE \ - ./tb/shinTest/ShinTopSpiTb_clk.v - vvp -N ./tb/build/shinTest_clk.iverilog -lxt2 -fst || true - python3 ./tb/shinTest/check_testcase.py - -testCDR: - python3 ./tb/shinTest/gen_sim_cdr_clk.py ${CDRCLK} - iverilog -Wall \ - -o ./tb/build/simCDR.iverilog \ - -y ./generated/SimCDR \ - -I ./generated/SimCDR \ - -D RANDOMIZE_REG_INIT \ - -D IVERILOG_COMPILE \ - ./tb/shinTest/SimCDRTb.v - vvp -N ./tb/build/simCDR.iverilog -lxt2 -fst - - -testFilter: - ./tb/shinTest/test_filter.py - -vcdFilter: - gtkwave ./tb/build/test_filter.vcd 1>/dev/null 2>&1 & - -fstShin: - gtkwave ./generated/wave.fst 1>/dev/null 2>&1 & - -fstShinClk: - gtkwave ./generated/wave_clk.fst 1>/dev/null 2>&1 & - -ef: - sbt "test:runMain test.testModule" - -fst: - gtkwave ./tb/build/wave.fst & - -debug_hlm: - gtkwave -S ./tb/sw/src/view_signal.tcl ./tb/build/wave.fst 1>/dev/null 2>&1 & - - - - - - +TARGET=riscv64-unknown-elf +RVCC=$(TARGET)-gcc +RVCCVERSION=$(shell $(RVCC) --version | grep ^$(RVCC) | sed 's/^.* //g') +ISR_MARCH=-march=rv32i -mabi=ilp32 +APP_MARCH=-march=rv32i -mabi=ilp32 +ISR_CFLAGS=-O2 +APP_CFLAGS=-O2 + +SPI_TYPE ?= -spi 0 +TRANS_CODE ?= +DEVCLK ?= --dev1 0 90 --dev2 0 -90 +CDRCLK ?= --clk 0 40 +CDR_TYPE ?= -cdr 0 + +ifeq "$(RVCCVERSION)" "12.2.0" + ISR_MARCH=-march=rv32izicsr -mabi=ilp32 + APP_MARCH=-march=rv32izicsr -mabi=ilp32 +endif + +.PHONY: compile tb wave + +shin: + rm -f ./generated/shin/* + rm -f ./generated/SimCDR/* + sbt "test:runMain test.testShinModule" + +testShin: + python3 ./tb/shinTest/gen_pkt.py ${SPI_TYPE} ${TRANS_CODE} ${CDR_TYPE} + mkdir -p generated/log + rm -rf generated/log/* + iverilog -Wall \ + -o ./tb/build/shinTest.iverilog \ + -y ./generated/shin \ + -I ./generated/shin \ + -D RANDOMIZE_REG_INIT \ + -D IVERILOG_COMPILE \ + ./tb/shinTest/ShinTopSpiTb.v + vvp -N ./tb/build/shinTest.iverilog -lxt2 -fst || true + python3 ./tb/shinTest/check_testcase.py + +testShinClk: + python3 ./tb/shinTest/gen_pkt_clk.py ${DEVCLK} ${SPI_TYPE} ${TRANS_CODE} ${CDR_TYPE} + mkdir -p generated/log + rm -rf generated/log/* + iverilog -Wall \ + -o ./tb/build/shinTest_clk.iverilog \ + -y ./generated/shin \ + -I ./generated/shin \ + -D RANDOMIZE_REG_INIT \ + -D IVERILOG_COMPILE \ + ./tb/shinTest/ShinTopSpiTb_clk.v + vvp -N ./tb/build/shinTest_clk.iverilog -lxt2 -fst || true + python3 ./tb/shinTest/check_testcase.py + +testCDR: + python3 ./tb/shinTest/gen_sim_cdr_clk.py ${CDRCLK} + iverilog -Wall \ + -o ./tb/build/simCDR.iverilog \ + -y ./generated/SimCDR \ + -I ./generated/SimCDR \ + -D RANDOMIZE_REG_INIT \ + -D IVERILOG_COMPILE \ + ./tb/shinTest/SimCDRTb.v + vvp -N ./tb/build/simCDR.iverilog -lxt2 -fst + + +testFilter: + ./tb/shinTest/test_filter.py + +vcdFilter: + gtkwave ./tb/build/test_filter.vcd 1>/dev/null 2>&1 & + +fstShin: + gtkwave ./generated/wave.fst 1>/dev/null 2>&1 & + +fstShinClk: + gtkwave ./generated/wave_clk.fst 1>/dev/null 2>&1 & + +ef: + sbt "test:runMain test.testModule" + +fst: + gtkwave ./tb/build/wave.fst & + +debug_hlm: + gtkwave -S ./tb/sw/src/view_signal.tcl ./tb/build/wave.fst 1>/dev/null 2>&1 & + + + + + + diff --git a/ShinRelease.sh b/ShinRelease.sh index 8c33eb7..1712d18 100755 --- a/ShinRelease.sh +++ b/ShinRelease.sh @@ -1,19 +1,19 @@ -#!/bin/bash -DEFAULT_TARGET="../ShinRelease" - -TARGET_DIR="${1:-$DEFAULT_TARGET}" - -rm -rf ${TARGET_DIR}/generated/ ${TARGET_DIR}/shinTest/ ${TARGET_DIR}/resources/ -mkdir -p ${TARGET_DIR} -cp -r ./tb/shinTest ${TARGET_DIR}/ -mkdir -p ${TARGET_DIR}/generated/ -cp -r ./generated/shin ${TARGET_DIR}/generated/ -cp -r ./src/main/resources ${TARGET_DIR}/ -cp ./tb/shinTest/Makefile_vcs ${TARGET_DIR}/Makefile -cp ./tb/shinTest/shinTest_vcs.f ${TARGET_DIR}/ -cp ./tb/shinTest/shinTestClk_vcs.f ${TARGET_DIR}/ -find ./generated/shin -name *.v >> ${TARGET_DIR}/shinTest_vcs.f -find ./generated/shin -name *.v >> ${TARGET_DIR}/shinTestClk_vcs.f -#awk '{gsub(/.\/tb\/build\/wave.vcd/, "./generated/wave.vcd"); print }' ../RISCV-MAC-SWICH/tb/shinTest/ShinTopSpiTb.v > ./shinTest/ShinTopSpiTb.v -awk '{gsub(/tb\/shinTest\/testcase_result/, "./shinTest/testcase_result"); print }' ./tb/shinTest/check_testcase.py > ${TARGET_DIR}/shinTest/check_testcase.py +#!/bin/bash +DEFAULT_TARGET="../ShinRelease" + +TARGET_DIR="${1:-$DEFAULT_TARGET}" + +rm -rf ${TARGET_DIR}/generated/ ${TARGET_DIR}/shinTest/ ${TARGET_DIR}/resources/ +mkdir -p ${TARGET_DIR} +cp -r ./tb/shinTest ${TARGET_DIR}/ +mkdir -p ${TARGET_DIR}/generated/ +cp -r ./generated/shin ${TARGET_DIR}/generated/ +cp -r ./src/main/resources ${TARGET_DIR}/ +cp ./tb/shinTest/Makefile_vcs ${TARGET_DIR}/Makefile +cp ./tb/shinTest/shinTest_vcs.f ${TARGET_DIR}/ +cp ./tb/shinTest/shinTestClk_vcs.f ${TARGET_DIR}/ +find ./generated/shin -name *.v >> ${TARGET_DIR}/shinTest_vcs.f +find ./generated/shin -name *.v >> ${TARGET_DIR}/shinTestClk_vcs.f +#awk '{gsub(/.\/tb\/build\/wave.vcd/, "./generated/wave.vcd"); print }' ../RISCV-MAC-SWICH/tb/shinTest/ShinTopSpiTb.v > ./shinTest/ShinTopSpiTb.v +awk '{gsub(/tb\/shinTest\/testcase_result/, "./shinTest/testcase_result"); print }' ./tb/shinTest/check_testcase.py > ${TARGET_DIR}/shinTest/check_testcase.py #awk '{gsub(/.\/tb\/build\/wave_clk.vcd/, "./generated/wave_clk.vcd"); print }' ../RISCV-MAC-SWICH/tb/shinTest/ShinTopSpiTb_clk.v > ./shinTest/ShinTopSpiTb_clk.v \ No newline at end of file diff --git a/build.sbt b/build.sbt index ba957e5..4b35db9 100644 --- a/build.sbt +++ b/build.sbt @@ -1,61 +1,61 @@ -// See README.md for license details. - -ThisBuild / scalaVersion := "2.13.10" -ThisBuild / version := "0.1.0" -ThisBuild / organization := "%ORGANIZATION%" - -val chiselVersion = "3.5.6" - -lazy val commonSettings = Seq( - // organization := "edu.berkeley.cs", - // version := "1.6", - assembly / assemblyMergeStrategy := { _ match { - case PathList("META-INF", "MANIFEST.MF") => MergeStrategy.discard - case _ => MergeStrategy.first}}, - scalacOptions ++= Seq( - "-deprecation", - "-unchecked", - "-Ymacro-annotations"), // fix hierarchy API -) - -lazy val chiselSettings = Seq( - libraryDependencies ++= Seq("edu.berkeley.cs" %% "chisel3" % chiselVersion, - "org.apache.commons" % "commons-lang3" % "3.12.0", - "org.apache.commons" % "commons-text" % "1.9"), - addCompilerPlugin("edu.berkeley.cs" % "chisel3-plugin" % chiselVersion cross CrossVersion.full)) - -/** - * It has been a struggle for us to override settings in subprojects. - * An example would be adding a dependency to rocketchip on midas's targetutils library, - * or replacing dsptools's maven dependency on chisel with the local chisel project. - * - * This function works around this by specifying the project's root at src/ and overriding - * scalaSource and resourceDirectory. - */ -def freshProject(name: String, dir: File): Project = { - Project(id = name, base = dir / "src") - .settings( - Compile / scalaSource := baseDirectory.value / "main" / "scala", - Compile / resourceDirectory := baseDirectory.value / "main" / "resources" - ) -} - - - -lazy val root = (project in file(".")) - .settings( - name := "%NAME%", - libraryDependencies ++= Seq( - "edu.berkeley.cs" %% "chisel3" % chiselVersion, - "edu.berkeley.cs" %% "chiseltest" % "0.5.4" % "test" - ), - scalacOptions ++= Seq( - "-language:reflectiveCalls", - "-deprecation", - "-feature", - "-Xcheckinit", - "-P:chiselplugin:genBundleElements", - ), - addCompilerPlugin("edu.berkeley.cs" % "chisel3-plugin" % chiselVersion cross CrossVersion.full), - ) - +// See README.md for license details. + +ThisBuild / scalaVersion := "2.13.10" +ThisBuild / version := "0.1.0" +ThisBuild / organization := "%ORGANIZATION%" + +val chiselVersion = "3.5.6" + +lazy val commonSettings = Seq( + // organization := "edu.berkeley.cs", + // version := "1.6", + assembly / assemblyMergeStrategy := { _ match { + case PathList("META-INF", "MANIFEST.MF") => MergeStrategy.discard + case _ => MergeStrategy.first}}, + scalacOptions ++= Seq( + "-deprecation", + "-unchecked", + "-Ymacro-annotations"), // fix hierarchy API +) + +lazy val chiselSettings = Seq( + libraryDependencies ++= Seq("edu.berkeley.cs" %% "chisel3" % chiselVersion, + "org.apache.commons" % "commons-lang3" % "3.12.0", + "org.apache.commons" % "commons-text" % "1.9"), + addCompilerPlugin("edu.berkeley.cs" % "chisel3-plugin" % chiselVersion cross CrossVersion.full)) + +/** + * It has been a struggle for us to override settings in subprojects. + * An example would be adding a dependency to rocketchip on midas's targetutils library, + * or replacing dsptools's maven dependency on chisel with the local chisel project. + * + * This function works around this by specifying the project's root at src/ and overriding + * scalaSource and resourceDirectory. + */ +def freshProject(name: String, dir: File): Project = { + Project(id = name, base = dir / "src") + .settings( + Compile / scalaSource := baseDirectory.value / "main" / "scala", + Compile / resourceDirectory := baseDirectory.value / "main" / "resources" + ) +} + + + +lazy val root = (project in file(".")) + .settings( + name := "%NAME%", + libraryDependencies ++= Seq( + "edu.berkeley.cs" %% "chisel3" % chiselVersion, + "edu.berkeley.cs" %% "chiseltest" % "0.5.4" % "test" + ), + scalacOptions ++= Seq( + "-language:reflectiveCalls", + "-deprecation", + "-feature", + "-Xcheckinit", + "-P:chiselplugin:genBundleElements", + ), + addCompilerPlugin("edu.berkeley.cs" % "chisel3-plugin" % chiselVersion cross CrossVersion.full), + ) + diff --git a/src/main/scala/backBoard/shin/CDRIn.scala b/src/main/scala/backBoard/shin/CDRIn.scala index e2e2598..a7bd175 100644 --- a/src/main/scala/backBoard/shin/CDRIn.scala +++ b/src/main/scala/backBoard/shin/CDRIn.scala @@ -1,384 +1,384 @@ -package BACK - -import chisel3._ -import chisel3.util._ - - - -class CDRInSampleIO extends Bundle{ - val serDat = Input(Bool()) - val syncSerDat = Output(Bool()) -} - - -class CDRInMultiSample(clkNum: Int) extends Module with RequireAsyncReset{ - require( clkNum == 16 || clkNum == 4 ) - val io: CDRInSampleIO = IO(new CDRInSampleIO) - - - //multiCLK 需要按照滞后相位接线,即0为最先到达,1次先 - val multiCLK = IO(Input(Vec(clkNum, Bool()))) - - - val sampleReg = Wire(Vec(clkNum, Bool())) - dontTouch(sampleReg) - - for( i <- 0 until clkNum ) { - sampleReg(i) := withClockAndReset(multiCLK(i).asClock, reset.asAsyncReset){ ShiftRegister( io.serDat, 2, false.B, true.B ) } - } - - val sampleReg_sync = for( i <- 0 until clkNum ) yield { - ShiftRegisters(sampleReg(i), 8, false.B, true.B) - } - for( i <- 0 until clkNum; j <- 0 until 8 ){dontTouch(sampleReg_sync(i)(j))} - - val sampleReg_Align = Wire(Vec(8*clkNum,Bool())) - dontTouch(sampleReg_Align) - - ( 0 until 8 ).map{ gp => - for( i <- gp*clkNum until (gp+1)*clkNum ){ - sampleReg_Align(i) := sampleReg_sync(i - gp*clkNum)(8-1-gp) - } - } - - - val flitReg = - for( i <- 1 until (8*clkNum)-1 ) yield { - (sampleReg_Align(i-1) & sampleReg_Align(i+0)) | - (sampleReg_Align(i-1) & sampleReg_Align(i+1)) | - (sampleReg_Align(i+0) & sampleReg_Align(i+1)) - } - for( i <- 0 until (8*clkNum)-2 ) {dontTouch(flitReg(i))} - - val clearCnt = RegInit(0.U(4.W)) - val checkCnt = RegInit(0.U(4.W)) - val arbCali = RegInit(0.U( (log2Ceil(8*clkNum)).W )) - val isLock = RegInit(false.B) - - when( (7*clkNum until 8*clkNum).map{ i => sampleReg_Align(i)}.reduce(_|_) === false.B ){ - when( clearCnt =/= 10.U ){ - clearCnt := clearCnt + 1.U - } - } .otherwise{ - clearCnt := 0.U - } - - when( ~isLock ){ - checkCnt := 0.U - } .otherwise{ - checkCnt := checkCnt + 1.U - } - - //优先级电路,优先选择跳变的后一相进行操作,电路上需要做成可调的 - val checkWindow = Wire( Vec(6, Bool()) ) - dontTouch(checkWindow) - - val lastPhase = 8*clkNum -2 - clkNum/2 - - checkWindow(0) := - Mux1H( (0 until lastPhase-2).map{ i => - (arbCali === (i+2).U) -> flitReg(i) - }) - - checkWindow(1) := - Mux1H( (1 until lastPhase-1).map{ i => - (arbCali === (i+1).U) -> flitReg(i) - }) - - checkWindow(2) := - Mux1H( (2 until lastPhase).map{ i => - (arbCali === i.U) -> flitReg(i) - }) - - checkWindow(3) := - Mux1H( (3 until lastPhase+1).map{ i => - (arbCali === (i-1).U) -> flitReg(i) - }) - - checkWindow(4) := - Mux1H( (4 until lastPhase+2).map{ i => - (arbCali === (i-2).U) -> flitReg(i) - }) - - checkWindow(5) := ( - if( clkNum == 16 ){ - Mux1H( (5 until lastPhase+3).map{ i => - (arbCali === (i-3).U) -> flitReg(i) - }) - } else{ - false.B - } - ) - - - - when( ~isLock ){ - for( i <- 0 until clkNum ){ - val j = ((8/2)*clkNum-clkNum/2)+clkNum - i - 1 - when( flitReg(j) ^ flitReg(j+1) ){ - arbCali := j.U - } - } - }.elsewhen( checkCnt.andR ){ //锁定之后,只允许每16cycle移动一相位 - assert( arbCali >= 2.U && arbCali < lastPhase.U ) - - when( - (if( clkNum == 16 ) { (checkWindow(0) ^ checkWindow(1)) } else {false.B}) | - (checkWindow(1) ^ checkWindow(2)) - ){ - when( arbCali =/= 2.U ){ - arbCali := arbCali - 1.U - } - } .elsewhen( - (checkWindow(3) ^ checkWindow(4)) | - (if( clkNum == 16 ) { (checkWindow(4) ^ checkWindow(5)) } else {false.B}) - ){ - when( arbCali =/= (lastPhase-1).U ){ - arbCali := arbCali + 1.U - } - } - } - - when( ~isLock ){ - for( i <- 0 until clkNum ){ - val j = ((8/2)*clkNum-clkNum/2)+clkNum - i - 1 - when( flitReg(j) ^ flitReg(j+1) ){ - isLock := true.B - } - } - } .elsewhen( clearCnt === 10.U ){ - isLock := false.B - } - - - val asyncSerDat = - Mux1H( - (for { i <- 2 until lastPhase } yield { - (arbCali === i.U) -> flitReg(i+(clkNum/2)) - }) - ) - - - io.syncSerDat := asyncSerDat - -} - -class CDRInAxisIO extends Bundle{ - val axis = Decoupled(new AXIS_Bundle(8)) - val decode = Flipped(new Decode_Bundle) - val syncSerDat = Input(Bool()) - - val flush = Input(Bool()) -} - -class CDRInAxis extends Module with RequireAsyncReset{ - val io: CDRInAxisIO = IO(new CDRInAxisIO) - - io.decode.dataIn := 0.U - def HeaderByte: Int = 4 - - val ETH_PRE = "h68".U(8.W) - val ETH_SFD = "h25".U(8.W) - - val STATE_IDLE = 0.U - val STATE_HEADER = 1.U - val STATE_PAYLOAD = 2.U - - val stateNext = Wire(UInt(2.W)) - val stateCurr = RegNext( stateNext, STATE_IDLE ) - - val bitCnt = RegInit(0.U(4.W)) - val byteCnt = RegInit(0.U((12+1).W)) - - val checkSFD = RegInit( 0.U(10.W) ) - - when( io.flush ){ - checkSFD := 0.U - } .otherwise{ - checkSFD := Cat( checkSFD(8,0), io.syncSerDat ) - } - - io.decode.dataIn := checkSFD(9,0) - val shiftData = io.decode.dataOut - val shiftData10Next = ShiftRegister( shiftData, 10, 0.U(8.W), true.B ) - - val payloadLen = RegInit(0.U(12.W)) - - when( io.flush ){ - payloadLen := 0.U - } .elsewhen( byteCnt === 0.U & bitCnt === 9.U & stateCurr === STATE_HEADER ){ - payloadLen := Cat( shiftData, 0.U(4.W) ) - } .elsewhen( byteCnt === 1.U & bitCnt === 9.U & stateCurr === STATE_HEADER ){ - payloadLen := Cat( payloadLen(11,4), shiftData(7,4) ) - } - - stateNext := - Mux( io.flush, STATE_IDLE, - Mux1H(Seq( - (stateCurr === STATE_IDLE) -> ( Mux( shiftData10Next === ETH_PRE && shiftData === ETH_SFD , STATE_HEADER, STATE_IDLE )), //IDLE - (stateCurr === STATE_HEADER) -> ( Mux( (byteCnt === (HeaderByte-1).U) & (bitCnt === 9.U), STATE_PAYLOAD, STATE_HEADER ) ), - (stateCurr === STATE_PAYLOAD) -> ( Mux( (byteCnt === (payloadLen + (4 - 1).U) ) & (bitCnt === 9.U), STATE_IDLE, STATE_PAYLOAD )), // PAYLOAD - )) //crc - ) - - - - - - when( stateCurr === STATE_IDLE & ( shiftData10Next === ETH_PRE && shiftData === ETH_SFD ) ){ //first align - bitCnt := 0.U - } .otherwise{ - when( bitCnt === 9.U ){ - bitCnt := 0.U - } .otherwise{ - bitCnt := bitCnt + 1.U - } - } - - when( io.flush ){ - byteCnt := 0.U - } .elsewhen( stateCurr === STATE_IDLE & ( shiftData10Next === ETH_PRE && shiftData === ETH_SFD ) ){ //first align - byteCnt := 0.U - } .elsewhen( bitCnt === 9.U ){ - when( stateCurr === STATE_HEADER ){ - byteCnt := Mux( byteCnt =/= (HeaderByte-1).U, byteCnt + 1.U, 0.U ) - assert( byteCnt <= (HeaderByte-1).U ) - } .elsewhen( stateCurr === STATE_PAYLOAD ){ - byteCnt := Mux( byteCnt =/= (payloadLen+ (4-1).U), byteCnt + 1.U, 0.U ) - assert( byteCnt <= ( payloadLen+ (4-1).U ) ) - } - } - - - - - - val axis_valid = RegInit(false.B) - val axis_tdata = RegEnable( shiftData, 0.U(8.W), bitCnt === 9.U & ( stateCurr === STATE_HEADER | stateCurr === STATE_PAYLOAD ) ) - val axis_tuser = false.B - val axis_tlast = RegInit( false.B ) - - - - io.axis.valid := axis_valid - io.axis.bits.tdata := axis_tdata - io.axis.bits.tuser := axis_tuser - io.axis.bits.tlast := axis_tlast - - when( io.flush ){ - axis_valid := false.B - } .elsewhen( io.axis.fire ){ - axis_valid := false.B - } .elsewhen( bitCnt === 9.U & ( stateCurr === STATE_HEADER | stateCurr === STATE_PAYLOAD ) ){ - axis_valid := true.B - } - - when( io.flush ){ - axis_tlast := false.B - } .otherwise{ - axis_tlast := (stateCurr === STATE_PAYLOAD & stateNext === STATE_IDLE) - } - -} - - -class CDRInOriSample extends Module with RequireAsyncReset{ - val io: CDRInSampleIO = IO(new CDRInSampleIO) - val clkNum: Int = 16 - require( clkNum == 16 ) - - //multiCLK 需要按照滞后相位接线,即0为最先到达,1次先 - val multiCLK = IO(Input(Vec(clkNum, Bool()))) - - - - val sampleReg = Wire(Vec(clkNum, Bool())) - - for( i <- 0 until clkNum ) { - sampleReg(i) := withClockAndReset(multiCLK(i).asClock, reset.asAsyncReset){ ShiftRegister( io.serDat, 2, false.B, true.B ) } - } - - val sampleReg_sync = Wire(Vec(2*clkNum,Bool())) - - - - for( i <- 0 until clkNum ){ - sampleReg_sync(i) := ShiftRegister(sampleReg(i), 2, false.B, true.B) - } - - for( i <- clkNum until 2*clkNum ){ - sampleReg_sync(i) := ShiftRegister(sampleReg(i-clkNum), 1, false.B, true.B) - } - - val flitReg = - for( i <- 1 until (2*clkNum)-1 ) yield { - (sampleReg_sync(i-1) & sampleReg_sync(i+0)) | - (sampleReg_sync(i-1) & sampleReg_sync(i+1)) | - (sampleReg_sync(i+0) & sampleReg_sync(i+1)) - } - - val clearCnt = RegInit(0.U(4.W)) - val checkCnt = RegInit(0.U(4.W)) - val arbLock = RegInit(0.U( (log2Ceil(2*clkNum)).W )) - val arbCali = RegInit(0.U( (log2Ceil(2*clkNum)).W )) - val isLock = RegInit(false.B) - - when( sampleReg_sync.reduce(_|_) === false.B ){ - when( clearCnt =/= 10.U ){ - clearCnt := clearCnt + 1.U - } - } .otherwise{ - clearCnt := 0.U - } - - when( ~isLock ){ - checkCnt := 0.U - } .otherwise{ - checkCnt := checkCnt + 1.U - } - - //优先级电路,优先选择跳变的后一相进行操作,电路上需要做成可调的 - - when( ~isLock ){ - for( i <- 3 until 19 ){ - val j = 19 - i - 1 - when( flitReg(j) ^ flitReg(j+1) ){ - arbLock := j.U - arbCali := j.U - } - } - }.elsewhen( checkCnt.andR ){ //锁定之后,只允许每16cycle移动一相位 - for( i <- 0 until 22 ){ - val j = 22 - i -1 - when( flitReg(j) ^ flitReg(j+1) ){ - when( (j.U < arbCali) && ((j+3).U >= arbLock) ){ - arbCali := arbCali - 1.U - } .elsewhen( (j.U > arbCali) && (j.U <= arbLock + 3.U) ){ - arbCali := arbCali + 1.U - } - } - } - } - - when( ~isLock ){ - for( i <- 3 until 19 ){ - val j = 19 - i - 1 - when( flitReg(j) ^ flitReg(j+1) ){ - isLock := true.B - } - } - } .elsewhen( clearCnt === 10.U ){ - isLock := false.B - } - - - val asyncSerDat = - Mux1H( - (for { i <- 0 until 22 } yield { - (arbCali === i.U) -> flitReg(i+(8)) - }) - ) - - - io.syncSerDat := asyncSerDat -} +package BACK + +import chisel3._ +import chisel3.util._ + + + +class CDRInSampleIO extends Bundle{ + val serDat = Input(Bool()) + val syncSerDat = Output(Bool()) +} + + +class CDRInMultiSample(clkNum: Int) extends Module with RequireAsyncReset{ + require( clkNum == 16 || clkNum == 4 ) + val io: CDRInSampleIO = IO(new CDRInSampleIO) + + + //multiCLK 需要按照滞后相位接线,即0为最先到达,1次先 + val multiCLK = IO(Input(Vec(clkNum, Bool()))) + + + val sampleReg = Wire(Vec(clkNum, Bool())) + dontTouch(sampleReg) + + for( i <- 0 until clkNum ) { + sampleReg(i) := withClockAndReset(multiCLK(i).asClock, reset.asAsyncReset){ ShiftRegister( io.serDat, 2, false.B, true.B ) } + } + + val sampleReg_sync = for( i <- 0 until clkNum ) yield { + ShiftRegisters(sampleReg(i), 8, false.B, true.B) + } + for( i <- 0 until clkNum; j <- 0 until 8 ){dontTouch(sampleReg_sync(i)(j))} + + val sampleReg_Align = Wire(Vec(8*clkNum,Bool())) + dontTouch(sampleReg_Align) + + ( 0 until 8 ).map{ gp => + for( i <- gp*clkNum until (gp+1)*clkNum ){ + sampleReg_Align(i) := sampleReg_sync(i - gp*clkNum)(8-1-gp) + } + } + + + val flitReg = + for( i <- 1 until (8*clkNum)-1 ) yield { + (sampleReg_Align(i-1) & sampleReg_Align(i+0)) | + (sampleReg_Align(i-1) & sampleReg_Align(i+1)) | + (sampleReg_Align(i+0) & sampleReg_Align(i+1)) + } + for( i <- 0 until (8*clkNum)-2 ) {dontTouch(flitReg(i))} + + val clearCnt = RegInit(0.U(4.W)) + val checkCnt = RegInit(0.U(4.W)) + val arbCali = RegInit(0.U( (log2Ceil(8*clkNum)).W )) + val isLock = RegInit(false.B) + + when( (7*clkNum until 8*clkNum).map{ i => sampleReg_Align(i)}.reduce(_|_) === false.B ){ + when( clearCnt =/= 10.U ){ + clearCnt := clearCnt + 1.U + } + } .otherwise{ + clearCnt := 0.U + } + + when( ~isLock ){ + checkCnt := 0.U + } .otherwise{ + checkCnt := checkCnt + 1.U + } + + //优先级电路,优先选择跳变的后一相进行操作,电路上需要做成可调的 + val checkWindow = Wire( Vec(6, Bool()) ) + dontTouch(checkWindow) + + val lastPhase = 8*clkNum -2 - clkNum/2 + + checkWindow(0) := + Mux1H( (0 until lastPhase-2).map{ i => + (arbCali === (i+2).U) -> flitReg(i) + }) + + checkWindow(1) := + Mux1H( (1 until lastPhase-1).map{ i => + (arbCali === (i+1).U) -> flitReg(i) + }) + + checkWindow(2) := + Mux1H( (2 until lastPhase).map{ i => + (arbCali === i.U) -> flitReg(i) + }) + + checkWindow(3) := + Mux1H( (3 until lastPhase+1).map{ i => + (arbCali === (i-1).U) -> flitReg(i) + }) + + checkWindow(4) := + Mux1H( (4 until lastPhase+2).map{ i => + (arbCali === (i-2).U) -> flitReg(i) + }) + + checkWindow(5) := ( + if( clkNum == 16 ){ + Mux1H( (5 until lastPhase+3).map{ i => + (arbCali === (i-3).U) -> flitReg(i) + }) + } else{ + false.B + } + ) + + + + when( ~isLock ){ + for( i <- 0 until clkNum ){ + val j = ((8/2)*clkNum-clkNum/2)+clkNum - i - 1 + when( flitReg(j) ^ flitReg(j+1) ){ + arbCali := j.U + } + } + }.elsewhen( checkCnt.andR ){ //锁定之后,只允许每16cycle移动一相位 + assert( arbCali >= 2.U && arbCali < lastPhase.U ) + + when( + (if( clkNum == 16 ) { (checkWindow(0) ^ checkWindow(1)) } else {false.B}) | + (checkWindow(1) ^ checkWindow(2)) + ){ + when( arbCali =/= 2.U ){ + arbCali := arbCali - 1.U + } + } .elsewhen( + (checkWindow(3) ^ checkWindow(4)) | + (if( clkNum == 16 ) { (checkWindow(4) ^ checkWindow(5)) } else {false.B}) + ){ + when( arbCali =/= (lastPhase-1).U ){ + arbCali := arbCali + 1.U + } + } + } + + when( ~isLock ){ + for( i <- 0 until clkNum ){ + val j = ((8/2)*clkNum-clkNum/2)+clkNum - i - 1 + when( flitReg(j) ^ flitReg(j+1) ){ + isLock := true.B + } + } + } .elsewhen( clearCnt === 10.U ){ + isLock := false.B + } + + + val asyncSerDat = + Mux1H( + (for { i <- 2 until lastPhase } yield { + (arbCali === i.U) -> flitReg(i+(clkNum/2)) + }) + ) + + + io.syncSerDat := asyncSerDat + +} + +class CDRInAxisIO extends Bundle{ + val axis = Decoupled(new AXIS_Bundle(8)) + val decode = Flipped(new Decode_Bundle) + val syncSerDat = Input(Bool()) + + val flush = Input(Bool()) +} + +class CDRInAxis extends Module with RequireAsyncReset{ + val io: CDRInAxisIO = IO(new CDRInAxisIO) + + io.decode.dataIn := 0.U + def HeaderByte: Int = 4 + + val ETH_PRE = "h68".U(8.W) + val ETH_SFD = "h25".U(8.W) + + val STATE_IDLE = 0.U + val STATE_HEADER = 1.U + val STATE_PAYLOAD = 2.U + + val stateNext = Wire(UInt(2.W)) + val stateCurr = RegNext( stateNext, STATE_IDLE ) + + val bitCnt = RegInit(0.U(4.W)) + val byteCnt = RegInit(0.U((12+1).W)) + + val checkSFD = RegInit( 0.U(10.W) ) + + when( io.flush ){ + checkSFD := 0.U + } .otherwise{ + checkSFD := Cat( checkSFD(8,0), io.syncSerDat ) + } + + io.decode.dataIn := checkSFD(9,0) + val shiftData = io.decode.dataOut + val shiftData10Next = ShiftRegister( shiftData, 10, 0.U(8.W), true.B ) + + val payloadLen = RegInit(0.U(12.W)) + + when( io.flush ){ + payloadLen := 0.U + } .elsewhen( byteCnt === 0.U & bitCnt === 9.U & stateCurr === STATE_HEADER ){ + payloadLen := Cat( shiftData, 0.U(4.W) ) + } .elsewhen( byteCnt === 1.U & bitCnt === 9.U & stateCurr === STATE_HEADER ){ + payloadLen := Cat( payloadLen(11,4), shiftData(7,4) ) + } + + stateNext := + Mux( io.flush, STATE_IDLE, + Mux1H(Seq( + (stateCurr === STATE_IDLE) -> ( Mux( shiftData10Next === ETH_PRE && shiftData === ETH_SFD , STATE_HEADER, STATE_IDLE )), //IDLE + (stateCurr === STATE_HEADER) -> ( Mux( (byteCnt === (HeaderByte-1).U) & (bitCnt === 9.U), STATE_PAYLOAD, STATE_HEADER ) ), + (stateCurr === STATE_PAYLOAD) -> ( Mux( (byteCnt === (payloadLen + (4 - 1).U) ) & (bitCnt === 9.U), STATE_IDLE, STATE_PAYLOAD )), // PAYLOAD + )) //crc + ) + + + + + + when( stateCurr === STATE_IDLE & ( shiftData10Next === ETH_PRE && shiftData === ETH_SFD ) ){ //first align + bitCnt := 0.U + } .otherwise{ + when( bitCnt === 9.U ){ + bitCnt := 0.U + } .otherwise{ + bitCnt := bitCnt + 1.U + } + } + + when( io.flush ){ + byteCnt := 0.U + } .elsewhen( stateCurr === STATE_IDLE & ( shiftData10Next === ETH_PRE && shiftData === ETH_SFD ) ){ //first align + byteCnt := 0.U + } .elsewhen( bitCnt === 9.U ){ + when( stateCurr === STATE_HEADER ){ + byteCnt := Mux( byteCnt =/= (HeaderByte-1).U, byteCnt + 1.U, 0.U ) + assert( byteCnt <= (HeaderByte-1).U ) + } .elsewhen( stateCurr === STATE_PAYLOAD ){ + byteCnt := Mux( byteCnt =/= (payloadLen+ (4-1).U), byteCnt + 1.U, 0.U ) + assert( byteCnt <= ( payloadLen+ (4-1).U ) ) + } + } + + + + + + val axis_valid = RegInit(false.B) + val axis_tdata = RegEnable( shiftData, 0.U(8.W), bitCnt === 9.U & ( stateCurr === STATE_HEADER | stateCurr === STATE_PAYLOAD ) ) + val axis_tuser = false.B + val axis_tlast = RegInit( false.B ) + + + + io.axis.valid := axis_valid + io.axis.bits.tdata := axis_tdata + io.axis.bits.tuser := axis_tuser + io.axis.bits.tlast := axis_tlast + + when( io.flush ){ + axis_valid := false.B + } .elsewhen( io.axis.fire ){ + axis_valid := false.B + } .elsewhen( bitCnt === 9.U & ( stateCurr === STATE_HEADER | stateCurr === STATE_PAYLOAD ) ){ + axis_valid := true.B + } + + when( io.flush ){ + axis_tlast := false.B + } .otherwise{ + axis_tlast := (stateCurr === STATE_PAYLOAD & stateNext === STATE_IDLE) + } + +} + + +class CDRInOriSample extends Module with RequireAsyncReset{ + val io: CDRInSampleIO = IO(new CDRInSampleIO) + val clkNum: Int = 16 + require( clkNum == 16 ) + + //multiCLK 需要按照滞后相位接线,即0为最先到达,1次先 + val multiCLK = IO(Input(Vec(clkNum, Bool()))) + + + + val sampleReg = Wire(Vec(clkNum, Bool())) + + for( i <- 0 until clkNum ) { + sampleReg(i) := withClockAndReset(multiCLK(i).asClock, reset.asAsyncReset){ ShiftRegister( io.serDat, 2, false.B, true.B ) } + } + + val sampleReg_sync = Wire(Vec(2*clkNum,Bool())) + + + + for( i <- 0 until clkNum ){ + sampleReg_sync(i) := ShiftRegister(sampleReg(i), 2, false.B, true.B) + } + + for( i <- clkNum until 2*clkNum ){ + sampleReg_sync(i) := ShiftRegister(sampleReg(i-clkNum), 1, false.B, true.B) + } + + val flitReg = + for( i <- 1 until (2*clkNum)-1 ) yield { + (sampleReg_sync(i-1) & sampleReg_sync(i+0)) | + (sampleReg_sync(i-1) & sampleReg_sync(i+1)) | + (sampleReg_sync(i+0) & sampleReg_sync(i+1)) + } + + val clearCnt = RegInit(0.U(4.W)) + val checkCnt = RegInit(0.U(4.W)) + val arbLock = RegInit(0.U( (log2Ceil(2*clkNum)).W )) + val arbCali = RegInit(0.U( (log2Ceil(2*clkNum)).W )) + val isLock = RegInit(false.B) + + when( sampleReg_sync.reduce(_|_) === false.B ){ + when( clearCnt =/= 10.U ){ + clearCnt := clearCnt + 1.U + } + } .otherwise{ + clearCnt := 0.U + } + + when( ~isLock ){ + checkCnt := 0.U + } .otherwise{ + checkCnt := checkCnt + 1.U + } + + //优先级电路,优先选择跳变的后一相进行操作,电路上需要做成可调的 + + when( ~isLock ){ + for( i <- 3 until 19 ){ + val j = 19 - i - 1 + when( flitReg(j) ^ flitReg(j+1) ){ + arbLock := j.U + arbCali := j.U + } + } + }.elsewhen( checkCnt.andR ){ //锁定之后,只允许每16cycle移动一相位 + for( i <- 0 until 22 ){ + val j = 22 - i -1 + when( flitReg(j) ^ flitReg(j+1) ){ + when( (j.U < arbCali) && ((j+3).U >= arbLock) ){ + arbCali := arbCali - 1.U + } .elsewhen( (j.U > arbCali) && (j.U <= arbLock + 3.U) ){ + arbCali := arbCali + 1.U + } + } + } + } + + when( ~isLock ){ + for( i <- 3 until 19 ){ + val j = 19 - i - 1 + when( flitReg(j) ^ flitReg(j+1) ){ + isLock := true.B + } + } + } .elsewhen( clearCnt === 10.U ){ + isLock := false.B + } + + + val asyncSerDat = + Mux1H( + (for { i <- 0 until 22 } yield { + (arbCali === i.U) -> flitReg(i+(8)) + }) + ) + + + io.syncSerDat := asyncSerDat +} diff --git a/src/main/scala/backBoard/shin/CDROut.scala b/src/main/scala/backBoard/shin/CDROut.scala index afdf05a..6fd4ccd 100644 --- a/src/main/scala/backBoard/shin/CDROut.scala +++ b/src/main/scala/backBoard/shin/CDROut.scala @@ -1,117 +1,117 @@ -package BACK - -import chisel3._ -import chisel3.util._ - -class AXIS_Bundle(dw: Int) extends Bundle{ - val tdata = UInt(dw.W) - val tlast = Bool() - val tuser = Bool() -} - - - - -//work in 100MHZ -class CDROutIO extends Bundle{ - val axis = Flipped(Decoupled(new AXIS_Bundle(8))) - val encode = Flipped(new Encode_Bundle) - val serDat = Output(Bool()) - - - val flush = Input(Bool()) - - - -} - - -class CDROut extends Module with RequireAsyncReset{ - val io: CDROutIO = IO(new CDROutIO) - def PRE_NUM = 3 //PRE_NUM should >= 3 - - - def STATE_IDLE = 0.U - def STATE_PREAMBLE = 1.U - def STATE_PAYLOAD = 2.U - - val ETH_PRE = "h68".U(8.W) - val ETH_SFD = "h25".U(8.W) - - val stateNext = Wire(UInt(2.W)) - val stateCurr = RegNext( stateNext, 0.U ) - - - val bitCnt = RegInit(0.U(4.W)) - val byteCnt = RegInit(0.U(3.W)) //payload dont need to count - - val shiftData = RegInit(0.U(10.W)) - io.encode.isEnable := false.B //组合逻辑 - io.encode.dataIn := 0.U //组合逻辑 - - stateNext := - Mux( io.flush, STATE_IDLE, - Mux1H(Seq( - (stateCurr === STATE_IDLE) -> ( Mux( io.axis.valid, STATE_PREAMBLE, STATE_IDLE )), - (stateCurr === STATE_PREAMBLE) -> ( Mux( (byteCnt === (PRE_NUM-1).U) & (bitCnt === 9.U), Mux( io.axis.valid, STATE_PAYLOAD, STATE_IDLE), STATE_PREAMBLE )), - (stateCurr === STATE_PAYLOAD) -> ( Mux( (io.axis.fire & io.axis.bits.tlast) | (~io.axis.valid & io.axis.ready), STATE_IDLE, STATE_PAYLOAD ) ), - )) - ) - io.serDat := shiftData.extract(9) - io.axis.ready := - bitCnt === 9.U & ( - (stateCurr === STATE_PREAMBLE & byteCnt === (PRE_NUM-1).U) | - (stateCurr === STATE_PAYLOAD) - ) - - // assert( ~(~io.axis.valid & io.axis.ready) ) - when( ~io.axis.valid & io.axis.ready ){ - printf( "Error, CDROut axis overflow!\n" ) - } - - - when( io.flush ){ - shiftData := 0.U - } .elsewhen( stateCurr === STATE_IDLE & stateNext === STATE_PREAMBLE){ //PRE - shiftData := io.encode.dataOut - io.encode.dataIn := ETH_PRE //组合逻辑 - io.encode.isEnable := true.B //组合逻辑 - } .otherwise{ - when( bitCnt =/= 9.U ){ - shiftData := shiftData << 1 - } .otherwise{ //bitCnt === 9.U - when( stateCurr === STATE_PREAMBLE ){ - shiftData := io.encode.dataOut - io.encode.dataIn := MuxCase( ETH_PRE, Array( - ( byteCnt === (PRE_NUM-2).U ) -> ETH_SFD, - ( byteCnt === (PRE_NUM-1).U ) -> io.axis.bits.tdata, - )) //组合逻辑 - io.encode.isEnable := true.B //组合逻辑 - } .elsewhen( stateCurr === STATE_PAYLOAD ){ - io.encode.dataIn := io.axis.bits.tdata //组合逻辑 - shiftData := io.encode.dataOut - io.encode.isEnable := true.B //组合逻辑 - } - } - } - - - when( stateCurr === STATE_IDLE ){ //PRE - bitCnt := 0.U - } .otherwise{ - when( bitCnt === 9.U ){ - bitCnt := 0.U - } .otherwise{ - bitCnt := bitCnt + 1.U - } - } - - when( (stateCurr === STATE_IDLE) | (stateCurr === STATE_PAYLOAD) ){ - byteCnt := 0.U - } .elsewhen( bitCnt === 9.U ){ - byteCnt := byteCnt + 1.U - } - - -} - +package BACK + +import chisel3._ +import chisel3.util._ + +class AXIS_Bundle(dw: Int) extends Bundle{ + val tdata = UInt(dw.W) + val tlast = Bool() + val tuser = Bool() +} + + + + +//work in 100MHZ +class CDROutIO extends Bundle{ + val axis = Flipped(Decoupled(new AXIS_Bundle(8))) + val encode = Flipped(new Encode_Bundle) + val serDat = Output(Bool()) + + + val flush = Input(Bool()) + + + +} + + +class CDROut extends Module with RequireAsyncReset{ + val io: CDROutIO = IO(new CDROutIO) + def PRE_NUM = 3 //PRE_NUM should >= 3 + + + def STATE_IDLE = 0.U + def STATE_PREAMBLE = 1.U + def STATE_PAYLOAD = 2.U + + val ETH_PRE = "h68".U(8.W) + val ETH_SFD = "h25".U(8.W) + + val stateNext = Wire(UInt(2.W)) + val stateCurr = RegNext( stateNext, 0.U ) + + + val bitCnt = RegInit(0.U(4.W)) + val byteCnt = RegInit(0.U(3.W)) //payload dont need to count + + val shiftData = RegInit(0.U(10.W)) + io.encode.isEnable := false.B //组合逻辑 + io.encode.dataIn := 0.U //组合逻辑 + + stateNext := + Mux( io.flush, STATE_IDLE, + Mux1H(Seq( + (stateCurr === STATE_IDLE) -> ( Mux( io.axis.valid, STATE_PREAMBLE, STATE_IDLE )), + (stateCurr === STATE_PREAMBLE) -> ( Mux( (byteCnt === (PRE_NUM-1).U) & (bitCnt === 9.U), Mux( io.axis.valid, STATE_PAYLOAD, STATE_IDLE), STATE_PREAMBLE )), + (stateCurr === STATE_PAYLOAD) -> ( Mux( (io.axis.fire & io.axis.bits.tlast) | (~io.axis.valid & io.axis.ready), STATE_IDLE, STATE_PAYLOAD ) ), + )) + ) + io.serDat := shiftData.extract(9) + io.axis.ready := + bitCnt === 9.U & ( + (stateCurr === STATE_PREAMBLE & byteCnt === (PRE_NUM-1).U) | + (stateCurr === STATE_PAYLOAD) + ) + + // assert( ~(~io.axis.valid & io.axis.ready) ) + when( ~io.axis.valid & io.axis.ready ){ + printf( "Error, CDROut axis overflow!\n" ) + } + + + when( io.flush ){ + shiftData := 0.U + } .elsewhen( stateCurr === STATE_IDLE & stateNext === STATE_PREAMBLE){ //PRE + shiftData := io.encode.dataOut + io.encode.dataIn := ETH_PRE //组合逻辑 + io.encode.isEnable := true.B //组合逻辑 + } .otherwise{ + when( bitCnt =/= 9.U ){ + shiftData := shiftData << 1 + } .otherwise{ //bitCnt === 9.U + when( stateCurr === STATE_PREAMBLE ){ + shiftData := io.encode.dataOut + io.encode.dataIn := MuxCase( ETH_PRE, Array( + ( byteCnt === (PRE_NUM-2).U ) -> ETH_SFD, + ( byteCnt === (PRE_NUM-1).U ) -> io.axis.bits.tdata, + )) //组合逻辑 + io.encode.isEnable := true.B //组合逻辑 + } .elsewhen( stateCurr === STATE_PAYLOAD ){ + io.encode.dataIn := io.axis.bits.tdata //组合逻辑 + shiftData := io.encode.dataOut + io.encode.isEnable := true.B //组合逻辑 + } + } + } + + + when( stateCurr === STATE_IDLE ){ //PRE + bitCnt := 0.U + } .otherwise{ + when( bitCnt === 9.U ){ + bitCnt := 0.U + } .otherwise{ + bitCnt := bitCnt + 1.U + } + } + + when( (stateCurr === STATE_IDLE) | (stateCurr === STATE_PAYLOAD) ){ + byteCnt := 0.U + } .elsewhen( bitCnt === 9.U ){ + byteCnt := byteCnt + 1.U + } + + +} + diff --git a/src/main/scala/backBoard/shin/Encryptor.scala b/src/main/scala/backBoard/shin/Encryptor.scala index b3babf6..b51c736 100644 --- a/src/main/scala/backBoard/shin/Encryptor.scala +++ b/src/main/scala/backBoard/shin/Encryptor.scala @@ -1,33 +1,33 @@ -package BACK - -import chisel3._ -import chisel3.util._ - - -class Encryptor_IO_Bundle extends Bundle{ - val init = Flipped(Valid(UInt(128.W))) - - val op = Decoupled(UInt(8.W)) -} - -class Encryptor extends Module{ - val io: Encryptor_IO_Bundle = IO(new Encryptor_IO_Bundle) - - val encryptReg = RegInit(0.U(128.W)) - - when( io.init.valid ){ - encryptReg := io.init.bits - } .elsewhen( io.op.fire ){ - encryptReg := Cat(encryptReg(119,0), io.op.bits) - } - - val opValid = RegInit(false.B) - when( io.init.fire ){ - opValid := true.B - } - - io.op.valid := opValid - io.op.bits := encryptReg(127, 120) - -} - +package BACK + +import chisel3._ +import chisel3.util._ + + +class Encryptor_IO_Bundle extends Bundle{ + val init = Flipped(Valid(UInt(128.W))) + + val op = Decoupled(UInt(8.W)) +} + +class Encryptor extends Module{ + val io: Encryptor_IO_Bundle = IO(new Encryptor_IO_Bundle) + + val encryptReg = RegInit(0.U(128.W)) + + when( io.init.valid ){ + encryptReg := io.init.bits + } .elsewhen( io.op.fire ){ + encryptReg := Cat(encryptReg(119,0), io.op.bits) + } + + val opValid = RegInit(false.B) + when( io.init.fire ){ + opValid := true.B + } + + io.op.valid := opValid + io.op.bits := encryptReg(127, 120) + +} + diff --git a/src/main/scala/backBoard/shin/Interface.scala b/src/main/scala/backBoard/shin/Interface.scala index 0501038..abd863f 100644 --- a/src/main/scala/backBoard/shin/Interface.scala +++ b/src/main/scala/backBoard/shin/Interface.scala @@ -1,1460 +1,1460 @@ -package BACK - -import chisel3._ -import chisel3.util._ - - - - -class Stat_IO_Bundle extends Bundle{ - val isHeaderError = Bool() - val isSubHeaderError = Bool() - val isPayloadError = Bool() - val isSubTailError = Bool() - val isCRCError = Bool() - val isFinish = Bool() - val isRecByteAck = Bool() - - def isRecError = isHeaderError | isSubHeaderError | isPayloadError | isSubTailError | isCRCError -} - - - -class EBMMU_Bundle extends Bundle{ - val lAddr = UInt(30.W) - val pAddr = UInt(16.W) - val length = UInt(16.W) - val op = UInt(8.W) - val isEnable = Bool() - - def EBMMU_OP_RD = op === 1.U - def EBMMU_OP_WR = op === 2.U - def EBMMU_OP_RW = op === 3.U -} - -class CommonRegisterBundle extends Bundle{ - val mstOrSlv = UInt(2.W) - def modeSel:Bool = mstOrSlv === "h1".U - - val hwVersion = UInt(8.W) - val hwSerial = UInt(48.W) - val busRate = UInt(8.W) - - val spiSel = UInt(2.W) - - val uniCode = UInt(64.W) - - val pllCtrl = UInt(32.W) - val xtal = UInt(16.W) - val anamuxSel = UInt(5.W) - val ldo2p5 = UInt(8.W) - val ldo1p1 = UInt(8.W) - val refTop = UInt(3.W) - val bias = UInt(2.W) - val div4 = UInt(4.W) - - val dwupEx = Bool() - val b8b4Sel = Bool() - val cdrParam = UInt(8.W) - - - val softResetCode = Vec(4, UInt(8.W)) - - val intEnable = UInt(32.W) - val intStatus = UInt(32.W) - val intMode = UInt(16.W) - - - - val statDownRecErrorCnt = UInt(32.W) - val statDownRecHeaderErrorCnt = UInt(16.W) - val statDownRecSubHeaderErrorCnt = UInt(16.W) - val statDownRecPayloadErrorCnt = UInt(16.W) - val statDownRecSubTailErrorCnt = UInt(16.W) - val statDownRecCRCErrorCnt = UInt(16.W) - val statDownRecFinishCnt = UInt(32.W) - val statDownRecByteCnt = UInt(64.W) - - val statUpRecErrorCnt = UInt(32.W) - val statUpRecHeaderErrorCnt = UInt(16.W) - val statUpRecSubHeaderErrorCnt = UInt(16.W) - val statUpRecPayloadErrorCnt = UInt(16.W) - val statUpRecSubTailErrorCnt = UInt(16.W) - val statUpRecCRCErrorCnt = UInt(16.W) - val statUpRecFinishCnt = UInt(32.W) - val statUpRecByteCnt = UInt(64.W) - - - - - val wdtStatus = UInt(32.W) - val wdtEnable = UInt(32.W) - val wdtTarCnt = Vec( 18, UInt(32.W) ) - - val timeStamp = UInt(64.W) - val mstDeltaTime = UInt(32.W) - val syncCfg = UInt(8.W) - val syncWidth = Vec(4, UInt(16.W) ) - val syncOffset = Vec(4, UInt(32.W)) - val syncPoint = UInt(64.W) - val syncPeroid = UInt(32.W) - val recoTimeStamp = UInt(64.W) //时钟补偿寄存器 - - val custom = Vec( 128, UInt(8.W) ) - - val smUsedDepth = Vec(8, UInt(8.W)) - val smTrigLen = Vec(8, UInt(11.W)) //触发SM切换缓冲区的地址 (或读或写) - - val event = new Bundle{ - val latchCtl = Vec(2, UInt(4.W)) - val latchStatus = Vec(2, UInt(4.W)) - val posedgeTimeStampLatch = Vec(2, UInt(64.W)) - val negedgeTimeStampLatch = Vec(2, UInt(64.W)) - val mcuSMTimeStampEnq = UInt(64.W) - val mcuSMTimeStampDeq = UInt(64.W) - val lvdsSMTimeStampEnq = UInt(64.W) - val lvdsSMTimeStampDeq = UInt(64.W) - } -} - -class MasterRegisterBundle extends Bundle{ - val txSM = UInt(2.W) - val rxSM = UInt(2.W) - - val isRecCRCErr = UInt(4.W) - val rplTimeStampTx = UInt(16.W) - val timeStampOffset = UInt(64.W) -} - - -class SlaveRegisterBundle extends Bundle{ - val ebmmu = Vec(16, new EBMMU_Bundle) - - val localDevIndex = UInt(16.W) - - //链路寄存器组 - - val isDevOnRight = UInt(2.W) - val isDevOnRightModify = Bool() - val indexOfRightDev = UInt(14.W) - - - val slvDeltaTime = UInt(32.W) //从站时间戳差值 - val deltaFinal = UInt(64.W) //当前时间戳与主站时间差 - - val lvdsWriteAble = UInt(16.W) - def isLVDSWriteAble = lvdsWriteAble(15,8) === "h58".U & lvdsWriteAble.extract(0) - - -} - - - -class InterfaceIO extends Bundle{ - val ospi = new SSPIInterfaceIO - val oqspi = new QSPIInterfaceIO - val iqspi = new QSPIInterfaceIO - val aqspi = new QSPIInterfaceIO - - val lvds = Flipped(new RegAccessInterfaceIO) - - val txReq = Valid(new Bundle{ - val txSM = UInt(2.W) - val rxSM = UInt(2.W) - }) //发送请求和SM代号 - - - val dSMdeq = Output( Vec(4, Bool()) ) - val uSMenq = Output( Vec(4, Bool()) ) - - val lvdsSMEnq = Input(Vec(4, Bool())) - val lvdsSMDeq = Input(Vec(4, Bool())) - - val sram_w = Flipped(Vec( 4, new SRAM2kWRIO)) //QSPI - val sram_r = Flipped(Vec( 4, new SRAM2kRDIO)) //QSPI - - val cReg = Output(new CommonRegisterBundle) - val mReg = Output(new MasterRegisterBundle) - val sReg = Output(new SlaveRegisterBundle) - - val localDevIndex = Input(UInt(16.W)) - - val isDevOnRight = Input(UInt(2.W)) - val isDevOnRightModify = Input(Bool()) - val indexOfRightDev = Input(UInt(14.W)) - - - - val slvDeltaTime = Input(UInt(32.W)) //从站时间戳差值 - val mstDeltaTime = Input(UInt(32.W)) - val deltaFinal = Input(UInt(64.W)) - - val sync = Output(Vec(4, Bool())) - - - val isSoftReset = Output(Bool()) - val intMstTrig = Input(Vec(2, Bool())) - val intHWTrig = Input(Vec(2, Bool())) - val intHWClr = Output(Vec(2, Bool())) - val intSlvTrig = Input(Vec(8, Bool())) - val intTransEnd = Input(Vec(4,Bool())) - - val interrupt = Output(Bool()) - - val wdtTrigger = Input(Vec(18, Bool())) - - val downRecStat = Input(new Stat_IO_Bundle) - val upRecStat = Input(new Stat_IO_Bundle) - - val smUsedDepth = Input( Vec(8, UInt(8.W)) ) - val isSMReset = Output( Vec(8, Bool()) ) - - val latchPin = Input(Vec(2, Bool())) - val isPoReset = Output(Bool()) - - val hwSerial = Input(UInt(48.W)) - val uniCode = Input(UInt(64.W)) - val isPllCfg = Output(Bool()) -} - - -abstract class InterfaceBase extends Module with RequireAsyncReset{ - val io: InterfaceIO = IO(new InterfaceIO) - - val oSpi = Module(new SSpiInterface) - val oQSpi = Module(new QSpiInterface(true)) - val iQSpi = Module(new QSpiInterface(false)) - val aQSpi = Module(new SyncQSpiInterface) - - io.ospi <> oSpi.spi - io.oqspi <> oQSpi.qspi - io.iqspi <> iQSpi.qspi - io.aqspi <> aQSpi.qspi - - val cReg = Wire(new CommonRegisterBundle); io.cReg := cReg - val mReg = Wire(new MasterRegisterBundle); io.mReg := mReg - val sReg = Wire(new SlaveRegisterBundle); io.sReg := sReg - - - - - - - val isSysInit = cReg.mstOrSlv =/= 0.U - val isMstMode = cReg.mstOrSlv === "h1".U - val isSlvMode = cReg.mstOrSlv === "h2".U - - def AcquireReg(addr: UInt): UInt = { - Mux1H( - Seq( - (addr === "h0".U) -> cReg.mstOrSlv, - (addr === "h1".U) -> cReg.hwVersion, - ) ++ - - ((0 until 6).map{ i => - (addr === ("h2".U(16.W) + i.U) ) -> cReg.hwSerial( 8*i+7,8*i+0 ) - }) ++ - - ((0 until 8).map{ i => - (addr === ("h10".U(16.W) + i.U) ) -> cReg.uniCode( 8*i+7,8*i+0 ) - }) ++ - - Seq( - (addr === "h8".U ) -> cReg.busRate( 7,0 ), - (addr === "h9".U ) -> cReg.spiSel, - (addr === "ha".U & isSlvMode) -> sReg.localDevIndex(7,0), - (addr === "hb".U & isSlvMode) -> sReg.localDevIndex(15,8), - ) ++ - - Seq( - (addr === "h18".U ) -> sReg.lvdsWriteAble.extract(0), - (addr === "h20".U & isMstMode) -> Cat(mReg.rxSM, mReg.txSM, 0.U(1.W) ), - (addr === "h22".U & isMstMode) -> mReg.isRecCRCErr, - (addr === "h24".U & isMstMode) -> mReg.rplTimeStampTx(7,0), - (addr === "h25".U & isMstMode) -> mReg.rplTimeStampTx(15,8), - ) ++ - - Seq( - (addr === "h40".U ) -> cReg.softResetCode(1), - (addr === "h41".U ) -> cReg.softResetCode(1), - (addr === "h42".U ) -> cReg.softResetCode(2), - (addr === "h43".U ) -> cReg.softResetCode(3), - ) ++ - - ((0 until 4).map{ i => - (addr === ("h44".U(16.W) + i.U) ) -> cReg.pllCtrl( 8*i+7,8*i+0 ) - }) ++ - - ((0 until 2).map{ i => - (addr === ("h48".U(16.W) + i.U) ) -> cReg.xtal( 8*i+7,8*i+0 ) - }) ++ - - Seq( - (addr === "h4a".U ) -> cReg.dwupEx, - (addr === "h4c".U ) -> cReg.b8b4Sel, - (addr === "h4e".U ) -> cReg.cdrParam, - - (addr === "h50".U ) -> cReg.anamuxSel, - (addr === "h51".U ) -> cReg.ldo2p5, - (addr === "h52".U ) -> cReg.ldo1p1, - (addr === "h53".U ) -> cReg.refTop, - (addr === "h54".U ) -> cReg.bias, - (addr === "h55".U ) -> cReg.div4, - - (addr === "h70".U ) -> cReg.intEnable(7,0), - (addr === "h71".U ) -> cReg.intEnable(15,8), - (addr === "h72".U ) -> cReg.intEnable(23,16), - (addr === "h73".U ) -> cReg.intEnable(31,24), - - (addr === "h74".U ) -> cReg.intStatus(7,0), - (addr === "h75".U ) -> cReg.intStatus(15,8), - (addr === "h76".U ) -> cReg.intStatus(23,16), - (addr === "h77".U ) -> cReg.intStatus(31,24), - - (addr === "h7c".U ) -> cReg.intMode(7,0), - (addr === "h7d".U ) -> cReg.intMode(15,8), - - - (addr === "h80".U ) -> cReg.statDownRecErrorCnt(7,0), - (addr === "h81".U ) -> cReg.statDownRecErrorCnt(15,8), - (addr === "h82".U ) -> cReg.statDownRecHeaderErrorCnt(7,0), - (addr === "h83".U ) -> cReg.statDownRecHeaderErrorCnt(15,8), - (addr === "h84".U ) -> cReg.statDownRecSubHeaderErrorCnt(7,0), - (addr === "h85".U ) -> cReg.statDownRecSubHeaderErrorCnt(15,8), - (addr === "h86".U ) -> cReg.statDownRecPayloadErrorCnt(7,0), - (addr === "h87".U ) -> cReg.statDownRecPayloadErrorCnt(15,8), - (addr === "h88".U ) -> cReg.statDownRecSubTailErrorCnt(7,0), - (addr === "h89".U ) -> cReg.statDownRecSubTailErrorCnt(15,8), - (addr === "h8a".U ) -> cReg.statDownRecCRCErrorCnt(7,0), - (addr === "h8b".U ) -> cReg.statDownRecCRCErrorCnt(15,8), - (addr === "h8c".U ) -> cReg.statDownRecFinishCnt(7,0), - (addr === "h8d".U ) -> cReg.statDownRecFinishCnt(15,8), - (addr === "h8e".U ) -> cReg.statDownRecFinishCnt(23,16), - (addr === "h8f".U ) -> cReg.statDownRecFinishCnt(31,24), - (addr === "h90".U ) -> cReg.statDownRecByteCnt(7,0), - (addr === "h91".U ) -> cReg.statDownRecByteCnt(15,8), - (addr === "h92".U ) -> cReg.statDownRecByteCnt(23,16), - (addr === "h93".U ) -> cReg.statDownRecByteCnt(31,24), - (addr === "h94".U ) -> cReg.statDownRecByteCnt(39,32), - (addr === "h95".U ) -> cReg.statDownRecByteCnt(47,40), - (addr === "h96".U ) -> cReg.statDownRecByteCnt(55,48), - (addr === "h97".U ) -> cReg.statDownRecByteCnt(63,56), - - - (addr === "ha0".U ) -> cReg.statUpRecErrorCnt(7,0), - (addr === "ha1".U ) -> cReg.statUpRecErrorCnt(15,8), - (addr === "ha2".U ) -> cReg.statUpRecHeaderErrorCnt(7,0), - (addr === "ha3".U ) -> cReg.statUpRecHeaderErrorCnt(15,8), - (addr === "ha4".U ) -> cReg.statUpRecSubHeaderErrorCnt(7,0), - (addr === "ha5".U ) -> cReg.statUpRecSubHeaderErrorCnt(15,8), - (addr === "ha6".U ) -> cReg.statUpRecPayloadErrorCnt(7,0), - (addr === "ha7".U ) -> cReg.statUpRecPayloadErrorCnt(15,8), - (addr === "ha8".U ) -> cReg.statUpRecSubTailErrorCnt(7,0), - (addr === "ha9".U ) -> cReg.statUpRecSubTailErrorCnt(15,8), - (addr === "haa".U ) -> cReg.statUpRecCRCErrorCnt(7,0), - (addr === "hab".U ) -> cReg.statUpRecCRCErrorCnt(15,8), - (addr === "hac".U ) -> cReg.statUpRecFinishCnt(7,0), - (addr === "had".U ) -> cReg.statUpRecFinishCnt(15,8), - (addr === "hae".U ) -> cReg.statUpRecFinishCnt(23,16), - (addr === "haf".U ) -> cReg.statUpRecFinishCnt(31,24), - (addr === "hb0".U ) -> cReg.statUpRecByteCnt(7,0), - (addr === "hb1".U ) -> cReg.statUpRecByteCnt(15,8), - (addr === "hb2".U ) -> cReg.statUpRecByteCnt(23,16), - (addr === "hb3".U ) -> cReg.statUpRecByteCnt(31,24), - (addr === "hb4".U ) -> cReg.statUpRecByteCnt(39,32), - (addr === "hb5".U ) -> cReg.statUpRecByteCnt(47,40), - (addr === "hb6".U ) -> cReg.statUpRecByteCnt(55,48), - (addr === "hb7".U ) -> cReg.statUpRecByteCnt(63,56), - - (addr === "hc0".U ) -> Cat( sReg.isDevOnRightModify, sReg.isDevOnRight, 0.U(3.W) ), - (addr === "hc2".U ) -> sReg.indexOfRightDev(7,0), - (addr === "hc3".U ) -> sReg.indexOfRightDev(13,8), - ) ++ - - Seq( - //本地时钟 - (addr === "h100".U ) -> cReg.timeStamp(7,0), - (addr === "h101".U ) -> RegEnable(cReg.timeStamp(15,8), 0.U(8.W), isEnR & (addrr === "h100".U)), - (addr === "h102".U ) -> RegEnable(cReg.timeStamp(23,16), 0.U(8.W), isEnR & (addrr === "h100".U)), - (addr === "h103".U ) -> RegEnable(cReg.timeStamp(31,24), 0.U(8.W), isEnR & (addrr === "h100".U)), - (addr === "h104".U ) -> RegEnable(cReg.timeStamp(39,32), 0.U(8.W), isEnR & (addrr === "h100".U)), - (addr === "h105".U ) -> RegEnable(cReg.timeStamp(47,40), 0.U(8.W), isEnR & (addrr === "h100".U)), - (addr === "h106".U ) -> RegEnable(cReg.timeStamp(55,48), 0.U(8.W), isEnR & (addrr === "h100".U)), - (addr === "h107".U ) -> RegEnable(cReg.timeStamp(63,56), 0.U(8.W), isEnR & (addrr === "h100".U)), - - //参考主站时钟 - (addr === "h108".U & isSlvMode) -> sReg.deltaFinal(7,0), - (addr === "h109".U & isSlvMode) -> sReg.deltaFinal(15,8), - (addr === "h10a".U & isSlvMode) -> sReg.deltaFinal(23,16), - (addr === "h10b".U & isSlvMode) -> sReg.deltaFinal(31,24), - (addr === "h10c".U & isSlvMode) -> sReg.deltaFinal(39,32), - (addr === "h10d".U & isSlvMode) -> sReg.deltaFinal(47,40), - (addr === "h10e".U & isSlvMode) -> sReg.deltaFinal(55,48), - (addr === "h10f".U & isSlvMode) -> sReg.deltaFinal(63,56), - - //主站发送接收时间差 - (addr === "h110".U ) -> cReg.mstDeltaTime(7,0), - (addr === "h111".U ) -> cReg.mstDeltaTime(15,8), - (addr === "h112".U ) -> cReg.mstDeltaTime(23,16), - (addr === "h113".U ) -> cReg.mstDeltaTime(31,24), - - //从站发送接收时间差 - (addr === "h114".U & isSlvMode) -> sReg.slvDeltaTime(7,0), - (addr === "h115".U & isSlvMode) -> sReg.slvDeltaTime(15,8), - (addr === "h116".U & isSlvMode) -> sReg.slvDeltaTime(23,16), - (addr === "h117".U & isSlvMode) -> sReg.slvDeltaTime(31,24), - - //校准后的时钟 - (addr === "h118".U ) -> cReg.recoTimeStamp(7,0), - (addr === "h119".U ) -> RegEnable(cReg.recoTimeStamp(15,8), 0.U(8.W), isEnR & (addrr === "h118".U)), - (addr === "h11a".U ) -> RegEnable(cReg.recoTimeStamp(23,16), 0.U(8.W), isEnR & (addrr === "h118".U)), - (addr === "h11b".U ) -> RegEnable(cReg.recoTimeStamp(31,24), 0.U(8.W), isEnR & (addrr === "h118".U)), - (addr === "h11c".U ) -> RegEnable(cReg.recoTimeStamp(39,32), 0.U(8.W), isEnR & (addrr === "h118".U)), - (addr === "h11d".U ) -> RegEnable(cReg.recoTimeStamp(47,40), 0.U(8.W), isEnR & (addrr === "h118".U)), - (addr === "h11e".U ) -> RegEnable(cReg.recoTimeStamp(55,48), 0.U(8.W), isEnR & (addrr === "h118".U)), - (addr === "h11f".U ) -> RegEnable(cReg.recoTimeStamp(63,56), 0.U(8.W), isEnR & (addrr === "h118".U)), - - (addr === "h120".U ) -> cReg.syncCfg, - - (addr === "h122".U ) -> cReg.syncWidth(0)(7,0), - (addr === "h123".U ) -> cReg.syncWidth(0)(15,8), - - (addr === "h124".U ) -> cReg.syncWidth(1)(7,0), - (addr === "h125".U ) -> cReg.syncWidth(1)(15,8), - - (addr === "h126".U ) -> cReg.syncWidth(2)(7,0), - (addr === "h127".U ) -> cReg.syncWidth(2)(15,8), - - (addr === "h128".U ) -> cReg.syncWidth(3)(7,0), - (addr === "h129".U ) -> cReg.syncWidth(3)(15,8), - - (addr === "h130".U ) -> cReg.syncPoint(7,0), - (addr === "h131".U ) -> cReg.syncPoint(15,8), - (addr === "h132".U ) -> cReg.syncPoint(23,16), - (addr === "h133".U ) -> cReg.syncPoint(31,24), - (addr === "h134".U ) -> cReg.syncPoint(39,32), - (addr === "h135".U ) -> cReg.syncPoint(47,40), - (addr === "h136".U ) -> cReg.syncPoint(55,48), - (addr === "h137".U ) -> cReg.syncPoint(63,56), - - (addr === "h138".U ) -> cReg.syncPeroid(7,0), - (addr === "h139".U ) -> cReg.syncPeroid(15,8), - (addr === "h13a".U ) -> cReg.syncPeroid(23,16), - (addr === "h13b".U ) -> cReg.syncPeroid(31,24), - - (addr === "h13c".U ) -> cReg.syncOffset(1)(7,0), - (addr === "h13d".U ) -> cReg.syncOffset(1)(15,8), - (addr === "h13e".U ) -> cReg.syncOffset(1)(23,16), - (addr === "h13f".U ) -> cReg.syncOffset(1)(31,24), - - (addr === "h140".U ) -> cReg.syncOffset(2)(7,0), - (addr === "h141".U ) -> cReg.syncOffset(2)(15,8), - (addr === "h142".U ) -> cReg.syncOffset(2)(23,16), - (addr === "h143".U ) -> cReg.syncOffset(2)(31,24), - - (addr === "h144".U ) -> cReg.syncOffset(3)(7,0), - (addr === "h145".U ) -> cReg.syncOffset(3)(15,8), - (addr === "h146".U ) -> cReg.syncOffset(3)(23,16), - (addr === "h147".U ) -> cReg.syncOffset(3)(31,24), - - (addr === "h148".U ) -> mReg.timeStampOffset(7,0), - (addr === "h149".U ) -> mReg.timeStampOffset(15,8), - (addr === "h14a".U ) -> mReg.timeStampOffset(23,16), - (addr === "h14b".U ) -> mReg.timeStampOffset(31,24), - (addr === "h14c".U ) -> mReg.timeStampOffset(39,32), - (addr === "h14d".U ) -> mReg.timeStampOffset(47,40), - (addr === "h14e".U ) -> mReg.timeStampOffset(55,48), - (addr === "h14f".U ) -> mReg.timeStampOffset(63,56), - - ) ++ - ( 0 until 128 ).map{ i => - ( addr === ("h180".U(16.W) + i.U ) ) -> cReg.custom(i) - } ++ - ( 0 until 16 ).map{ i => Seq( - ( ( addr === ( "h200".U(16.W) + (10*i).U) ) & isSlvMode ) -> sReg.ebmmu(i).lAddr( 7, 0), - ( ( addr === ( "h201".U(16.W) + (10*i).U) ) & isSlvMode ) -> sReg.ebmmu(i).lAddr(15, 8), - ( ( addr === ( "h202".U(16.W) + (10*i).U) ) & isSlvMode ) -> sReg.ebmmu(i).lAddr(23,16), - ( ( addr === ( "h203".U(16.W) + (10*i).U) ) & isSlvMode ) -> sReg.ebmmu(i).lAddr(29,24), - - ( ( addr === ( "h204".U(16.W) + (10*i).U) ) & isSlvMode ) -> sReg.ebmmu(i).pAddr( 7, 0), - ( ( addr === ( "h205".U(16.W) + (10*i).U) ) & isSlvMode ) -> sReg.ebmmu(i).pAddr(15, 8), - - ( ( addr === ( "h206".U(16.W) + (10*i).U) ) & isSlvMode ) -> sReg.ebmmu(i).length( 7, 0), - ( ( addr === ( "h207".U(16.W) + (10*i).U) ) & isSlvMode ) -> sReg.ebmmu(i).length(15, 8), - - ( ( addr === ( "h208".U(16.W) + (10*i).U) ) & isSlvMode ) -> sReg.ebmmu(i).op, - ( ( addr === ( "h209".U(16.W) + (10*i).U) ) & isSlvMode ) -> sReg.ebmmu(i).isEnable, - )}.reduce(_++_) ++ - ( 0 until 8 ).map{ i => - ( addr === ("h301".U(16.W) + (i*4).U) ) -> cReg.smUsedDepth(i) - } ++ - ( 0 until 8 ).map{ i => - ( addr === ("h302".U(16.W) + (i*4).U) ) -> cReg.smTrigLen(i)(7,0) - } ++ - ( 0 until 8 ).map{ i => - ( addr === ("h303".U(16.W) + (i*4).U) ) -> cReg.smTrigLen(i)(10,8) - } ++ - - ( 0 until 4 ).map{ i => - ( addr === ("h400".U(16.W) + i.U) ) -> cReg.wdtStatus( 8*i+7, 8*i+0 ) - } ++ - ( 0 until 4 ).map{ i => - ( addr === ("h404".U(16.W) + i.U) ) -> cReg.wdtEnable( 8*i+7, 8*i+0 ) - } ++ - (for( i <- 0 until 17; j <- 0 until 4 ) yield { - ( addr === ("h408".U(16.W) + (4*i+j).U) ) -> cReg.wdtTarCnt(i)( 8*j+7, 8*j+0 ) - }) ++ - Seq( - (addr === "h500".U ) -> cReg.event.latchCtl(0), - (addr === "h502".U ) -> cReg.event.latchCtl(1), - (addr === "h504".U ) -> cReg.event.latchStatus(0), - (addr === "h506".U ) -> cReg.event.latchStatus(1), - ) ++ - ( 0 until 8 ).map{ i => - ( addr === ("h508".U(16.W) + i.U) ) -> cReg.event.posedgeTimeStampLatch(0)( 8*i+7, 8*i+0 ) - } ++ - ( 0 until 8 ).map{ i => - ( addr === ("h510".U(16.W) + i.U) ) -> cReg.event.negedgeTimeStampLatch(0)( 8*i+7, 8*i+0 ) - } ++ - ( 0 until 8 ).map{ i => - ( addr === ("h518".U(16.W) + i.U) ) -> cReg.event.posedgeTimeStampLatch(1)( 8*i+7, 8*i+0 ) - } ++ - ( 0 until 8 ).map{ i => - ( addr === ("h520".U(16.W) + i.U) ) -> cReg.event.negedgeTimeStampLatch(1)( 8*i+7, 8*i+0 ) - } ++ - ( 0 until 8 ).map{ i => - ( addr === ("h528".U(16.W) + i.U) ) -> cReg.event.mcuSMTimeStampEnq( 8*i+7, 8*i+0 ) - } ++ - ( 0 until 8 ).map{ i => - ( addr === ("h530".U(16.W) + i.U) ) -> cReg.event.mcuSMTimeStampDeq( 8*i+7, 8*i+0 ) - } ++ - ( 0 until 8 ).map{ i => - ( addr === ("h538".U(16.W) + i.U) ) -> cReg.event.lvdsSMTimeStampEnq( 8*i+7, 8*i+0 ) - } ++ - ( 0 until 8 ).map{ i => - ( addr === ("h540".U(16.W) + i.U) ) -> cReg.event.lvdsSMTimeStampDeq( 8*i+7, 8*i+0 ) - } ++ - Seq() - - ) - - - } - - - - //spi信号 - val addrr = Wire(UInt(16.W)) - val addrw = Wire(UInt(16.W)) - val dataw = Wire( UInt(8.W) ) - val datar = Wire( UInt(8.W) ) - val isEnW = Wire(Bool()) - val isEnR = Wire(Bool()) - - -} - -trait InterfaceMCUop{ this: InterfaceBase => - - isEnW := Mux1H(Seq( - ( cReg.spiSel === 0.U ) -> iQSpi.io.isEnW, - ( cReg.spiSel === 1.U ) -> oSpi.io.isEnW, - ( cReg.spiSel === 2.U ) -> oQSpi.io.isEnW, - ( cReg.spiSel === 3.U ) -> aQSpi.io.isEnW, - )) - - addrr := Mux1H(Seq( - ( cReg.spiSel === 0.U ) -> iQSpi.io.addrr, - ( cReg.spiSel === 1.U ) -> oSpi.io.addrr, - ( cReg.spiSel === 2.U ) -> oQSpi.io.addrr, - ( cReg.spiSel === 3.U ) -> aQSpi.io.addrr, - )) - - addrw := Mux1H(Seq( - ( cReg.spiSel === 0.U ) -> iQSpi.io.addrw, - ( cReg.spiSel === 1.U ) -> oSpi.io.addrw, - ( cReg.spiSel === 2.U ) -> oQSpi.io.addrw, - ( cReg.spiSel === 3.U ) -> aQSpi.io.addrw, - )) - - dataw := Mux1H(Seq( - ( cReg.spiSel === 0.U ) -> iQSpi.io.dataw, - ( cReg.spiSel === 1.U ) -> oSpi.io.dataw, - ( cReg.spiSel === 2.U ) -> oQSpi.io.dataw, - ( cReg.spiSel === 3.U ) -> aQSpi.io.dataw, - )) - - isEnR := Mux1H(Seq( - ( cReg.spiSel === 0.U ) -> iQSpi.io.isEnR, - ( cReg.spiSel === 1.U ) -> oSpi.io.isEnR, - ( cReg.spiSel === 2.U ) -> oQSpi.io.isEnR, - ( cReg.spiSel === 3.U ) -> aQSpi.io.isEnR, - )) - - datar := MuxCase( 0.U, Array( - ((addrr & "hF800".U) === "h0000".U) -> RegEnable( AcquireReg(addr = addrr), 0.U(8.W), isEnR ), - ((addrr & "hF800".U) === "h0800".U) -> io.sram_r(0).datar, - ((addrr & "hF800".U) === "h1000".U) -> 0.U, - ((addrr & "hF800".U) === "h1800".U) -> io.sram_r(1).datar, - ((addrr & "hF800".U) === "h2000".U) -> 0.U, - ((addrr & "hF800".U) === "h2800".U) -> io.sram_r(2).datar, - ((addrr & "hF800".U) === "h3000".U) -> 0.U, - ((addrr & "hF800".U) === "h3800".U) -> io.sram_r(3).datar, - ((addrr & "hF800".U) === "h4000".U) -> 0.U, - )) - - iQSpi.io.datar := Mux(cReg.spiSel === 0.U, datar, 0.U) - oSpi.io.datar := Mux(cReg.spiSel === 1.U, datar, 0.U) - oQSpi.io.datar := Mux(cReg.spiSel === 2.U, datar, 0.U) - aQSpi.io.datar := Mux(cReg.spiSel === 3.U, datar, 0.U) - - // when( isEnW ){ - // printf(s"SPI/QSPI Write 0x%x, @0x%x\n", dataw, addrw) - // } - // when( isEnR ){ - // printf(s"SPI/QSPI Readout 0x%x, @0x%x\n", datar, addrr) - // } - - - - cReg.mstOrSlv := RegEnable( dataw(1,0), 0.U(2.W), isEnW & addrw === "h0".U ) - - - cReg.busRate := RegEnable( dataw, "h55".U(8.W), isEnW & addrw === "h8".U ) - cReg.spiSel := RegEnable( dataw(1,0), 1.U(2.W), isEnW & addrw === "h9".U ) - - mReg.txSM := RegEnable( dataw(2,1), 0.U(2.W), isEnW & addrw === "h20".U ) - mReg.rxSM := RegEnable( dataw(4,3), 0.U(2.W), isEnW & addrw === "h20".U ) - - val mReg_isRecCRCErr = RegInit(0.U(4.W)) - mReg.isRecCRCErr := mReg_isRecCRCErr - when( isEnW & addrw === "h22".U(16.W) ){ - mReg_isRecCRCErr := 0.U - } .elsewhen( io.upRecStat.isCRCError & isMstMode ){ - mReg_isRecCRCErr := mReg_isRecCRCErr | (1.U << mReg.rxSM) - } - - - - ( 0 until 128 ).map{ i => - cReg.custom(i) := RegEnable( dataw, 0.U(8.W), isEnW & (addrw === ("h180".U(16.W) + i.U)) ) - } - - val rplTimeStampTx = RegInit(0.U(16.W)) - - mReg.rplTimeStampTx := rplTimeStampTx - - when( io.intMstTrig(0) ){ - rplTimeStampTx := rplTimeStampTx & "h3FFF".U(16.W) - } .elsewhen( isEnW & addrw === "h25".U ){ - rplTimeStampTx := Cat( dataw, rplTimeStampTx(7,0) ) - } .elsewhen( isEnW & addrw === "h24".U ){ - rplTimeStampTx := Cat(rplTimeStampTx(15,8), dataw ) - } - -} - -trait InterfaceCheckSM{ this: InterfaceBase => - val isEnW: Bool - val addrw: UInt - val dataw: UInt - val isEnR: Bool - - - val smTrigLen_H = for( i <- 0 until 8 ) yield { RegInit(0.U(8.W)) } - val smTrigLen_L = for( i <- 0 until 8 ) yield { RegInit(0.U(8.W)) } - - - for( i <- 0 until 8 ){ - io.isSMReset(i) := isEnW & (addrw === ("h300".U(16.W) + (i*4).U)) - - cReg.smUsedDepth(i) := io.smUsedDepth(i) - cReg.smTrigLen(i) := Cat( smTrigLen_H(i), smTrigLen_L(i) ) - - when( cReg.smUsedDepth(i) === 0.U ){ - when( isEnW & addrw === ("h303".U(16.W) + (i*4).U) ){ - smTrigLen_H(i) := dataw - } .elsewhen( io.lvds.isEnW & io.lvds.addrw === ("h303".U(16.W) + (i*4).U)){ - smTrigLen_H(i) := io.lvds.dataw - } - - when( isEnW & addrw === ("h302".U(16.W) + (i*4).U) ){ - smTrigLen_L(i) := dataw - } .elsewhen( io.lvds.isEnW & io.lvds.addrw === ("h302".U(16.W) + (i*4).U)){ - smTrigLen_L(i) := io.lvds.dataw - } - } - } - - - io.sram_r(0).addrr := addrr - io.sram_r(1).addrr := addrr - io.sram_r(2).addrr := addrr - io.sram_r(3).addrr := addrr - - io.sram_r(0).enr := isEnR & (( addrr & "hF800".U ) === "h0800".U) - io.sram_r(1).enr := isEnR & (( addrr & "hF800".U ) === "h1800".U) - io.sram_r(2).enr := isEnR & (( addrr & "hF800".U ) === "h2800".U) - io.sram_r(3).enr := isEnR & (( addrr & "hF800".U ) === "h3800".U) - - io.sram_w(0).addrw := addrw - io.sram_w(1).addrw := addrw - io.sram_w(2).addrw := addrw - io.sram_w(3).addrw := addrw - - io.sram_w(0).dataw := dataw - io.sram_w(1).dataw := dataw - io.sram_w(2).dataw := dataw - io.sram_w(3).dataw := dataw - - io.sram_w(0).enw := isEnW & (( addrw & "hF800".U ) === "h1000".U) - io.sram_w(1).enw := isEnW & (( addrw & "hF800".U ) === "h2000".U) - io.sram_w(2).enw := isEnW & (( addrw & "hF800".U ) === "h3000".U) - io.sram_w(3).enw := isEnW & (( addrw & "hF800".U ) === "h4000".U) - - io.dSMdeq(0) := isEnR & (( addrr & "hF800".U ) === "h0800".U) & (addrr(10,0) === cReg.smTrigLen(0) - 1.U + 1.U) - io.dSMdeq(1) := isEnR & (( addrr & "hF800".U ) === "h1800".U) & (addrr(10,0) === cReg.smTrigLen(2) - 1.U + 1.U) - io.dSMdeq(2) := isEnR & (( addrr & "hF800".U ) === "h2800".U) & (addrr(10,0) === cReg.smTrigLen(4) - 1.U + 1.U) - io.dSMdeq(3) := isEnR & (( addrr & "hF800".U ) === "h3800".U) & (addrr(10,0) === cReg.smTrigLen(6) - 1.U + 1.U) - - io.uSMenq(0) := isEnW & (( addrw & "hF800".U ) === "h1000".U) & (addrw(10,0) === cReg.smTrigLen(1) - 1.U) - io.uSMenq(1) := isEnW & (( addrw & "hF800".U ) === "h2000".U) & (addrw(10,0) === cReg.smTrigLen(3) - 1.U) - io.uSMenq(2) := isEnW & (( addrw & "hF800".U ) === "h3000".U) & (addrw(10,0) === cReg.smTrigLen(5) - 1.U) - io.uSMenq(3) := isEnW & (( addrw & "hF800".U ) === "h4000".U) & (addrw(10,0) === cReg.smTrigLen(7) - 1.U) -} - -trait InterfaceEBMMU{ this: InterfaceBase => - - io.lvds.datar := RegEnable(AcquireReg(addr = io.lvds.addrr), 0.U(8.W), io.lvds.isEnR) - - ( 0 until 16 ).map{ i => - sReg.ebmmu(i).lAddr := Cat( - RegEnable( io.lvds.dataw(5,0), 0.U(8.W), sReg.isLVDSWriteAble & io.lvds.isEnW & isSlvMode & (io.lvds.addrw === ( "h203".U(16.W) + (10*i).U )) ), - RegEnable( io.lvds.dataw, 0.U(8.W), sReg.isLVDSWriteAble & io.lvds.isEnW & isSlvMode & (io.lvds.addrw === ( "h202".U(16.W) + (10*i).U )) ), - RegEnable( io.lvds.dataw, 0.U(8.W), sReg.isLVDSWriteAble & io.lvds.isEnW & isSlvMode & (io.lvds.addrw === ( "h201".U(16.W) + (10*i).U )) ), - RegEnable( io.lvds.dataw, 0.U(8.W), sReg.isLVDSWriteAble & io.lvds.isEnW & isSlvMode & (io.lvds.addrw === ( "h200".U(16.W) + (10*i).U )) ), - ) - - sReg.ebmmu(i).pAddr := Cat( - RegEnable( io.lvds.dataw, 0.U(8.W), sReg.isLVDSWriteAble & io.lvds.isEnW & isSlvMode & (io.lvds.addrw === ( "h205".U(16.W) + (10*i).U )) ), - RegEnable( io.lvds.dataw, 0.U(8.W), sReg.isLVDSWriteAble & io.lvds.isEnW & isSlvMode & (io.lvds.addrw === ( "h204".U(16.W) + (10*i).U )) ), - ) - - sReg.ebmmu(i).length := Cat( - RegEnable( io.lvds.dataw, 0.U(8.W), sReg.isLVDSWriteAble & io.lvds.isEnW & isSlvMode & (io.lvds.addrw === ( "h207".U(16.W) + (10*i).U )) ), - RegEnable( io.lvds.dataw, 0.U(8.W), sReg.isLVDSWriteAble & io.lvds.isEnW & isSlvMode & (io.lvds.addrw === ( "h206".U(16.W) + (10*i).U )) ), - ) - - sReg.ebmmu(i).op := - RegEnable( io.lvds.dataw, 0.U(8.W), sReg.isLVDSWriteAble & io.lvds.isEnW & isSlvMode & (io.lvds.addrw === ( "h208".U(16.W) + (10*i).U )) ) - - sReg.ebmmu(i).isEnable := - RegEnable( io.lvds.dataw.extract(0), false.B, sReg.isLVDSWriteAble & io.lvds.isEnW & isSlvMode & (io.lvds.addrw === ( "h209".U(16.W) + (10*i).U )) ) - } - -} - -trait InterfaceSync{ this: InterfaceBase => - - val syncCfg = RegInit(0.U(8.W)); cReg.syncCfg := syncCfg - - val syncWidth = for( i <- 0 until 4 ) yield { RegInit(0.U(16.W)) } - for( i <- 0 until 4 ) { - cReg.syncWidth(i) := syncWidth(i) - } - - val timeStampOffset = RegInit(0.U(64.W)); mReg.timeStampOffset := timeStampOffset - val timeStampOffset_WRCopy = RegInit(0.U(64.W)) - val syncPoint = RegInit("hFFFFFFFFFFFFFFFF".U(64.W)); cReg.syncPoint := syncPoint - val syncPoint_WRCopy = RegInit("hFFFFFFFFFFFFFFFF".U(64.W)) - val syncPeroid = RegInit(0.U(32.W)); cReg.syncPeroid := syncPeroid - - val syncOffset = for( i <- 0 until 4 ) yield { RegInit(0.U(32.W)) } //空开0 - for( i <- 0 until 4 ) { - cReg.syncOffset(i) := syncOffset(i) - } - - when( isEnW ){ - when( addrw === "h120".U ){ - syncCfg := dataw - } - - for( i <- 0 until 4 ){ - when( addrw === ("h122".U(16.W) + (2*i).U)){ - syncWidth(i) := Cat( syncWidth(i)(15,8), dataw ) - } .elsewhen( addrw === ("h123".U(16.W) + (2*i).U) ){ - syncWidth(i) := Cat( dataw, syncWidth(i)(7,0) ) - } - } - - when( addrw === "h130".U ){ - syncPoint_WRCopy := Cat( syncPoint_WRCopy(63,8), dataw ) - } .elsewhen( addrw === "h131".U ){ - syncPoint_WRCopy := Cat( syncPoint_WRCopy(63,16), dataw, syncPoint_WRCopy(7,0) ) - } .elsewhen( addrw === "h132".U ){ - syncPoint_WRCopy := Cat( syncPoint_WRCopy(63,24), dataw, syncPoint_WRCopy(15,0) ) - } .elsewhen( addrw === "h133".U ){ - syncPoint_WRCopy := Cat( syncPoint_WRCopy(63,32), dataw, syncPoint_WRCopy(23,0) ) - } .elsewhen( addrw === "h134".U ){ - syncPoint_WRCopy := Cat( syncPoint_WRCopy(63,40), dataw, syncPoint_WRCopy(31,0) ) - } .elsewhen( addrw === "h135".U ){ - syncPoint_WRCopy := Cat( syncPoint_WRCopy(63,48), dataw, syncPoint_WRCopy(39,0) ) - } .elsewhen( addrw === "h136".U ){ - syncPoint_WRCopy := Cat( syncPoint_WRCopy(63,56), dataw, syncPoint_WRCopy(47,0) ) - } .elsewhen( addrw === "h137".U ){ - syncPoint_WRCopy := Cat( dataw, syncPoint_WRCopy(55,0) ) - syncPoint := Cat( dataw, syncPoint_WRCopy(55,0) ) - } - - .elsewhen( addrw === "h138".U ){ - syncPeroid := Cat( syncPeroid(31,8), dataw ) - } .elsewhen( addrw === "h139".U ){ - syncPeroid := Cat( syncPeroid(31,16), dataw, syncPeroid(7,0) ) - } .elsewhen( addrw === "h13a".U ){ - syncPeroid := Cat( syncPeroid(31,24), dataw, syncPeroid(15,0) ) - } .elsewhen( addrw === "h13b".U ){ - syncPeroid := Cat( dataw, syncPeroid(23,0) ) - } - - .elsewhen( addrw === "h148".U ){ - timeStampOffset_WRCopy := Cat( timeStampOffset_WRCopy(63,8), dataw ) - } .elsewhen( addrw === "h149".U ){ - timeStampOffset_WRCopy := Cat( timeStampOffset_WRCopy(63,16), dataw, timeStampOffset_WRCopy(7,0) ) - } .elsewhen( addrw === "h14a".U ){ - timeStampOffset_WRCopy := Cat( timeStampOffset_WRCopy(63,24), dataw, timeStampOffset_WRCopy(15,0) ) - } .elsewhen( addrw === "h14b".U ){ - timeStampOffset_WRCopy := Cat( timeStampOffset_WRCopy(63,32), dataw, timeStampOffset_WRCopy(23,0) ) - } .elsewhen( addrw === "h14c".U ){ - timeStampOffset_WRCopy := Cat( timeStampOffset_WRCopy(63,40), dataw, timeStampOffset_WRCopy(31,0) ) - } .elsewhen( addrw === "h14d".U ){ - timeStampOffset_WRCopy := Cat( timeStampOffset_WRCopy(63,48), dataw, timeStampOffset_WRCopy(39,0) ) - } .elsewhen( addrw === "h14e".U ){ - timeStampOffset_WRCopy := Cat( timeStampOffset_WRCopy(63,56), dataw, timeStampOffset_WRCopy(47,0) ) - } .elsewhen( addrw === "h14f".U ){ - timeStampOffset_WRCopy := Cat( dataw, timeStampOffset_WRCopy(55,0) ) - timeStampOffset := Cat( dataw, timeStampOffset_WRCopy(55,0) ) - } - - - for( i <- 1 until 4 ){ - when( addrw === ("h13c".U(16.W) + (4*(i-1)).U) ){ - syncOffset(i) := Cat( syncOffset(i)(31,8), dataw ) - } .elsewhen( addrw === ("h13d".U(16.W) + (4*(i-1)).U) ){ - syncOffset(i) := Cat( syncOffset(i)(31,16), dataw, syncOffset(i)(7,0) ) - } .elsewhen( addrw === ("h13e".U(16.W) + (4*(i-1)).U) ){ - syncOffset(i) := Cat( syncOffset(i)(31,24), dataw, syncOffset(i)(15,0) ) - } .elsewhen( addrw === ("h13f".U(16.W) + (4*(i-1)).U) ){ - syncOffset(i) := Cat( dataw, syncOffset(i)(23,0) ) - } - } - } - - - when( io.lvds.isEnW ){ - - when( sReg.isLVDSWriteAble & io.lvds.addrw === "h120".U ){ - syncCfg := io.lvds.dataw - } - - for( i <- 0 until 4 ){ - when( io.lvds.addrw === ("h122".U(16.W) + (2*i).U)){ - syncWidth(i) := Cat( syncWidth(i)(15,8), io.lvds.dataw ) - } .elsewhen( io.lvds.addrw === ("h123".U(16.W) + (2*i).U) ){ - syncWidth(i) := Cat( io.lvds.dataw, syncWidth(i)(7,0) ) - } - } - - .elsewhen( io.lvds.addrw === "h130".U ){ - syncPoint_WRCopy := Cat( syncPoint_WRCopy(63,8), io.lvds.dataw ) - } .elsewhen( io.lvds.addrw === "h131".U ){ - syncPoint_WRCopy := Cat( syncPoint_WRCopy(63,16), io.lvds.dataw, syncPoint_WRCopy(7,0) ) - } .elsewhen( io.lvds.addrw === "h132".U ){ - syncPoint_WRCopy := Cat( syncPoint_WRCopy(63,24), io.lvds.dataw, syncPoint_WRCopy(15,0) ) - } .elsewhen( io.lvds.addrw === "h133".U ){ - syncPoint_WRCopy := Cat( syncPoint_WRCopy(63,32), io.lvds.dataw, syncPoint_WRCopy(23,0) ) - } .elsewhen( io.lvds.addrw === "h134".U ){ - syncPoint_WRCopy := Cat( syncPoint_WRCopy(63,40), io.lvds.dataw, syncPoint_WRCopy(31,0) ) - } .elsewhen( io.lvds.addrw === "h135".U ){ - syncPoint_WRCopy := Cat( syncPoint_WRCopy(63,48), io.lvds.dataw, syncPoint_WRCopy(39,0) ) - } .elsewhen( io.lvds.addrw === "h136".U ){ - syncPoint_WRCopy := Cat( syncPoint_WRCopy(63,56), io.lvds.dataw, syncPoint_WRCopy(47,0) ) - } .elsewhen( io.lvds.addrw === "h137".U ){ - syncPoint_WRCopy := Cat( io.lvds.dataw, syncPoint_WRCopy(55,0) ) - when( sReg.isLVDSWriteAble ){ - syncPoint := Cat( io.lvds.dataw, syncPoint_WRCopy(55,0) ) - } - } - - .elsewhen( io.lvds.addrw === "h138".U ){ - syncPeroid := Cat( syncPeroid(31,8), io.lvds.dataw ) - } .elsewhen( io.lvds.addrw === "h139".U ){ - syncPeroid := Cat( syncPeroid(31,16), io.lvds.dataw, syncPeroid(7,0) ) - } .elsewhen( io.lvds.addrw === "h13a".U ){ - syncPeroid := Cat( syncPeroid(31,24), io.lvds.dataw, syncPeroid(15,0) ) - } .elsewhen( io.lvds.addrw === "h13b".U ){ - syncPeroid := Cat( io.lvds.dataw, syncPeroid(23,0) ) - } - - for( i <- 1 until 4 ){ - when( io.lvds.addrw === ("h13c".U(16.W) + (4*(i-1)).U) ){ - syncOffset(i) := Cat( syncOffset(i)(31,8), io.lvds.dataw ) - } .elsewhen( io.lvds.addrw === ("h13d".U(16.W) + (4*(i-1)).U) ){ - syncOffset(i) := Cat( syncOffset(i)(31,16), io.lvds.dataw, syncOffset(i)(7,0) ) - } .elsewhen( io.lvds.addrw === ("h13e".U(16.W) + (4*(i-1)).U) ){ - syncOffset(i) := Cat( syncOffset(i)(31,24), io.lvds.dataw, syncOffset(i)(15,0) ) - } .elsewhen( io.lvds.addrw === ("h13f".U(16.W) + (4*(i-1)).U) ){ - syncOffset(i) := Cat( io.lvds.dataw, syncOffset(i)(23,0) ) - } - } - } - - cReg.timeStamp := RegNext( cReg.timeStamp + 1.U, 1.U(64.W) ) - cReg.mstDeltaTime := io.mstDeltaTime - - - sReg.deltaFinal := io.deltaFinal - cReg.recoTimeStamp := - Mux(isMstMode, cReg.timeStamp + mReg.timeStampOffset, - RegNext( cReg.timeStamp + sReg.deltaFinal, 0.U(64.W) ) - ) - sReg.slvDeltaTime := io.slvDeltaTime - - val syncSign = for( i <- 0 until 4 ) yield { RegInit(false.B) } - val syncOffsetCnt = for( i <- 0 until 4 ) yield { RegInit("hFFFFFFFF".U(32.W)) } //空开第0位 - val syncResetCnt = for( i <- 0 until 4 ) yield { RegInit(0.U(16.W)) } //空开第0位 - - val recoTimeStamp_Copy = RegInit(1.U(64.W)) - - - when( - cReg.syncPoint === recoTimeStamp_Copy || - (io.lvds.addrw === "h120".U & io.lvds.isEnW) || //写syncCfg - (io.lvds.addrw === "h137".U & io.lvds.isEnW) || //写syncPoint - (io.lvds.addrw === "h13B".U & io.lvds.isEnW) || //写syncPeroid - (addrw === "h120".U & isEnW) || //写syncCfg - (addrw === "h137".U & isEnW) || //写syncPoint - (addrw === "h13B".U & isEnW) //写syncPeroid - ){ - recoTimeStamp_Copy := cReg.timeStamp + sReg.deltaFinal - } .otherwise{ - recoTimeStamp_Copy := recoTimeStamp_Copy + 1.U - } - - - when( cReg.syncPoint === recoTimeStamp_Copy ){ //时间到达sync0时间点 - syncSign(0) := true.B - } .elsewhen( ~cReg.syncCfg(4+0) & syncResetCnt(0) === cReg.syncWidth(0) ){ - syncSign(0) := false.B - } .elsewhen( cReg.syncCfg(4+0) & isEnW & addrw === "h122".U ){ - syncSign(0) := false.B - } - - when( cReg.syncPoint <= recoTimeStamp_Copy ){ - syncPoint := syncPoint + cReg.syncPeroid - } - - - for( i <- 1 until 4 ) { - - when( cReg.syncPoint === recoTimeStamp_Copy ){ //时间到达sync0时间点 - syncOffsetCnt(i) := 0.U - } .elsewhen( syncOffsetCnt(i) < cReg.syncOffset(i) ){ - syncOffsetCnt(i) := syncOffsetCnt(i) + 1.U - } .elsewhen( syncOffsetCnt(i) === cReg.syncOffset(i) ){ - syncOffsetCnt(i) := "hFFFFFFFF".U(32.W) - } - - when( syncOffsetCnt(i) === cReg.syncOffset(i) ){ - syncSign(i) := true.B - } .elsewhen( ~cReg.syncCfg(4+i) & syncResetCnt(i) === cReg.syncWidth(i) ){ - syncSign(i) := false.B - } .elsewhen( cReg.syncCfg(4+i) & isEnW & addrw === ("h122".U(16.W) + (2*i).U) ){ - syncSign(i) := false.B - } - - } - - for( i <- 0 until 4 ){ - when( ~cReg.syncCfg(4+i) ){ - when( syncSign(i) ){ - syncResetCnt(i) := syncResetCnt(i) + 1.U - } .otherwise{ - syncResetCnt(i) := 0.U - } - } - } - - io.sync(0) := cReg.syncCfg.extract(0) & syncSign(0) - io.sync(1) := cReg.syncCfg.extract(1) & syncSign(1) - io.sync(2) := cReg.syncCfg.extract(2) & syncSign(2) - io.sync(3) := cReg.syncCfg.extract(3) & syncSign(3) - - -} - -trait InterfaceWdt{ this: InterfaceBase => - val wdtStatus = for( i <- 0 until 18 ) yield { RegInit(false.B) } //1+16+1 - cReg.wdtStatus := Cat( wdtStatus.reverse ) - - for( i <- 0 until 8 ){ - when( isEnW & addrw === "h400".U & dataw.extract(i) ){ - wdtStatus(i) := false.B - } .elsewhen(io.wdtTrigger(i) & cReg.wdtEnable.extract(i)){ - wdtStatus(i) := true.B - } - when( isEnW & addrw === "h401".U & dataw.extract(i) ){ - wdtStatus(8+i) := false.B - } .elsewhen(io.wdtTrigger(8+i) & cReg.wdtEnable.extract(8+i)){ - wdtStatus(8+i) := true.B - } - } - for( i <- 0 until 2 ){ - when( isEnW & addrw === "h402".U & dataw.extract(i) ){ - wdtStatus(16+i) := false.B - } .elsewhen(io.wdtTrigger(16+i) & cReg.wdtEnable.extract(16+i)){ - wdtStatus(16+i) := true.B - } - } - - cReg.wdtEnable := - Cat( - RegEnable( dataw(1,0), 0.U(2.W), isEnW & addrw === "h406".U ), - RegEnable( dataw, 0.U(8.W), isEnW & addrw === "h405".U ), - RegEnable( dataw, 0.U(8.W), isEnW & addrw === "h404".U ), - ) - - for( i <- 0 until 18 ){ - cReg.wdtTarCnt(i) := - Cat( - RegEnable( dataw, "hFF".U(8.W), isEnW & addrw === ( "h40b".U (16.W) + (4*i).U ) ), - RegEnable( dataw, "hFF".U(8.W), isEnW & addrw === ( "h40a".U (16.W) + (4*i).U ) ), - RegEnable( dataw, "hFF".U(8.W), isEnW & addrw === ( "h409".U (16.W) + (4*i).U ) ), - RegEnable( dataw, "hFF".U(8.W), isEnW & addrw === ( "h408".U (16.W) + (4*i).U ) ), - ) - } -} - -trait InterfaceSystem{ this: InterfaceBase => - io.isSoftReset := - cReg.softResetCode(0) === "h01".U & - cReg.softResetCode(1) === "h00".U & - cReg.softResetCode(2) === "h66".U & - cReg.softResetCode(3) === "h79".U - - cReg.softResetCode(0) := RegEnable(dataw, 0.U(8.W), isEnW & addrw === "h40".U ) - cReg.softResetCode(1) := RegEnable(dataw, 0.U(8.W), isEnW & addrw === "h41".U ) - cReg.softResetCode(2) := RegEnable(dataw, 0.U(8.W), isEnW & addrw === "h42".U ) - cReg.softResetCode(3) := RegEnable(dataw, 0.U(8.W), isEnW & addrw === "h43".U ) - - - val dwupExTemp = RegEnable(dataw, 0.U(8.W), isEnW & addrw === "h4a".U ) - cReg.dwupEx := RegEnable(dwupExTemp, 0.U(8.W), isEnW & addrw === "h4b".U & dataw === "h58".U ) - - val b8b4SelTemp = RegEnable(dataw, 0.U(8.W), isEnW & addrw === "h4c".U ) - cReg.b8b4Sel := RegEnable(b8b4SelTemp, 0.U(8.W), isEnW & addrw === "h4d".U & dataw === "h59".U ) - - val cdrParamTemp = RegEnable(dataw, 0.U(8.W), isEnW & addrw === "h4e".U ) - cReg.cdrParam := RegEnable(cdrParamTemp, 0.U(8.W), isEnW & addrw === "h4f".U & dataw === "h60".U ) - - val lvdsWriteAble = RegInit(0.U(16.W)); sReg.lvdsWriteAble := lvdsWriteAble - when( io.lvds.isEnW & (io.lvds.addrw === "h19".U(16.W)) ){ - lvdsWriteAble := Cat( io.lvds.dataw, lvdsWriteAble(7,0) ) - } .elsewhen( isEnW & (addrw === "h19".U(16.W)) ){ - lvdsWriteAble := Cat( dataw, lvdsWriteAble(7,0) ) - } .elsewhen( io.lvds.isEnW & (io.lvds.addrw === "h18".U(16.W)) ){ - lvdsWriteAble := Cat( lvdsWriteAble(15,8), io.lvds.dataw ) - } .elsewhen( isEnW & (addrw === "h18".U(16.W)) ){ - lvdsWriteAble := Cat( lvdsWriteAble(15,8), dataw ) - } - - -} - -trait InterfaceInterrupt{ this: InterfaceBase => - cReg.intEnable := - Cat( - 1.U(1.W), //复位中断,时钟为1 //31 上电复位 - 1.U(1.W), //复位中断,时钟为1 //30 上行硬件错误 - 1.U(1.W), //复位中断,时钟为1 //29 下行硬件错误 - RegEnable( dataw(4,0), 0.U(5.W), isEnW & addrw === "h73".U ), - RegEnable( dataw, 0.U(8.W), isEnW & addrw === "h72".U ), - RegEnable( dataw, 0.U(8.W), isEnW & addrw === "h71".U ), - RegEnable( dataw, 0.U(8.W), isEnW & addrw === "h70".U ), - ) - - val intStatus = for( i <- 0 until 32 ) yield { - if( i != 31 ) {RegInit(false.B)} else { RegInit(true.B) } - } - cReg.intStatus := Cat( intStatus.reverse ) - io.isPoReset := intStatus(31) - - cReg.intMode := - Cat( - RegEnable( dataw, 0.U(8.W), isEnW & addrw === "h7d".U ), - RegEnable( dataw, 0.U(8.W), isEnW & addrw === "h7c".U ), - ) - - val isLevelInt = cReg.intMode.extract(15) === false.B - val isPulseInt = cReg.intMode.extract(15) === true.B - val intPulseWidth = cReg.intMode(14,0) - - //主站发送完成 - when( io.intMstTrig(0) ){ - intStatus(0) := true.B - } - - //主站接收完成 - when( io.intMstTrig(1) ){ - intStatus(1) := true.B - } - - - //外部latch中断 - val isLatchEvent = - (RegNext( cReg.event.latchStatus(0), false.B ) =/= cReg.event.latchStatus(0)) | - (RegNext( cReg.event.latchStatus(1), false.B ) =/= cReg.event.latchStatus(1)) - - when(isLatchEvent){ - intStatus(3) := true.B - } - - //看门狗溢出 - val isWdtTrigAndEnable = (0 until 18).map{ i => (io.wdtTrigger(i) & cReg.wdtEnable(i))}.reduce(_|_) - when( isWdtTrigAndEnable ){ - intStatus(4) := true.B - } - - //从站SM请求 - for( i <- 0 until 8 ){ - when( io.intSlvTrig(i) ){ - intStatus(8+i) := true.B - } - } - - //传输完成请求 16,17,18,19 - //主站状态下19为上行crc接收错误 - for( i <- 0 until 4 ){ - when( io.intTransEnd(i) ){ - intStatus(16+i) := true.B - } - } - - //override - //主站状态下19为上行crc接收错误 - val isMstRecCRCErr = io.upRecStat.isCRCError & isMstMode - when( isMstRecCRCErr ){ - intStatus(19) := true.B - } - - - val intHWErr = Seq( - ( ~RegNext(io.intHWTrig(0), false.B) & io.intHWTrig(0)), - ( ~RegNext(io.intHWTrig(1), false.B) & io.intHWTrig(1)) - ) - //下行接收硬件错误 - when( intHWErr(0) ){ - intStatus(29) := true.B - } - //上行接收硬件错误 - when( intHWErr(1) ){ - intStatus(30) := true.B - } - - - //写清中断 - for( i <- 0 until 8 ){ - when( dataw.extract(i) & isEnW & addrw === "h78".U ){ - intStatus(i) := false.B - } - when( dataw.extract(i) & isEnW & addrw === "h79".U ){ - intStatus(i+8) := false.B - } - when( dataw.extract(i) & isEnW & addrw === "h7a".U ){ - intStatus(i+16) := false.B - } - when( dataw.extract(i) & isEnW & addrw === "h7b".U ){ - intStatus(i+24) := false.B - } - } - - io.intHWClr(0) := dataw.extract(5) & isEnW & addrw === "h7b".U - io.intHWClr(1) := dataw.extract(6) & isEnW & addrw === "h7b".U - - val intPulse = RegInit(false.B) - val intPulseResetCnt = RegInit(0.U(15.W)) - - val trigIntPulse = - (io.intMstTrig(0) & cReg.intEnable(0)) | //主站发送完成 - (io.intMstTrig(1) & cReg.intEnable(1)) | //主站接收完成 - (isLatchEvent & cReg.intEnable(3)) | //latch Event - (isWdtTrigAndEnable & cReg.intEnable(4)) | //主站接收看门狗溢出 - (0 until 8).map{ i => io.intSlvTrig(i) & cReg.intEnable(8+i)}.reduce(_|_) | //从站SM请求 - (0 until 4).map{ i => io.intTransEnd(i) & cReg.intEnable(16+i)}.reduce(_|_) | //传输完成请求 16,17,18,19 - isMstRecCRCErr | //override //主站状态下19为上行crc接收错误 //不会同时发生 - intHWErr(0) | //下行接收硬件错误 - intHWErr(1) //上行接收硬件错误 - - when( trigIntPulse ){ - intPulse := true.B - } .elsewhen( intPulseResetCnt === intPulseWidth ){ - intPulse := false.B - } - - when( trigIntPulse ){ - intPulseResetCnt := 0.U - } .elsewhen( (intPulseResetCnt <= intPulseWidth) & (intPulse === true.B) ){ - intPulseResetCnt := intPulseResetCnt + 1.U - } - - io.interrupt := Mux( isLevelInt, (cReg.intStatus & cReg.intEnable).orR, intPulse) -} - -trait InterfaceEvent{ this: InterfaceBase => - val isPosedgeOnce = for( i <- 0 until 2 ) yield RegEnable( dataw.extract(2), false.B, isEnW & ( addrw === ( "h500".U + (i*2).U ) )) - val isNegedgeOnce = for( i <- 0 until 2 ) yield RegEnable( dataw.extract(3), false.B, isEnW & ( addrw === ( "h500".U + (i*2).U ) )) - - val isPosedgeLatch = for( i <- 0 until 2 ) yield RegInit(false.B) - val isNegedgeLatch = for( i <- 0 until 2 ) yield RegInit(false.B) - - - val posedgeTimeStampLatch = for( i <- 0 until 2 ) yield RegInit(0.U(64.W)) - val negedgeTimeStampLatch = for( i <- 0 until 2 ) yield RegInit(0.U(64.W)) - - val mcuSMTimeStampEnq = RegInit(0.U(64.W)) - val mcuSMTimeStampDeq = RegInit(0.U(64.W)) - val lvdsSMTimeStampEnq = RegInit(0.U(64.W)) - val lvdsSMTimeStampDeq = RegInit(0.U(64.W)) - - for( i <- 0 until 2 ){ - when( dataw.extract(0) & isEnW & ( addrw === ( "h500".U + (i*2).U ) ) ){ - isPosedgeLatch(i):= false.B - posedgeTimeStampLatch(i) := 0.U - } .elsewhen( ~RegNext(io.latchPin(i), false.B) & io.latchPin(i) ){ - when( isPosedgeOnce(i) ){ - isPosedgeLatch(i) := true.B - } - when(~isPosedgeLatch(i)){ - posedgeTimeStampLatch(i) := cReg.recoTimeStamp - } - } - - when( dataw.extract(1) & isEnW & ( addrw === ( "h500".U + (i*2).U ) ) ){ - isNegedgeLatch(i) := false.B - negedgeTimeStampLatch(i) := 0.U - } .elsewhen( RegNext(io.latchPin(i), false.B) & ~io.latchPin(i) ){ - when( isNegedgeOnce(i) ){ - isNegedgeLatch(i) := true.B - } - when(~isNegedgeLatch(i)){ - negedgeTimeStampLatch(i) := cReg.recoTimeStamp - } - } - - when( io.uSMenq.reduce(_|_) ){ - mcuSMTimeStampEnq := cReg.recoTimeStamp - } - - when( io.dSMdeq.reduce(_|_) ){ - mcuSMTimeStampDeq := cReg.recoTimeStamp - } - - when( io.lvdsSMEnq.reduce(_|_) ){ - lvdsSMTimeStampEnq := cReg.recoTimeStamp - } - - when( io.lvdsSMDeq.reduce(_|_) ){ - lvdsSMTimeStampDeq := cReg.recoTimeStamp - } - - cReg.event.latchCtl(i) := (isPosedgeOnce(i) << 2) | (isNegedgeOnce(i) << 3) - - cReg.event.latchStatus(i) := Cat( io.latchPin(i), isNegedgeLatch(i), isPosedgeLatch(i) ) - cReg.event.posedgeTimeStampLatch(i) := posedgeTimeStampLatch(i) - cReg.event.negedgeTimeStampLatch(i) := negedgeTimeStampLatch(i) - } - - cReg.event.mcuSMTimeStampEnq := mcuSMTimeStampEnq - cReg.event.mcuSMTimeStampDeq := mcuSMTimeStampDeq - cReg.event.lvdsSMTimeStampEnq := lvdsSMTimeStampEnq - cReg.event.lvdsSMTimeStampDeq := lvdsSMTimeStampDeq -} - -trait InterfaceAnalog{ this: InterfaceBase => - cReg.pllCtrl := - Cat( - RegEnable( dataw, "h80".U(8.W), isEnW & addrw === "h47".U ), - RegEnable( dataw, "h00".U(8.W), isEnW & addrw === "h46".U ), - RegEnable( dataw, "h31".U(8.W), isEnW & addrw === "h45".U ), - RegEnable( dataw, "h3c".U(8.W), isEnW & addrw === "h44".U ) - ) - - cReg.xtal := - Cat( - RegEnable( dataw, "h05".U(8.W), isEnW & addrw === "h49".U ), - RegEnable( dataw, "h15".U(8.W), isEnW & addrw === "h48".U ) - ) - - - cReg.anamuxSel := RegEnable( dataw, "h0".U(8.W), isEnW & addrw === "h50".U ) - cReg.ldo2p5 := RegEnable( dataw, "h87".U(8.W), isEnW & addrw === "h51".U ) - cReg.ldo1p1 := RegEnable( dataw, "h87".U(8.W), isEnW & addrw === "h52".U ) - cReg.refTop := RegEnable( dataw, "h0".U(8.W), isEnW & addrw === "h53".U ) - cReg.bias := RegEnable( dataw, "h0".U(8.W), isEnW & addrw === "h54".U ) - cReg.div4 := RegEnable( dataw(3,0), "h1".U(4.W), isEnW & addrw === "h55".U ) - - io.isPllCfg := isEnW & addrw === "h45".U -} - -trait InterfaceStat{ this: InterfaceBase => - - val statDownRecErrorCnt = RegInit(0.U(32.W)); cReg.statDownRecErrorCnt := statDownRecErrorCnt - val statDownRecHeaderErrorCnt = RegInit(0.U(16.W)); cReg.statDownRecHeaderErrorCnt := statDownRecHeaderErrorCnt - val statDownRecSubHeaderErrorCnt = RegInit(0.U(16.W)); cReg.statDownRecSubHeaderErrorCnt := statDownRecSubHeaderErrorCnt - val statDownRecPayloadErrorCnt = RegInit(0.U(16.W)); cReg.statDownRecPayloadErrorCnt := statDownRecPayloadErrorCnt - val statDownRecSubTailErrorCnt = RegInit(0.U(16.W)); cReg.statDownRecSubTailErrorCnt := statDownRecSubTailErrorCnt - val statDownRecCRCErrorCnt = RegInit(0.U(16.W)); cReg.statDownRecCRCErrorCnt := statDownRecCRCErrorCnt - val statDownRecFinishCnt = RegInit(0.U(32.W)); cReg.statDownRecFinishCnt := statDownRecFinishCnt - val statDownRecByteCnt = RegInit(0.U(64.W)); cReg.statDownRecByteCnt := statDownRecByteCnt - - val statUpRecErrorCnt = RegInit(0.U(32.W)); cReg.statUpRecErrorCnt := statUpRecErrorCnt - val statUpRecHeaderErrorCnt = RegInit(0.U(16.W)); cReg.statUpRecHeaderErrorCnt := statUpRecHeaderErrorCnt - val statUpRecSubHeaderErrorCnt = RegInit(0.U(16.W)); cReg.statUpRecSubHeaderErrorCnt := statUpRecSubHeaderErrorCnt - val statUpRecPayloadErrorCnt = RegInit(0.U(16.W)); cReg.statUpRecPayloadErrorCnt := statUpRecPayloadErrorCnt - val statUpRecSubTailErrorCnt = RegInit(0.U(16.W)); cReg.statUpRecSubTailErrorCnt := statUpRecSubTailErrorCnt - val statUpRecCRCErrorCnt = RegInit(0.U(16.W)); cReg.statUpRecCRCErrorCnt := statUpRecCRCErrorCnt - val statUpRecFinishCnt = RegInit(0.U(32.W)); cReg.statUpRecFinishCnt := statUpRecFinishCnt - val statUpRecByteCnt = RegInit(0.U(64.W)); cReg.statUpRecByteCnt := statUpRecByteCnt - - - - when(io.lvds.isEnW & (io.lvds.addrw === "h80".U )){ - statDownRecErrorCnt := 0.U - } .elsewhen( io.downRecStat.isRecError ){ - statDownRecErrorCnt := statDownRecErrorCnt + 1.U - } - - when(io.lvds.isEnW & (io.lvds.addrw === "h82".U )){ - statDownRecHeaderErrorCnt := 0.U - } .elsewhen( io.downRecStat.isHeaderError ){ - statDownRecHeaderErrorCnt := statDownRecHeaderErrorCnt + 1.U - } - - when(io.lvds.isEnW & (io.lvds.addrw === "h84".U )){ - statDownRecSubHeaderErrorCnt := 0.U - } .elsewhen( io.downRecStat.isSubHeaderError ){ - statDownRecSubHeaderErrorCnt := statDownRecSubHeaderErrorCnt + 1.U - } - - when(io.lvds.isEnW & (io.lvds.addrw === "h86".U )){ - statDownRecPayloadErrorCnt := 0.U - } .elsewhen( io.downRecStat.isPayloadError ){ - statDownRecPayloadErrorCnt := statDownRecPayloadErrorCnt + 1.U - } - - when(io.lvds.isEnW & (io.lvds.addrw === "h88".U )){ - statDownRecSubTailErrorCnt := 0.U - } .elsewhen( io.downRecStat.isSubTailError ){ - statDownRecSubTailErrorCnt := statDownRecSubTailErrorCnt + 1.U - } - - when(io.lvds.isEnW & (io.lvds.addrw === "h8a".U )){ - statDownRecCRCErrorCnt := 0.U - } .elsewhen( io.downRecStat.isCRCError ){ - statDownRecCRCErrorCnt := statDownRecCRCErrorCnt + 1.U - } - - when(io.lvds.isEnW & (io.lvds.addrw === "h8c".U )){ - statDownRecFinishCnt := 0.U - } .elsewhen( io.downRecStat.isFinish ){ - statDownRecFinishCnt := statDownRecFinishCnt + 1.U - } - - when(io.lvds.isEnW & (io.lvds.addrw === "h90".U )){ - statDownRecByteCnt := 0.U - } .elsewhen( io.downRecStat.isRecByteAck ){ - statDownRecByteCnt := statDownRecByteCnt + 1.U - } - - when(io.lvds.isEnW & (io.lvds.addrw === "ha0".U )){ - statUpRecErrorCnt := 0.U - } .elsewhen( io.upRecStat.isRecError ){ - statUpRecErrorCnt := statUpRecErrorCnt + 1.U - } - - when(io.lvds.isEnW & (io.lvds.addrw === "ha2".U )){ - statUpRecHeaderErrorCnt := 0.U - } .elsewhen( io.upRecStat.isHeaderError ){ - statUpRecHeaderErrorCnt := statUpRecHeaderErrorCnt + 1.U - } - - when(io.lvds.isEnW & (io.lvds.addrw === "ha4".U )){ - statUpRecSubHeaderErrorCnt := 0.U - } .elsewhen( io.upRecStat.isSubHeaderError ){ - statUpRecSubHeaderErrorCnt := statUpRecSubHeaderErrorCnt + 1.U - } - - when(io.lvds.isEnW & (io.lvds.addrw === "ha6".U )){ - statUpRecPayloadErrorCnt := 0.U - } .elsewhen( io.upRecStat.isPayloadError ){ - statUpRecPayloadErrorCnt := statUpRecPayloadErrorCnt + 1.U - } - - when(io.lvds.isEnW & (io.lvds.addrw === "ha8".U )){ - statUpRecSubTailErrorCnt := 0.U - } .elsewhen( io.upRecStat.isSubTailError ){ - statUpRecSubTailErrorCnt := statUpRecSubTailErrorCnt + 1.U - } - - when(io.lvds.isEnW & (io.lvds.addrw === "haa".U )){ - statUpRecCRCErrorCnt := 0.U - } .elsewhen( io.upRecStat.isCRCError ){ - statUpRecCRCErrorCnt := statUpRecCRCErrorCnt + 1.U - } - - when(io.lvds.isEnW & (io.lvds.addrw === "hac".U )){ - statUpRecFinishCnt := 0.U - } .elsewhen( io.upRecStat.isFinish ){ - statUpRecFinishCnt := statUpRecFinishCnt + 1.U - } - - when(io.lvds.isEnW & (io.lvds.addrw === "hb0".U )){ - statUpRecByteCnt := 0.U - } .elsewhen( io.upRecStat.isRecByteAck ){ - statUpRecByteCnt := statUpRecByteCnt + 1.U - } - - -} - - - -class Interface extends InterfaceBase -with InterfaceMCUop -with InterfaceCheckSM -with InterfaceEBMMU -with InterfaceSync -with InterfaceStat -with InterfaceWdt -with InterfaceSystem -with InterfaceInterrupt -with InterfaceEvent -with InterfaceAnalog -{ - cReg.hwVersion := "h1".U - cReg.hwSerial := io.hwSerial - cReg.uniCode := io.uniCode - - - io.txReq.bits.txSM := mReg.txSM - io.txReq.bits.rxSM := mReg.rxSM - io.txReq.valid := RegNext(isEnW & addrw === "h20".U & dataw.extract(0) === "b1".U, false.B) - - - sReg.localDevIndex := io.localDevIndex - - sReg.isDevOnRight := io.isDevOnRight - sReg.isDevOnRightModify := io.isDevOnRightModify - sReg.indexOfRightDev := io.indexOfRightDev - -} - +package BACK + +import chisel3._ +import chisel3.util._ + + + + +class Stat_IO_Bundle extends Bundle{ + val isHeaderError = Bool() + val isSubHeaderError = Bool() + val isPayloadError = Bool() + val isSubTailError = Bool() + val isCRCError = Bool() + val isFinish = Bool() + val isRecByteAck = Bool() + + def isRecError = isHeaderError | isSubHeaderError | isPayloadError | isSubTailError | isCRCError +} + + + +class EBMMU_Bundle extends Bundle{ + val lAddr = UInt(30.W) + val pAddr = UInt(16.W) + val length = UInt(16.W) + val op = UInt(8.W) + val isEnable = Bool() + + def EBMMU_OP_RD = op === 1.U + def EBMMU_OP_WR = op === 2.U + def EBMMU_OP_RW = op === 3.U +} + +class CommonRegisterBundle extends Bundle{ + val mstOrSlv = UInt(2.W) + def modeSel:Bool = mstOrSlv === "h1".U + + val hwVersion = UInt(8.W) + val hwSerial = UInt(48.W) + val busRate = UInt(8.W) + + val spiSel = UInt(2.W) + + val uniCode = UInt(64.W) + + val pllCtrl = UInt(32.W) + val xtal = UInt(16.W) + val anamuxSel = UInt(5.W) + val ldo2p5 = UInt(8.W) + val ldo1p1 = UInt(8.W) + val refTop = UInt(3.W) + val bias = UInt(2.W) + val div4 = UInt(4.W) + + val dwupEx = Bool() + val b8b4Sel = Bool() + val cdrParam = UInt(8.W) + + + val softResetCode = Vec(4, UInt(8.W)) + + val intEnable = UInt(32.W) + val intStatus = UInt(32.W) + val intMode = UInt(16.W) + + + + val statDownRecErrorCnt = UInt(32.W) + val statDownRecHeaderErrorCnt = UInt(16.W) + val statDownRecSubHeaderErrorCnt = UInt(16.W) + val statDownRecPayloadErrorCnt = UInt(16.W) + val statDownRecSubTailErrorCnt = UInt(16.W) + val statDownRecCRCErrorCnt = UInt(16.W) + val statDownRecFinishCnt = UInt(32.W) + val statDownRecByteCnt = UInt(64.W) + + val statUpRecErrorCnt = UInt(32.W) + val statUpRecHeaderErrorCnt = UInt(16.W) + val statUpRecSubHeaderErrorCnt = UInt(16.W) + val statUpRecPayloadErrorCnt = UInt(16.W) + val statUpRecSubTailErrorCnt = UInt(16.W) + val statUpRecCRCErrorCnt = UInt(16.W) + val statUpRecFinishCnt = UInt(32.W) + val statUpRecByteCnt = UInt(64.W) + + + + + val wdtStatus = UInt(32.W) + val wdtEnable = UInt(32.W) + val wdtTarCnt = Vec( 18, UInt(32.W) ) + + val timeStamp = UInt(64.W) + val mstDeltaTime = UInt(32.W) + val syncCfg = UInt(8.W) + val syncWidth = Vec(4, UInt(16.W) ) + val syncOffset = Vec(4, UInt(32.W)) + val syncPoint = UInt(64.W) + val syncPeroid = UInt(32.W) + val recoTimeStamp = UInt(64.W) //时钟补偿寄存器 + + val custom = Vec( 128, UInt(8.W) ) + + val smUsedDepth = Vec(8, UInt(8.W)) + val smTrigLen = Vec(8, UInt(11.W)) //触发SM切换缓冲区的地址 (或读或写) + + val event = new Bundle{ + val latchCtl = Vec(2, UInt(4.W)) + val latchStatus = Vec(2, UInt(4.W)) + val posedgeTimeStampLatch = Vec(2, UInt(64.W)) + val negedgeTimeStampLatch = Vec(2, UInt(64.W)) + val mcuSMTimeStampEnq = UInt(64.W) + val mcuSMTimeStampDeq = UInt(64.W) + val lvdsSMTimeStampEnq = UInt(64.W) + val lvdsSMTimeStampDeq = UInt(64.W) + } +} + +class MasterRegisterBundle extends Bundle{ + val txSM = UInt(2.W) + val rxSM = UInt(2.W) + + val isRecCRCErr = UInt(4.W) + val rplTimeStampTx = UInt(16.W) + val timeStampOffset = UInt(64.W) +} + + +class SlaveRegisterBundle extends Bundle{ + val ebmmu = Vec(16, new EBMMU_Bundle) + + val localDevIndex = UInt(16.W) + + //链路寄存器组 + + val isDevOnRight = UInt(2.W) + val isDevOnRightModify = Bool() + val indexOfRightDev = UInt(14.W) + + + val slvDeltaTime = UInt(32.W) //从站时间戳差值 + val deltaFinal = UInt(64.W) //当前时间戳与主站时间差 + + val lvdsWriteAble = UInt(16.W) + def isLVDSWriteAble = lvdsWriteAble(15,8) === "h58".U & lvdsWriteAble.extract(0) + + +} + + + +class InterfaceIO extends Bundle{ + val ospi = new SSPIInterfaceIO + val oqspi = new QSPIInterfaceIO + val iqspi = new QSPIInterfaceIO + val aqspi = new QSPIInterfaceIO + + val lvds = Flipped(new RegAccessInterfaceIO) + + val txReq = Valid(new Bundle{ + val txSM = UInt(2.W) + val rxSM = UInt(2.W) + }) //发送请求和SM代号 + + + val dSMdeq = Output( Vec(4, Bool()) ) + val uSMenq = Output( Vec(4, Bool()) ) + + val lvdsSMEnq = Input(Vec(4, Bool())) + val lvdsSMDeq = Input(Vec(4, Bool())) + + val sram_w = Flipped(Vec( 4, new SRAM2kWRIO)) //QSPI + val sram_r = Flipped(Vec( 4, new SRAM2kRDIO)) //QSPI + + val cReg = Output(new CommonRegisterBundle) + val mReg = Output(new MasterRegisterBundle) + val sReg = Output(new SlaveRegisterBundle) + + val localDevIndex = Input(UInt(16.W)) + + val isDevOnRight = Input(UInt(2.W)) + val isDevOnRightModify = Input(Bool()) + val indexOfRightDev = Input(UInt(14.W)) + + + + val slvDeltaTime = Input(UInt(32.W)) //从站时间戳差值 + val mstDeltaTime = Input(UInt(32.W)) + val deltaFinal = Input(UInt(64.W)) + + val sync = Output(Vec(4, Bool())) + + + val isSoftReset = Output(Bool()) + val intMstTrig = Input(Vec(2, Bool())) + val intHWTrig = Input(Vec(2, Bool())) + val intHWClr = Output(Vec(2, Bool())) + val intSlvTrig = Input(Vec(8, Bool())) + val intTransEnd = Input(Vec(4,Bool())) + + val interrupt = Output(Bool()) + + val wdtTrigger = Input(Vec(18, Bool())) + + val downRecStat = Input(new Stat_IO_Bundle) + val upRecStat = Input(new Stat_IO_Bundle) + + val smUsedDepth = Input( Vec(8, UInt(8.W)) ) + val isSMReset = Output( Vec(8, Bool()) ) + + val latchPin = Input(Vec(2, Bool())) + val isPoReset = Output(Bool()) + + val hwSerial = Input(UInt(48.W)) + val uniCode = Input(UInt(64.W)) + val isPllCfg = Output(Bool()) +} + + +abstract class InterfaceBase extends Module with RequireAsyncReset{ + val io: InterfaceIO = IO(new InterfaceIO) + + val oSpi = Module(new SSpiInterface) + val oQSpi = Module(new QSpiInterface(true)) + val iQSpi = Module(new QSpiInterface(false)) + val aQSpi = Module(new SyncQSpiInterface) + + io.ospi <> oSpi.spi + io.oqspi <> oQSpi.qspi + io.iqspi <> iQSpi.qspi + io.aqspi <> aQSpi.qspi + + val cReg = Wire(new CommonRegisterBundle); io.cReg := cReg + val mReg = Wire(new MasterRegisterBundle); io.mReg := mReg + val sReg = Wire(new SlaveRegisterBundle); io.sReg := sReg + + + + + + + val isSysInit = cReg.mstOrSlv =/= 0.U + val isMstMode = cReg.mstOrSlv === "h1".U + val isSlvMode = cReg.mstOrSlv === "h2".U + + def AcquireReg(addr: UInt): UInt = { + Mux1H( + Seq( + (addr === "h0".U) -> cReg.mstOrSlv, + (addr === "h1".U) -> cReg.hwVersion, + ) ++ + + ((0 until 6).map{ i => + (addr === ("h2".U(16.W) + i.U) ) -> cReg.hwSerial( 8*i+7,8*i+0 ) + }) ++ + + ((0 until 8).map{ i => + (addr === ("h10".U(16.W) + i.U) ) -> cReg.uniCode( 8*i+7,8*i+0 ) + }) ++ + + Seq( + (addr === "h8".U ) -> cReg.busRate( 7,0 ), + (addr === "h9".U ) -> cReg.spiSel, + (addr === "ha".U & isSlvMode) -> sReg.localDevIndex(7,0), + (addr === "hb".U & isSlvMode) -> sReg.localDevIndex(15,8), + ) ++ + + Seq( + (addr === "h18".U ) -> sReg.lvdsWriteAble.extract(0), + (addr === "h20".U & isMstMode) -> Cat(mReg.rxSM, mReg.txSM, 0.U(1.W) ), + (addr === "h22".U & isMstMode) -> mReg.isRecCRCErr, + (addr === "h24".U & isMstMode) -> mReg.rplTimeStampTx(7,0), + (addr === "h25".U & isMstMode) -> mReg.rplTimeStampTx(15,8), + ) ++ + + Seq( + (addr === "h40".U ) -> cReg.softResetCode(1), + (addr === "h41".U ) -> cReg.softResetCode(1), + (addr === "h42".U ) -> cReg.softResetCode(2), + (addr === "h43".U ) -> cReg.softResetCode(3), + ) ++ + + ((0 until 4).map{ i => + (addr === ("h44".U(16.W) + i.U) ) -> cReg.pllCtrl( 8*i+7,8*i+0 ) + }) ++ + + ((0 until 2).map{ i => + (addr === ("h48".U(16.W) + i.U) ) -> cReg.xtal( 8*i+7,8*i+0 ) + }) ++ + + Seq( + (addr === "h4a".U ) -> cReg.dwupEx, + (addr === "h4c".U ) -> cReg.b8b4Sel, + (addr === "h4e".U ) -> cReg.cdrParam, + + (addr === "h50".U ) -> cReg.anamuxSel, + (addr === "h51".U ) -> cReg.ldo2p5, + (addr === "h52".U ) -> cReg.ldo1p1, + (addr === "h53".U ) -> cReg.refTop, + (addr === "h54".U ) -> cReg.bias, + (addr === "h55".U ) -> cReg.div4, + + (addr === "h70".U ) -> cReg.intEnable(7,0), + (addr === "h71".U ) -> cReg.intEnable(15,8), + (addr === "h72".U ) -> cReg.intEnable(23,16), + (addr === "h73".U ) -> cReg.intEnable(31,24), + + (addr === "h74".U ) -> cReg.intStatus(7,0), + (addr === "h75".U ) -> cReg.intStatus(15,8), + (addr === "h76".U ) -> cReg.intStatus(23,16), + (addr === "h77".U ) -> cReg.intStatus(31,24), + + (addr === "h7c".U ) -> cReg.intMode(7,0), + (addr === "h7d".U ) -> cReg.intMode(15,8), + + + (addr === "h80".U ) -> cReg.statDownRecErrorCnt(7,0), + (addr === "h81".U ) -> cReg.statDownRecErrorCnt(15,8), + (addr === "h82".U ) -> cReg.statDownRecHeaderErrorCnt(7,0), + (addr === "h83".U ) -> cReg.statDownRecHeaderErrorCnt(15,8), + (addr === "h84".U ) -> cReg.statDownRecSubHeaderErrorCnt(7,0), + (addr === "h85".U ) -> cReg.statDownRecSubHeaderErrorCnt(15,8), + (addr === "h86".U ) -> cReg.statDownRecPayloadErrorCnt(7,0), + (addr === "h87".U ) -> cReg.statDownRecPayloadErrorCnt(15,8), + (addr === "h88".U ) -> cReg.statDownRecSubTailErrorCnt(7,0), + (addr === "h89".U ) -> cReg.statDownRecSubTailErrorCnt(15,8), + (addr === "h8a".U ) -> cReg.statDownRecCRCErrorCnt(7,0), + (addr === "h8b".U ) -> cReg.statDownRecCRCErrorCnt(15,8), + (addr === "h8c".U ) -> cReg.statDownRecFinishCnt(7,0), + (addr === "h8d".U ) -> cReg.statDownRecFinishCnt(15,8), + (addr === "h8e".U ) -> cReg.statDownRecFinishCnt(23,16), + (addr === "h8f".U ) -> cReg.statDownRecFinishCnt(31,24), + (addr === "h90".U ) -> cReg.statDownRecByteCnt(7,0), + (addr === "h91".U ) -> cReg.statDownRecByteCnt(15,8), + (addr === "h92".U ) -> cReg.statDownRecByteCnt(23,16), + (addr === "h93".U ) -> cReg.statDownRecByteCnt(31,24), + (addr === "h94".U ) -> cReg.statDownRecByteCnt(39,32), + (addr === "h95".U ) -> cReg.statDownRecByteCnt(47,40), + (addr === "h96".U ) -> cReg.statDownRecByteCnt(55,48), + (addr === "h97".U ) -> cReg.statDownRecByteCnt(63,56), + + + (addr === "ha0".U ) -> cReg.statUpRecErrorCnt(7,0), + (addr === "ha1".U ) -> cReg.statUpRecErrorCnt(15,8), + (addr === "ha2".U ) -> cReg.statUpRecHeaderErrorCnt(7,0), + (addr === "ha3".U ) -> cReg.statUpRecHeaderErrorCnt(15,8), + (addr === "ha4".U ) -> cReg.statUpRecSubHeaderErrorCnt(7,0), + (addr === "ha5".U ) -> cReg.statUpRecSubHeaderErrorCnt(15,8), + (addr === "ha6".U ) -> cReg.statUpRecPayloadErrorCnt(7,0), + (addr === "ha7".U ) -> cReg.statUpRecPayloadErrorCnt(15,8), + (addr === "ha8".U ) -> cReg.statUpRecSubTailErrorCnt(7,0), + (addr === "ha9".U ) -> cReg.statUpRecSubTailErrorCnt(15,8), + (addr === "haa".U ) -> cReg.statUpRecCRCErrorCnt(7,0), + (addr === "hab".U ) -> cReg.statUpRecCRCErrorCnt(15,8), + (addr === "hac".U ) -> cReg.statUpRecFinishCnt(7,0), + (addr === "had".U ) -> cReg.statUpRecFinishCnt(15,8), + (addr === "hae".U ) -> cReg.statUpRecFinishCnt(23,16), + (addr === "haf".U ) -> cReg.statUpRecFinishCnt(31,24), + (addr === "hb0".U ) -> cReg.statUpRecByteCnt(7,0), + (addr === "hb1".U ) -> cReg.statUpRecByteCnt(15,8), + (addr === "hb2".U ) -> cReg.statUpRecByteCnt(23,16), + (addr === "hb3".U ) -> cReg.statUpRecByteCnt(31,24), + (addr === "hb4".U ) -> cReg.statUpRecByteCnt(39,32), + (addr === "hb5".U ) -> cReg.statUpRecByteCnt(47,40), + (addr === "hb6".U ) -> cReg.statUpRecByteCnt(55,48), + (addr === "hb7".U ) -> cReg.statUpRecByteCnt(63,56), + + (addr === "hc0".U ) -> Cat( sReg.isDevOnRightModify, sReg.isDevOnRight, 0.U(3.W) ), + (addr === "hc2".U ) -> sReg.indexOfRightDev(7,0), + (addr === "hc3".U ) -> sReg.indexOfRightDev(13,8), + ) ++ + + Seq( + //本地时钟 + (addr === "h100".U ) -> cReg.timeStamp(7,0), + (addr === "h101".U ) -> RegEnable(cReg.timeStamp(15,8), 0.U(8.W), isEnR & (addrr === "h100".U)), + (addr === "h102".U ) -> RegEnable(cReg.timeStamp(23,16), 0.U(8.W), isEnR & (addrr === "h100".U)), + (addr === "h103".U ) -> RegEnable(cReg.timeStamp(31,24), 0.U(8.W), isEnR & (addrr === "h100".U)), + (addr === "h104".U ) -> RegEnable(cReg.timeStamp(39,32), 0.U(8.W), isEnR & (addrr === "h100".U)), + (addr === "h105".U ) -> RegEnable(cReg.timeStamp(47,40), 0.U(8.W), isEnR & (addrr === "h100".U)), + (addr === "h106".U ) -> RegEnable(cReg.timeStamp(55,48), 0.U(8.W), isEnR & (addrr === "h100".U)), + (addr === "h107".U ) -> RegEnable(cReg.timeStamp(63,56), 0.U(8.W), isEnR & (addrr === "h100".U)), + + //参考主站时钟 + (addr === "h108".U & isSlvMode) -> sReg.deltaFinal(7,0), + (addr === "h109".U & isSlvMode) -> sReg.deltaFinal(15,8), + (addr === "h10a".U & isSlvMode) -> sReg.deltaFinal(23,16), + (addr === "h10b".U & isSlvMode) -> sReg.deltaFinal(31,24), + (addr === "h10c".U & isSlvMode) -> sReg.deltaFinal(39,32), + (addr === "h10d".U & isSlvMode) -> sReg.deltaFinal(47,40), + (addr === "h10e".U & isSlvMode) -> sReg.deltaFinal(55,48), + (addr === "h10f".U & isSlvMode) -> sReg.deltaFinal(63,56), + + //主站发送接收时间差 + (addr === "h110".U ) -> cReg.mstDeltaTime(7,0), + (addr === "h111".U ) -> cReg.mstDeltaTime(15,8), + (addr === "h112".U ) -> cReg.mstDeltaTime(23,16), + (addr === "h113".U ) -> cReg.mstDeltaTime(31,24), + + //从站发送接收时间差 + (addr === "h114".U & isSlvMode) -> sReg.slvDeltaTime(7,0), + (addr === "h115".U & isSlvMode) -> sReg.slvDeltaTime(15,8), + (addr === "h116".U & isSlvMode) -> sReg.slvDeltaTime(23,16), + (addr === "h117".U & isSlvMode) -> sReg.slvDeltaTime(31,24), + + //校准后的时钟 + (addr === "h118".U ) -> cReg.recoTimeStamp(7,0), + (addr === "h119".U ) -> RegEnable(cReg.recoTimeStamp(15,8), 0.U(8.W), isEnR & (addrr === "h118".U)), + (addr === "h11a".U ) -> RegEnable(cReg.recoTimeStamp(23,16), 0.U(8.W), isEnR & (addrr === "h118".U)), + (addr === "h11b".U ) -> RegEnable(cReg.recoTimeStamp(31,24), 0.U(8.W), isEnR & (addrr === "h118".U)), + (addr === "h11c".U ) -> RegEnable(cReg.recoTimeStamp(39,32), 0.U(8.W), isEnR & (addrr === "h118".U)), + (addr === "h11d".U ) -> RegEnable(cReg.recoTimeStamp(47,40), 0.U(8.W), isEnR & (addrr === "h118".U)), + (addr === "h11e".U ) -> RegEnable(cReg.recoTimeStamp(55,48), 0.U(8.W), isEnR & (addrr === "h118".U)), + (addr === "h11f".U ) -> RegEnable(cReg.recoTimeStamp(63,56), 0.U(8.W), isEnR & (addrr === "h118".U)), + + (addr === "h120".U ) -> cReg.syncCfg, + + (addr === "h122".U ) -> cReg.syncWidth(0)(7,0), + (addr === "h123".U ) -> cReg.syncWidth(0)(15,8), + + (addr === "h124".U ) -> cReg.syncWidth(1)(7,0), + (addr === "h125".U ) -> cReg.syncWidth(1)(15,8), + + (addr === "h126".U ) -> cReg.syncWidth(2)(7,0), + (addr === "h127".U ) -> cReg.syncWidth(2)(15,8), + + (addr === "h128".U ) -> cReg.syncWidth(3)(7,0), + (addr === "h129".U ) -> cReg.syncWidth(3)(15,8), + + (addr === "h130".U ) -> cReg.syncPoint(7,0), + (addr === "h131".U ) -> cReg.syncPoint(15,8), + (addr === "h132".U ) -> cReg.syncPoint(23,16), + (addr === "h133".U ) -> cReg.syncPoint(31,24), + (addr === "h134".U ) -> cReg.syncPoint(39,32), + (addr === "h135".U ) -> cReg.syncPoint(47,40), + (addr === "h136".U ) -> cReg.syncPoint(55,48), + (addr === "h137".U ) -> cReg.syncPoint(63,56), + + (addr === "h138".U ) -> cReg.syncPeroid(7,0), + (addr === "h139".U ) -> cReg.syncPeroid(15,8), + (addr === "h13a".U ) -> cReg.syncPeroid(23,16), + (addr === "h13b".U ) -> cReg.syncPeroid(31,24), + + (addr === "h13c".U ) -> cReg.syncOffset(1)(7,0), + (addr === "h13d".U ) -> cReg.syncOffset(1)(15,8), + (addr === "h13e".U ) -> cReg.syncOffset(1)(23,16), + (addr === "h13f".U ) -> cReg.syncOffset(1)(31,24), + + (addr === "h140".U ) -> cReg.syncOffset(2)(7,0), + (addr === "h141".U ) -> cReg.syncOffset(2)(15,8), + (addr === "h142".U ) -> cReg.syncOffset(2)(23,16), + (addr === "h143".U ) -> cReg.syncOffset(2)(31,24), + + (addr === "h144".U ) -> cReg.syncOffset(3)(7,0), + (addr === "h145".U ) -> cReg.syncOffset(3)(15,8), + (addr === "h146".U ) -> cReg.syncOffset(3)(23,16), + (addr === "h147".U ) -> cReg.syncOffset(3)(31,24), + + (addr === "h148".U ) -> mReg.timeStampOffset(7,0), + (addr === "h149".U ) -> mReg.timeStampOffset(15,8), + (addr === "h14a".U ) -> mReg.timeStampOffset(23,16), + (addr === "h14b".U ) -> mReg.timeStampOffset(31,24), + (addr === "h14c".U ) -> mReg.timeStampOffset(39,32), + (addr === "h14d".U ) -> mReg.timeStampOffset(47,40), + (addr === "h14e".U ) -> mReg.timeStampOffset(55,48), + (addr === "h14f".U ) -> mReg.timeStampOffset(63,56), + + ) ++ + ( 0 until 128 ).map{ i => + ( addr === ("h180".U(16.W) + i.U ) ) -> cReg.custom(i) + } ++ + ( 0 until 16 ).map{ i => Seq( + ( ( addr === ( "h200".U(16.W) + (10*i).U) ) & isSlvMode ) -> sReg.ebmmu(i).lAddr( 7, 0), + ( ( addr === ( "h201".U(16.W) + (10*i).U) ) & isSlvMode ) -> sReg.ebmmu(i).lAddr(15, 8), + ( ( addr === ( "h202".U(16.W) + (10*i).U) ) & isSlvMode ) -> sReg.ebmmu(i).lAddr(23,16), + ( ( addr === ( "h203".U(16.W) + (10*i).U) ) & isSlvMode ) -> sReg.ebmmu(i).lAddr(29,24), + + ( ( addr === ( "h204".U(16.W) + (10*i).U) ) & isSlvMode ) -> sReg.ebmmu(i).pAddr( 7, 0), + ( ( addr === ( "h205".U(16.W) + (10*i).U) ) & isSlvMode ) -> sReg.ebmmu(i).pAddr(15, 8), + + ( ( addr === ( "h206".U(16.W) + (10*i).U) ) & isSlvMode ) -> sReg.ebmmu(i).length( 7, 0), + ( ( addr === ( "h207".U(16.W) + (10*i).U) ) & isSlvMode ) -> sReg.ebmmu(i).length(15, 8), + + ( ( addr === ( "h208".U(16.W) + (10*i).U) ) & isSlvMode ) -> sReg.ebmmu(i).op, + ( ( addr === ( "h209".U(16.W) + (10*i).U) ) & isSlvMode ) -> sReg.ebmmu(i).isEnable, + )}.reduce(_++_) ++ + ( 0 until 8 ).map{ i => + ( addr === ("h301".U(16.W) + (i*4).U) ) -> cReg.smUsedDepth(i) + } ++ + ( 0 until 8 ).map{ i => + ( addr === ("h302".U(16.W) + (i*4).U) ) -> cReg.smTrigLen(i)(7,0) + } ++ + ( 0 until 8 ).map{ i => + ( addr === ("h303".U(16.W) + (i*4).U) ) -> cReg.smTrigLen(i)(10,8) + } ++ + + ( 0 until 4 ).map{ i => + ( addr === ("h400".U(16.W) + i.U) ) -> cReg.wdtStatus( 8*i+7, 8*i+0 ) + } ++ + ( 0 until 4 ).map{ i => + ( addr === ("h404".U(16.W) + i.U) ) -> cReg.wdtEnable( 8*i+7, 8*i+0 ) + } ++ + (for( i <- 0 until 17; j <- 0 until 4 ) yield { + ( addr === ("h408".U(16.W) + (4*i+j).U) ) -> cReg.wdtTarCnt(i)( 8*j+7, 8*j+0 ) + }) ++ + Seq( + (addr === "h500".U ) -> cReg.event.latchCtl(0), + (addr === "h502".U ) -> cReg.event.latchCtl(1), + (addr === "h504".U ) -> cReg.event.latchStatus(0), + (addr === "h506".U ) -> cReg.event.latchStatus(1), + ) ++ + ( 0 until 8 ).map{ i => + ( addr === ("h508".U(16.W) + i.U) ) -> cReg.event.posedgeTimeStampLatch(0)( 8*i+7, 8*i+0 ) + } ++ + ( 0 until 8 ).map{ i => + ( addr === ("h510".U(16.W) + i.U) ) -> cReg.event.negedgeTimeStampLatch(0)( 8*i+7, 8*i+0 ) + } ++ + ( 0 until 8 ).map{ i => + ( addr === ("h518".U(16.W) + i.U) ) -> cReg.event.posedgeTimeStampLatch(1)( 8*i+7, 8*i+0 ) + } ++ + ( 0 until 8 ).map{ i => + ( addr === ("h520".U(16.W) + i.U) ) -> cReg.event.negedgeTimeStampLatch(1)( 8*i+7, 8*i+0 ) + } ++ + ( 0 until 8 ).map{ i => + ( addr === ("h528".U(16.W) + i.U) ) -> cReg.event.mcuSMTimeStampEnq( 8*i+7, 8*i+0 ) + } ++ + ( 0 until 8 ).map{ i => + ( addr === ("h530".U(16.W) + i.U) ) -> cReg.event.mcuSMTimeStampDeq( 8*i+7, 8*i+0 ) + } ++ + ( 0 until 8 ).map{ i => + ( addr === ("h538".U(16.W) + i.U) ) -> cReg.event.lvdsSMTimeStampEnq( 8*i+7, 8*i+0 ) + } ++ + ( 0 until 8 ).map{ i => + ( addr === ("h540".U(16.W) + i.U) ) -> cReg.event.lvdsSMTimeStampDeq( 8*i+7, 8*i+0 ) + } ++ + Seq() + + ) + + + } + + + + //spi信号 + val addrr = Wire(UInt(16.W)) + val addrw = Wire(UInt(16.W)) + val dataw = Wire( UInt(8.W) ) + val datar = Wire( UInt(8.W) ) + val isEnW = Wire(Bool()) + val isEnR = Wire(Bool()) + + +} + +trait InterfaceMCUop{ this: InterfaceBase => + + isEnW := Mux1H(Seq( + ( cReg.spiSel === 0.U ) -> iQSpi.io.isEnW, + ( cReg.spiSel === 1.U ) -> oSpi.io.isEnW, + ( cReg.spiSel === 2.U ) -> oQSpi.io.isEnW, + ( cReg.spiSel === 3.U ) -> aQSpi.io.isEnW, + )) + + addrr := Mux1H(Seq( + ( cReg.spiSel === 0.U ) -> iQSpi.io.addrr, + ( cReg.spiSel === 1.U ) -> oSpi.io.addrr, + ( cReg.spiSel === 2.U ) -> oQSpi.io.addrr, + ( cReg.spiSel === 3.U ) -> aQSpi.io.addrr, + )) + + addrw := Mux1H(Seq( + ( cReg.spiSel === 0.U ) -> iQSpi.io.addrw, + ( cReg.spiSel === 1.U ) -> oSpi.io.addrw, + ( cReg.spiSel === 2.U ) -> oQSpi.io.addrw, + ( cReg.spiSel === 3.U ) -> aQSpi.io.addrw, + )) + + dataw := Mux1H(Seq( + ( cReg.spiSel === 0.U ) -> iQSpi.io.dataw, + ( cReg.spiSel === 1.U ) -> oSpi.io.dataw, + ( cReg.spiSel === 2.U ) -> oQSpi.io.dataw, + ( cReg.spiSel === 3.U ) -> aQSpi.io.dataw, + )) + + isEnR := Mux1H(Seq( + ( cReg.spiSel === 0.U ) -> iQSpi.io.isEnR, + ( cReg.spiSel === 1.U ) -> oSpi.io.isEnR, + ( cReg.spiSel === 2.U ) -> oQSpi.io.isEnR, + ( cReg.spiSel === 3.U ) -> aQSpi.io.isEnR, + )) + + datar := MuxCase( 0.U, Array( + ((addrr & "hF800".U) === "h0000".U) -> RegEnable( AcquireReg(addr = addrr), 0.U(8.W), isEnR ), + ((addrr & "hF800".U) === "h0800".U) -> io.sram_r(0).datar, + ((addrr & "hF800".U) === "h1000".U) -> 0.U, + ((addrr & "hF800".U) === "h1800".U) -> io.sram_r(1).datar, + ((addrr & "hF800".U) === "h2000".U) -> 0.U, + ((addrr & "hF800".U) === "h2800".U) -> io.sram_r(2).datar, + ((addrr & "hF800".U) === "h3000".U) -> 0.U, + ((addrr & "hF800".U) === "h3800".U) -> io.sram_r(3).datar, + ((addrr & "hF800".U) === "h4000".U) -> 0.U, + )) + + iQSpi.io.datar := Mux(cReg.spiSel === 0.U, datar, 0.U) + oSpi.io.datar := Mux(cReg.spiSel === 1.U, datar, 0.U) + oQSpi.io.datar := Mux(cReg.spiSel === 2.U, datar, 0.U) + aQSpi.io.datar := Mux(cReg.spiSel === 3.U, datar, 0.U) + + // when( isEnW ){ + // printf(s"SPI/QSPI Write 0x%x, @0x%x\n", dataw, addrw) + // } + // when( isEnR ){ + // printf(s"SPI/QSPI Readout 0x%x, @0x%x\n", datar, addrr) + // } + + + + cReg.mstOrSlv := RegEnable( dataw(1,0), 0.U(2.W), isEnW & addrw === "h0".U ) + + + cReg.busRate := RegEnable( dataw, "h55".U(8.W), isEnW & addrw === "h8".U ) + cReg.spiSel := RegEnable( dataw(1,0), 1.U(2.W), isEnW & addrw === "h9".U ) + + mReg.txSM := RegEnable( dataw(2,1), 0.U(2.W), isEnW & addrw === "h20".U ) + mReg.rxSM := RegEnable( dataw(4,3), 0.U(2.W), isEnW & addrw === "h20".U ) + + val mReg_isRecCRCErr = RegInit(0.U(4.W)) + mReg.isRecCRCErr := mReg_isRecCRCErr + when( isEnW & addrw === "h22".U(16.W) ){ + mReg_isRecCRCErr := 0.U + } .elsewhen( io.upRecStat.isCRCError & isMstMode ){ + mReg_isRecCRCErr := mReg_isRecCRCErr | (1.U << mReg.rxSM) + } + + + + ( 0 until 128 ).map{ i => + cReg.custom(i) := RegEnable( dataw, 0.U(8.W), isEnW & (addrw === ("h180".U(16.W) + i.U)) ) + } + + val rplTimeStampTx = RegInit(0.U(16.W)) + + mReg.rplTimeStampTx := rplTimeStampTx + + when( io.intMstTrig(0) ){ + rplTimeStampTx := rplTimeStampTx & "h3FFF".U(16.W) + } .elsewhen( isEnW & addrw === "h25".U ){ + rplTimeStampTx := Cat( dataw, rplTimeStampTx(7,0) ) + } .elsewhen( isEnW & addrw === "h24".U ){ + rplTimeStampTx := Cat(rplTimeStampTx(15,8), dataw ) + } + +} + +trait InterfaceCheckSM{ this: InterfaceBase => + val isEnW: Bool + val addrw: UInt + val dataw: UInt + val isEnR: Bool + + + val smTrigLen_H = for( i <- 0 until 8 ) yield { RegInit(0.U(8.W)) } + val smTrigLen_L = for( i <- 0 until 8 ) yield { RegInit(0.U(8.W)) } + + + for( i <- 0 until 8 ){ + io.isSMReset(i) := isEnW & (addrw === ("h300".U(16.W) + (i*4).U)) + + cReg.smUsedDepth(i) := io.smUsedDepth(i) + cReg.smTrigLen(i) := Cat( smTrigLen_H(i), smTrigLen_L(i) ) + + when( cReg.smUsedDepth(i) === 0.U ){ + when( isEnW & addrw === ("h303".U(16.W) + (i*4).U) ){ + smTrigLen_H(i) := dataw + } .elsewhen( io.lvds.isEnW & io.lvds.addrw === ("h303".U(16.W) + (i*4).U)){ + smTrigLen_H(i) := io.lvds.dataw + } + + when( isEnW & addrw === ("h302".U(16.W) + (i*4).U) ){ + smTrigLen_L(i) := dataw + } .elsewhen( io.lvds.isEnW & io.lvds.addrw === ("h302".U(16.W) + (i*4).U)){ + smTrigLen_L(i) := io.lvds.dataw + } + } + } + + + io.sram_r(0).addrr := addrr + io.sram_r(1).addrr := addrr + io.sram_r(2).addrr := addrr + io.sram_r(3).addrr := addrr + + io.sram_r(0).enr := isEnR & (( addrr & "hF800".U ) === "h0800".U) + io.sram_r(1).enr := isEnR & (( addrr & "hF800".U ) === "h1800".U) + io.sram_r(2).enr := isEnR & (( addrr & "hF800".U ) === "h2800".U) + io.sram_r(3).enr := isEnR & (( addrr & "hF800".U ) === "h3800".U) + + io.sram_w(0).addrw := addrw + io.sram_w(1).addrw := addrw + io.sram_w(2).addrw := addrw + io.sram_w(3).addrw := addrw + + io.sram_w(0).dataw := dataw + io.sram_w(1).dataw := dataw + io.sram_w(2).dataw := dataw + io.sram_w(3).dataw := dataw + + io.sram_w(0).enw := isEnW & (( addrw & "hF800".U ) === "h1000".U) + io.sram_w(1).enw := isEnW & (( addrw & "hF800".U ) === "h2000".U) + io.sram_w(2).enw := isEnW & (( addrw & "hF800".U ) === "h3000".U) + io.sram_w(3).enw := isEnW & (( addrw & "hF800".U ) === "h4000".U) + + io.dSMdeq(0) := isEnR & (( addrr & "hF800".U ) === "h0800".U) & (addrr(10,0) === cReg.smTrigLen(0) - 1.U + 1.U) + io.dSMdeq(1) := isEnR & (( addrr & "hF800".U ) === "h1800".U) & (addrr(10,0) === cReg.smTrigLen(2) - 1.U + 1.U) + io.dSMdeq(2) := isEnR & (( addrr & "hF800".U ) === "h2800".U) & (addrr(10,0) === cReg.smTrigLen(4) - 1.U + 1.U) + io.dSMdeq(3) := isEnR & (( addrr & "hF800".U ) === "h3800".U) & (addrr(10,0) === cReg.smTrigLen(6) - 1.U + 1.U) + + io.uSMenq(0) := isEnW & (( addrw & "hF800".U ) === "h1000".U) & (addrw(10,0) === cReg.smTrigLen(1) - 1.U) + io.uSMenq(1) := isEnW & (( addrw & "hF800".U ) === "h2000".U) & (addrw(10,0) === cReg.smTrigLen(3) - 1.U) + io.uSMenq(2) := isEnW & (( addrw & "hF800".U ) === "h3000".U) & (addrw(10,0) === cReg.smTrigLen(5) - 1.U) + io.uSMenq(3) := isEnW & (( addrw & "hF800".U ) === "h4000".U) & (addrw(10,0) === cReg.smTrigLen(7) - 1.U) +} + +trait InterfaceEBMMU{ this: InterfaceBase => + + io.lvds.datar := RegEnable(AcquireReg(addr = io.lvds.addrr), 0.U(8.W), io.lvds.isEnR) + + ( 0 until 16 ).map{ i => + sReg.ebmmu(i).lAddr := Cat( + RegEnable( io.lvds.dataw(5,0), 0.U(8.W), sReg.isLVDSWriteAble & io.lvds.isEnW & isSlvMode & (io.lvds.addrw === ( "h203".U(16.W) + (10*i).U )) ), + RegEnable( io.lvds.dataw, 0.U(8.W), sReg.isLVDSWriteAble & io.lvds.isEnW & isSlvMode & (io.lvds.addrw === ( "h202".U(16.W) + (10*i).U )) ), + RegEnable( io.lvds.dataw, 0.U(8.W), sReg.isLVDSWriteAble & io.lvds.isEnW & isSlvMode & (io.lvds.addrw === ( "h201".U(16.W) + (10*i).U )) ), + RegEnable( io.lvds.dataw, 0.U(8.W), sReg.isLVDSWriteAble & io.lvds.isEnW & isSlvMode & (io.lvds.addrw === ( "h200".U(16.W) + (10*i).U )) ), + ) + + sReg.ebmmu(i).pAddr := Cat( + RegEnable( io.lvds.dataw, 0.U(8.W), sReg.isLVDSWriteAble & io.lvds.isEnW & isSlvMode & (io.lvds.addrw === ( "h205".U(16.W) + (10*i).U )) ), + RegEnable( io.lvds.dataw, 0.U(8.W), sReg.isLVDSWriteAble & io.lvds.isEnW & isSlvMode & (io.lvds.addrw === ( "h204".U(16.W) + (10*i).U )) ), + ) + + sReg.ebmmu(i).length := Cat( + RegEnable( io.lvds.dataw, 0.U(8.W), sReg.isLVDSWriteAble & io.lvds.isEnW & isSlvMode & (io.lvds.addrw === ( "h207".U(16.W) + (10*i).U )) ), + RegEnable( io.lvds.dataw, 0.U(8.W), sReg.isLVDSWriteAble & io.lvds.isEnW & isSlvMode & (io.lvds.addrw === ( "h206".U(16.W) + (10*i).U )) ), + ) + + sReg.ebmmu(i).op := + RegEnable( io.lvds.dataw, 0.U(8.W), sReg.isLVDSWriteAble & io.lvds.isEnW & isSlvMode & (io.lvds.addrw === ( "h208".U(16.W) + (10*i).U )) ) + + sReg.ebmmu(i).isEnable := + RegEnable( io.lvds.dataw.extract(0), false.B, sReg.isLVDSWriteAble & io.lvds.isEnW & isSlvMode & (io.lvds.addrw === ( "h209".U(16.W) + (10*i).U )) ) + } + +} + +trait InterfaceSync{ this: InterfaceBase => + + val syncCfg = RegInit(0.U(8.W)); cReg.syncCfg := syncCfg + + val syncWidth = for( i <- 0 until 4 ) yield { RegInit(0.U(16.W)) } + for( i <- 0 until 4 ) { + cReg.syncWidth(i) := syncWidth(i) + } + + val timeStampOffset = RegInit(0.U(64.W)); mReg.timeStampOffset := timeStampOffset + val timeStampOffset_WRCopy = RegInit(0.U(64.W)) + val syncPoint = RegInit("hFFFFFFFFFFFFFFFF".U(64.W)); cReg.syncPoint := syncPoint + val syncPoint_WRCopy = RegInit("hFFFFFFFFFFFFFFFF".U(64.W)) + val syncPeroid = RegInit(0.U(32.W)); cReg.syncPeroid := syncPeroid + + val syncOffset = for( i <- 0 until 4 ) yield { RegInit(0.U(32.W)) } //空开0 + for( i <- 0 until 4 ) { + cReg.syncOffset(i) := syncOffset(i) + } + + when( isEnW ){ + when( addrw === "h120".U ){ + syncCfg := dataw + } + + for( i <- 0 until 4 ){ + when( addrw === ("h122".U(16.W) + (2*i).U)){ + syncWidth(i) := Cat( syncWidth(i)(15,8), dataw ) + } .elsewhen( addrw === ("h123".U(16.W) + (2*i).U) ){ + syncWidth(i) := Cat( dataw, syncWidth(i)(7,0) ) + } + } + + when( addrw === "h130".U ){ + syncPoint_WRCopy := Cat( syncPoint_WRCopy(63,8), dataw ) + } .elsewhen( addrw === "h131".U ){ + syncPoint_WRCopy := Cat( syncPoint_WRCopy(63,16), dataw, syncPoint_WRCopy(7,0) ) + } .elsewhen( addrw === "h132".U ){ + syncPoint_WRCopy := Cat( syncPoint_WRCopy(63,24), dataw, syncPoint_WRCopy(15,0) ) + } .elsewhen( addrw === "h133".U ){ + syncPoint_WRCopy := Cat( syncPoint_WRCopy(63,32), dataw, syncPoint_WRCopy(23,0) ) + } .elsewhen( addrw === "h134".U ){ + syncPoint_WRCopy := Cat( syncPoint_WRCopy(63,40), dataw, syncPoint_WRCopy(31,0) ) + } .elsewhen( addrw === "h135".U ){ + syncPoint_WRCopy := Cat( syncPoint_WRCopy(63,48), dataw, syncPoint_WRCopy(39,0) ) + } .elsewhen( addrw === "h136".U ){ + syncPoint_WRCopy := Cat( syncPoint_WRCopy(63,56), dataw, syncPoint_WRCopy(47,0) ) + } .elsewhen( addrw === "h137".U ){ + syncPoint_WRCopy := Cat( dataw, syncPoint_WRCopy(55,0) ) + syncPoint := Cat( dataw, syncPoint_WRCopy(55,0) ) + } + + .elsewhen( addrw === "h138".U ){ + syncPeroid := Cat( syncPeroid(31,8), dataw ) + } .elsewhen( addrw === "h139".U ){ + syncPeroid := Cat( syncPeroid(31,16), dataw, syncPeroid(7,0) ) + } .elsewhen( addrw === "h13a".U ){ + syncPeroid := Cat( syncPeroid(31,24), dataw, syncPeroid(15,0) ) + } .elsewhen( addrw === "h13b".U ){ + syncPeroid := Cat( dataw, syncPeroid(23,0) ) + } + + .elsewhen( addrw === "h148".U ){ + timeStampOffset_WRCopy := Cat( timeStampOffset_WRCopy(63,8), dataw ) + } .elsewhen( addrw === "h149".U ){ + timeStampOffset_WRCopy := Cat( timeStampOffset_WRCopy(63,16), dataw, timeStampOffset_WRCopy(7,0) ) + } .elsewhen( addrw === "h14a".U ){ + timeStampOffset_WRCopy := Cat( timeStampOffset_WRCopy(63,24), dataw, timeStampOffset_WRCopy(15,0) ) + } .elsewhen( addrw === "h14b".U ){ + timeStampOffset_WRCopy := Cat( timeStampOffset_WRCopy(63,32), dataw, timeStampOffset_WRCopy(23,0) ) + } .elsewhen( addrw === "h14c".U ){ + timeStampOffset_WRCopy := Cat( timeStampOffset_WRCopy(63,40), dataw, timeStampOffset_WRCopy(31,0) ) + } .elsewhen( addrw === "h14d".U ){ + timeStampOffset_WRCopy := Cat( timeStampOffset_WRCopy(63,48), dataw, timeStampOffset_WRCopy(39,0) ) + } .elsewhen( addrw === "h14e".U ){ + timeStampOffset_WRCopy := Cat( timeStampOffset_WRCopy(63,56), dataw, timeStampOffset_WRCopy(47,0) ) + } .elsewhen( addrw === "h14f".U ){ + timeStampOffset_WRCopy := Cat( dataw, timeStampOffset_WRCopy(55,0) ) + timeStampOffset := Cat( dataw, timeStampOffset_WRCopy(55,0) ) + } + + + for( i <- 1 until 4 ){ + when( addrw === ("h13c".U(16.W) + (4*(i-1)).U) ){ + syncOffset(i) := Cat( syncOffset(i)(31,8), dataw ) + } .elsewhen( addrw === ("h13d".U(16.W) + (4*(i-1)).U) ){ + syncOffset(i) := Cat( syncOffset(i)(31,16), dataw, syncOffset(i)(7,0) ) + } .elsewhen( addrw === ("h13e".U(16.W) + (4*(i-1)).U) ){ + syncOffset(i) := Cat( syncOffset(i)(31,24), dataw, syncOffset(i)(15,0) ) + } .elsewhen( addrw === ("h13f".U(16.W) + (4*(i-1)).U) ){ + syncOffset(i) := Cat( dataw, syncOffset(i)(23,0) ) + } + } + } + + + when( io.lvds.isEnW ){ + + when( sReg.isLVDSWriteAble & io.lvds.addrw === "h120".U ){ + syncCfg := io.lvds.dataw + } + + for( i <- 0 until 4 ){ + when( io.lvds.addrw === ("h122".U(16.W) + (2*i).U)){ + syncWidth(i) := Cat( syncWidth(i)(15,8), io.lvds.dataw ) + } .elsewhen( io.lvds.addrw === ("h123".U(16.W) + (2*i).U) ){ + syncWidth(i) := Cat( io.lvds.dataw, syncWidth(i)(7,0) ) + } + } + + .elsewhen( io.lvds.addrw === "h130".U ){ + syncPoint_WRCopy := Cat( syncPoint_WRCopy(63,8), io.lvds.dataw ) + } .elsewhen( io.lvds.addrw === "h131".U ){ + syncPoint_WRCopy := Cat( syncPoint_WRCopy(63,16), io.lvds.dataw, syncPoint_WRCopy(7,0) ) + } .elsewhen( io.lvds.addrw === "h132".U ){ + syncPoint_WRCopy := Cat( syncPoint_WRCopy(63,24), io.lvds.dataw, syncPoint_WRCopy(15,0) ) + } .elsewhen( io.lvds.addrw === "h133".U ){ + syncPoint_WRCopy := Cat( syncPoint_WRCopy(63,32), io.lvds.dataw, syncPoint_WRCopy(23,0) ) + } .elsewhen( io.lvds.addrw === "h134".U ){ + syncPoint_WRCopy := Cat( syncPoint_WRCopy(63,40), io.lvds.dataw, syncPoint_WRCopy(31,0) ) + } .elsewhen( io.lvds.addrw === "h135".U ){ + syncPoint_WRCopy := Cat( syncPoint_WRCopy(63,48), io.lvds.dataw, syncPoint_WRCopy(39,0) ) + } .elsewhen( io.lvds.addrw === "h136".U ){ + syncPoint_WRCopy := Cat( syncPoint_WRCopy(63,56), io.lvds.dataw, syncPoint_WRCopy(47,0) ) + } .elsewhen( io.lvds.addrw === "h137".U ){ + syncPoint_WRCopy := Cat( io.lvds.dataw, syncPoint_WRCopy(55,0) ) + when( sReg.isLVDSWriteAble ){ + syncPoint := Cat( io.lvds.dataw, syncPoint_WRCopy(55,0) ) + } + } + + .elsewhen( io.lvds.addrw === "h138".U ){ + syncPeroid := Cat( syncPeroid(31,8), io.lvds.dataw ) + } .elsewhen( io.lvds.addrw === "h139".U ){ + syncPeroid := Cat( syncPeroid(31,16), io.lvds.dataw, syncPeroid(7,0) ) + } .elsewhen( io.lvds.addrw === "h13a".U ){ + syncPeroid := Cat( syncPeroid(31,24), io.lvds.dataw, syncPeroid(15,0) ) + } .elsewhen( io.lvds.addrw === "h13b".U ){ + syncPeroid := Cat( io.lvds.dataw, syncPeroid(23,0) ) + } + + for( i <- 1 until 4 ){ + when( io.lvds.addrw === ("h13c".U(16.W) + (4*(i-1)).U) ){ + syncOffset(i) := Cat( syncOffset(i)(31,8), io.lvds.dataw ) + } .elsewhen( io.lvds.addrw === ("h13d".U(16.W) + (4*(i-1)).U) ){ + syncOffset(i) := Cat( syncOffset(i)(31,16), io.lvds.dataw, syncOffset(i)(7,0) ) + } .elsewhen( io.lvds.addrw === ("h13e".U(16.W) + (4*(i-1)).U) ){ + syncOffset(i) := Cat( syncOffset(i)(31,24), io.lvds.dataw, syncOffset(i)(15,0) ) + } .elsewhen( io.lvds.addrw === ("h13f".U(16.W) + (4*(i-1)).U) ){ + syncOffset(i) := Cat( io.lvds.dataw, syncOffset(i)(23,0) ) + } + } + } + + cReg.timeStamp := RegNext( cReg.timeStamp + 1.U, 1.U(64.W) ) + cReg.mstDeltaTime := io.mstDeltaTime + + + sReg.deltaFinal := io.deltaFinal + cReg.recoTimeStamp := + Mux(isMstMode, cReg.timeStamp + mReg.timeStampOffset, + RegNext( cReg.timeStamp + sReg.deltaFinal, 0.U(64.W) ) + ) + sReg.slvDeltaTime := io.slvDeltaTime + + val syncSign = for( i <- 0 until 4 ) yield { RegInit(false.B) } + val syncOffsetCnt = for( i <- 0 until 4 ) yield { RegInit("hFFFFFFFF".U(32.W)) } //空开第0位 + val syncResetCnt = for( i <- 0 until 4 ) yield { RegInit(0.U(16.W)) } //空开第0位 + + val recoTimeStamp_Copy = RegInit(1.U(64.W)) + + + when( + cReg.syncPoint === recoTimeStamp_Copy || + (io.lvds.addrw === "h120".U & io.lvds.isEnW) || //写syncCfg + (io.lvds.addrw === "h137".U & io.lvds.isEnW) || //写syncPoint + (io.lvds.addrw === "h13B".U & io.lvds.isEnW) || //写syncPeroid + (addrw === "h120".U & isEnW) || //写syncCfg + (addrw === "h137".U & isEnW) || //写syncPoint + (addrw === "h13B".U & isEnW) //写syncPeroid + ){ + recoTimeStamp_Copy := cReg.timeStamp + sReg.deltaFinal + } .otherwise{ + recoTimeStamp_Copy := recoTimeStamp_Copy + 1.U + } + + + when( cReg.syncPoint === recoTimeStamp_Copy ){ //时间到达sync0时间点 + syncSign(0) := true.B + } .elsewhen( ~cReg.syncCfg(4+0) & syncResetCnt(0) === cReg.syncWidth(0) ){ + syncSign(0) := false.B + } .elsewhen( cReg.syncCfg(4+0) & isEnW & addrw === "h122".U ){ + syncSign(0) := false.B + } + + when( cReg.syncPoint <= recoTimeStamp_Copy ){ + syncPoint := syncPoint + cReg.syncPeroid + } + + + for( i <- 1 until 4 ) { + + when( cReg.syncPoint === recoTimeStamp_Copy ){ //时间到达sync0时间点 + syncOffsetCnt(i) := 0.U + } .elsewhen( syncOffsetCnt(i) < cReg.syncOffset(i) ){ + syncOffsetCnt(i) := syncOffsetCnt(i) + 1.U + } .elsewhen( syncOffsetCnt(i) === cReg.syncOffset(i) ){ + syncOffsetCnt(i) := "hFFFFFFFF".U(32.W) + } + + when( syncOffsetCnt(i) === cReg.syncOffset(i) ){ + syncSign(i) := true.B + } .elsewhen( ~cReg.syncCfg(4+i) & syncResetCnt(i) === cReg.syncWidth(i) ){ + syncSign(i) := false.B + } .elsewhen( cReg.syncCfg(4+i) & isEnW & addrw === ("h122".U(16.W) + (2*i).U) ){ + syncSign(i) := false.B + } + + } + + for( i <- 0 until 4 ){ + when( ~cReg.syncCfg(4+i) ){ + when( syncSign(i) ){ + syncResetCnt(i) := syncResetCnt(i) + 1.U + } .otherwise{ + syncResetCnt(i) := 0.U + } + } + } + + io.sync(0) := cReg.syncCfg.extract(0) & syncSign(0) + io.sync(1) := cReg.syncCfg.extract(1) & syncSign(1) + io.sync(2) := cReg.syncCfg.extract(2) & syncSign(2) + io.sync(3) := cReg.syncCfg.extract(3) & syncSign(3) + + +} + +trait InterfaceWdt{ this: InterfaceBase => + val wdtStatus = for( i <- 0 until 18 ) yield { RegInit(false.B) } //1+16+1 + cReg.wdtStatus := Cat( wdtStatus.reverse ) + + for( i <- 0 until 8 ){ + when( isEnW & addrw === "h400".U & dataw.extract(i) ){ + wdtStatus(i) := false.B + } .elsewhen(io.wdtTrigger(i) & cReg.wdtEnable.extract(i)){ + wdtStatus(i) := true.B + } + when( isEnW & addrw === "h401".U & dataw.extract(i) ){ + wdtStatus(8+i) := false.B + } .elsewhen(io.wdtTrigger(8+i) & cReg.wdtEnable.extract(8+i)){ + wdtStatus(8+i) := true.B + } + } + for( i <- 0 until 2 ){ + when( isEnW & addrw === "h402".U & dataw.extract(i) ){ + wdtStatus(16+i) := false.B + } .elsewhen(io.wdtTrigger(16+i) & cReg.wdtEnable.extract(16+i)){ + wdtStatus(16+i) := true.B + } + } + + cReg.wdtEnable := + Cat( + RegEnable( dataw(1,0), 0.U(2.W), isEnW & addrw === "h406".U ), + RegEnable( dataw, 0.U(8.W), isEnW & addrw === "h405".U ), + RegEnable( dataw, 0.U(8.W), isEnW & addrw === "h404".U ), + ) + + for( i <- 0 until 18 ){ + cReg.wdtTarCnt(i) := + Cat( + RegEnable( dataw, "hFF".U(8.W), isEnW & addrw === ( "h40b".U (16.W) + (4*i).U ) ), + RegEnable( dataw, "hFF".U(8.W), isEnW & addrw === ( "h40a".U (16.W) + (4*i).U ) ), + RegEnable( dataw, "hFF".U(8.W), isEnW & addrw === ( "h409".U (16.W) + (4*i).U ) ), + RegEnable( dataw, "hFF".U(8.W), isEnW & addrw === ( "h408".U (16.W) + (4*i).U ) ), + ) + } +} + +trait InterfaceSystem{ this: InterfaceBase => + io.isSoftReset := + cReg.softResetCode(0) === "h01".U & + cReg.softResetCode(1) === "h00".U & + cReg.softResetCode(2) === "h66".U & + cReg.softResetCode(3) === "h79".U + + cReg.softResetCode(0) := RegEnable(dataw, 0.U(8.W), isEnW & addrw === "h40".U ) + cReg.softResetCode(1) := RegEnable(dataw, 0.U(8.W), isEnW & addrw === "h41".U ) + cReg.softResetCode(2) := RegEnable(dataw, 0.U(8.W), isEnW & addrw === "h42".U ) + cReg.softResetCode(3) := RegEnable(dataw, 0.U(8.W), isEnW & addrw === "h43".U ) + + + val dwupExTemp = RegEnable(dataw, 0.U(8.W), isEnW & addrw === "h4a".U ) + cReg.dwupEx := RegEnable(dwupExTemp, 0.U(8.W), isEnW & addrw === "h4b".U & dataw === "h58".U ) + + val b8b4SelTemp = RegEnable(dataw, 0.U(8.W), isEnW & addrw === "h4c".U ) + cReg.b8b4Sel := RegEnable(b8b4SelTemp, 0.U(8.W), isEnW & addrw === "h4d".U & dataw === "h59".U ) + + val cdrParamTemp = RegEnable(dataw, 0.U(8.W), isEnW & addrw === "h4e".U ) + cReg.cdrParam := RegEnable(cdrParamTemp, 0.U(8.W), isEnW & addrw === "h4f".U & dataw === "h60".U ) + + val lvdsWriteAble = RegInit(0.U(16.W)); sReg.lvdsWriteAble := lvdsWriteAble + when( io.lvds.isEnW & (io.lvds.addrw === "h19".U(16.W)) ){ + lvdsWriteAble := Cat( io.lvds.dataw, lvdsWriteAble(7,0) ) + } .elsewhen( isEnW & (addrw === "h19".U(16.W)) ){ + lvdsWriteAble := Cat( dataw, lvdsWriteAble(7,0) ) + } .elsewhen( io.lvds.isEnW & (io.lvds.addrw === "h18".U(16.W)) ){ + lvdsWriteAble := Cat( lvdsWriteAble(15,8), io.lvds.dataw ) + } .elsewhen( isEnW & (addrw === "h18".U(16.W)) ){ + lvdsWriteAble := Cat( lvdsWriteAble(15,8), dataw ) + } + + +} + +trait InterfaceInterrupt{ this: InterfaceBase => + cReg.intEnable := + Cat( + 1.U(1.W), //复位中断,时钟为1 //31 上电复位 + 1.U(1.W), //复位中断,时钟为1 //30 上行硬件错误 + 1.U(1.W), //复位中断,时钟为1 //29 下行硬件错误 + RegEnable( dataw(4,0), 0.U(5.W), isEnW & addrw === "h73".U ), + RegEnable( dataw, 0.U(8.W), isEnW & addrw === "h72".U ), + RegEnable( dataw, 0.U(8.W), isEnW & addrw === "h71".U ), + RegEnable( dataw, 0.U(8.W), isEnW & addrw === "h70".U ), + ) + + val intStatus = for( i <- 0 until 32 ) yield { + if( i != 31 ) {RegInit(false.B)} else { RegInit(true.B) } + } + cReg.intStatus := Cat( intStatus.reverse ) + io.isPoReset := intStatus(31) + + cReg.intMode := + Cat( + RegEnable( dataw, 0.U(8.W), isEnW & addrw === "h7d".U ), + RegEnable( dataw, 0.U(8.W), isEnW & addrw === "h7c".U ), + ) + + val isLevelInt = cReg.intMode.extract(15) === false.B + val isPulseInt = cReg.intMode.extract(15) === true.B + val intPulseWidth = cReg.intMode(14,0) + + //主站发送完成 + when( io.intMstTrig(0) ){ + intStatus(0) := true.B + } + + //主站接收完成 + when( io.intMstTrig(1) ){ + intStatus(1) := true.B + } + + + //外部latch中断 + val isLatchEvent = + (RegNext( cReg.event.latchStatus(0), false.B ) =/= cReg.event.latchStatus(0)) | + (RegNext( cReg.event.latchStatus(1), false.B ) =/= cReg.event.latchStatus(1)) + + when(isLatchEvent){ + intStatus(3) := true.B + } + + //看门狗溢出 + val isWdtTrigAndEnable = (0 until 18).map{ i => (io.wdtTrigger(i) & cReg.wdtEnable(i))}.reduce(_|_) + when( isWdtTrigAndEnable ){ + intStatus(4) := true.B + } + + //从站SM请求 + for( i <- 0 until 8 ){ + when( io.intSlvTrig(i) ){ + intStatus(8+i) := true.B + } + } + + //传输完成请求 16,17,18,19 + //主站状态下19为上行crc接收错误 + for( i <- 0 until 4 ){ + when( io.intTransEnd(i) ){ + intStatus(16+i) := true.B + } + } + + //override + //主站状态下19为上行crc接收错误 + val isMstRecCRCErr = io.upRecStat.isCRCError & isMstMode + when( isMstRecCRCErr ){ + intStatus(19) := true.B + } + + + val intHWErr = Seq( + ( ~RegNext(io.intHWTrig(0), false.B) & io.intHWTrig(0)), + ( ~RegNext(io.intHWTrig(1), false.B) & io.intHWTrig(1)) + ) + //下行接收硬件错误 + when( intHWErr(0) ){ + intStatus(29) := true.B + } + //上行接收硬件错误 + when( intHWErr(1) ){ + intStatus(30) := true.B + } + + + //写清中断 + for( i <- 0 until 8 ){ + when( dataw.extract(i) & isEnW & addrw === "h78".U ){ + intStatus(i) := false.B + } + when( dataw.extract(i) & isEnW & addrw === "h79".U ){ + intStatus(i+8) := false.B + } + when( dataw.extract(i) & isEnW & addrw === "h7a".U ){ + intStatus(i+16) := false.B + } + when( dataw.extract(i) & isEnW & addrw === "h7b".U ){ + intStatus(i+24) := false.B + } + } + + io.intHWClr(0) := dataw.extract(5) & isEnW & addrw === "h7b".U + io.intHWClr(1) := dataw.extract(6) & isEnW & addrw === "h7b".U + + val intPulse = RegInit(false.B) + val intPulseResetCnt = RegInit(0.U(15.W)) + + val trigIntPulse = + (io.intMstTrig(0) & cReg.intEnable(0)) | //主站发送完成 + (io.intMstTrig(1) & cReg.intEnable(1)) | //主站接收完成 + (isLatchEvent & cReg.intEnable(3)) | //latch Event + (isWdtTrigAndEnable & cReg.intEnable(4)) | //主站接收看门狗溢出 + (0 until 8).map{ i => io.intSlvTrig(i) & cReg.intEnable(8+i)}.reduce(_|_) | //从站SM请求 + (0 until 4).map{ i => io.intTransEnd(i) & cReg.intEnable(16+i)}.reduce(_|_) | //传输完成请求 16,17,18,19 + isMstRecCRCErr | //override //主站状态下19为上行crc接收错误 //不会同时发生 + intHWErr(0) | //下行接收硬件错误 + intHWErr(1) //上行接收硬件错误 + + when( trigIntPulse ){ + intPulse := true.B + } .elsewhen( intPulseResetCnt === intPulseWidth ){ + intPulse := false.B + } + + when( trigIntPulse ){ + intPulseResetCnt := 0.U + } .elsewhen( (intPulseResetCnt <= intPulseWidth) & (intPulse === true.B) ){ + intPulseResetCnt := intPulseResetCnt + 1.U + } + + io.interrupt := Mux( isLevelInt, (cReg.intStatus & cReg.intEnable).orR, intPulse) +} + +trait InterfaceEvent{ this: InterfaceBase => + val isPosedgeOnce = for( i <- 0 until 2 ) yield RegEnable( dataw.extract(2), false.B, isEnW & ( addrw === ( "h500".U + (i*2).U ) )) + val isNegedgeOnce = for( i <- 0 until 2 ) yield RegEnable( dataw.extract(3), false.B, isEnW & ( addrw === ( "h500".U + (i*2).U ) )) + + val isPosedgeLatch = for( i <- 0 until 2 ) yield RegInit(false.B) + val isNegedgeLatch = for( i <- 0 until 2 ) yield RegInit(false.B) + + + val posedgeTimeStampLatch = for( i <- 0 until 2 ) yield RegInit(0.U(64.W)) + val negedgeTimeStampLatch = for( i <- 0 until 2 ) yield RegInit(0.U(64.W)) + + val mcuSMTimeStampEnq = RegInit(0.U(64.W)) + val mcuSMTimeStampDeq = RegInit(0.U(64.W)) + val lvdsSMTimeStampEnq = RegInit(0.U(64.W)) + val lvdsSMTimeStampDeq = RegInit(0.U(64.W)) + + for( i <- 0 until 2 ){ + when( dataw.extract(0) & isEnW & ( addrw === ( "h500".U + (i*2).U ) ) ){ + isPosedgeLatch(i):= false.B + posedgeTimeStampLatch(i) := 0.U + } .elsewhen( ~RegNext(io.latchPin(i), false.B) & io.latchPin(i) ){ + when( isPosedgeOnce(i) ){ + isPosedgeLatch(i) := true.B + } + when(~isPosedgeLatch(i)){ + posedgeTimeStampLatch(i) := cReg.recoTimeStamp + } + } + + when( dataw.extract(1) & isEnW & ( addrw === ( "h500".U + (i*2).U ) ) ){ + isNegedgeLatch(i) := false.B + negedgeTimeStampLatch(i) := 0.U + } .elsewhen( RegNext(io.latchPin(i), false.B) & ~io.latchPin(i) ){ + when( isNegedgeOnce(i) ){ + isNegedgeLatch(i) := true.B + } + when(~isNegedgeLatch(i)){ + negedgeTimeStampLatch(i) := cReg.recoTimeStamp + } + } + + when( io.uSMenq.reduce(_|_) ){ + mcuSMTimeStampEnq := cReg.recoTimeStamp + } + + when( io.dSMdeq.reduce(_|_) ){ + mcuSMTimeStampDeq := cReg.recoTimeStamp + } + + when( io.lvdsSMEnq.reduce(_|_) ){ + lvdsSMTimeStampEnq := cReg.recoTimeStamp + } + + when( io.lvdsSMDeq.reduce(_|_) ){ + lvdsSMTimeStampDeq := cReg.recoTimeStamp + } + + cReg.event.latchCtl(i) := (isPosedgeOnce(i) << 2) | (isNegedgeOnce(i) << 3) + + cReg.event.latchStatus(i) := Cat( io.latchPin(i), isNegedgeLatch(i), isPosedgeLatch(i) ) + cReg.event.posedgeTimeStampLatch(i) := posedgeTimeStampLatch(i) + cReg.event.negedgeTimeStampLatch(i) := negedgeTimeStampLatch(i) + } + + cReg.event.mcuSMTimeStampEnq := mcuSMTimeStampEnq + cReg.event.mcuSMTimeStampDeq := mcuSMTimeStampDeq + cReg.event.lvdsSMTimeStampEnq := lvdsSMTimeStampEnq + cReg.event.lvdsSMTimeStampDeq := lvdsSMTimeStampDeq +} + +trait InterfaceAnalog{ this: InterfaceBase => + cReg.pllCtrl := + Cat( + RegEnable( dataw, "h80".U(8.W), isEnW & addrw === "h47".U ), + RegEnable( dataw, "h00".U(8.W), isEnW & addrw === "h46".U ), + RegEnable( dataw, "h31".U(8.W), isEnW & addrw === "h45".U ), + RegEnable( dataw, "h3c".U(8.W), isEnW & addrw === "h44".U ) + ) + + cReg.xtal := + Cat( + RegEnable( dataw, "h05".U(8.W), isEnW & addrw === "h49".U ), + RegEnable( dataw, "h15".U(8.W), isEnW & addrw === "h48".U ) + ) + + + cReg.anamuxSel := RegEnable( dataw, "h0".U(8.W), isEnW & addrw === "h50".U ) + cReg.ldo2p5 := RegEnable( dataw, "h87".U(8.W), isEnW & addrw === "h51".U ) + cReg.ldo1p1 := RegEnable( dataw, "h87".U(8.W), isEnW & addrw === "h52".U ) + cReg.refTop := RegEnable( dataw, "h0".U(8.W), isEnW & addrw === "h53".U ) + cReg.bias := RegEnable( dataw, "h0".U(8.W), isEnW & addrw === "h54".U ) + cReg.div4 := RegEnable( dataw(3,0), "h1".U(4.W), isEnW & addrw === "h55".U ) + + io.isPllCfg := isEnW & addrw === "h45".U +} + +trait InterfaceStat{ this: InterfaceBase => + + val statDownRecErrorCnt = RegInit(0.U(32.W)); cReg.statDownRecErrorCnt := statDownRecErrorCnt + val statDownRecHeaderErrorCnt = RegInit(0.U(16.W)); cReg.statDownRecHeaderErrorCnt := statDownRecHeaderErrorCnt + val statDownRecSubHeaderErrorCnt = RegInit(0.U(16.W)); cReg.statDownRecSubHeaderErrorCnt := statDownRecSubHeaderErrorCnt + val statDownRecPayloadErrorCnt = RegInit(0.U(16.W)); cReg.statDownRecPayloadErrorCnt := statDownRecPayloadErrorCnt + val statDownRecSubTailErrorCnt = RegInit(0.U(16.W)); cReg.statDownRecSubTailErrorCnt := statDownRecSubTailErrorCnt + val statDownRecCRCErrorCnt = RegInit(0.U(16.W)); cReg.statDownRecCRCErrorCnt := statDownRecCRCErrorCnt + val statDownRecFinishCnt = RegInit(0.U(32.W)); cReg.statDownRecFinishCnt := statDownRecFinishCnt + val statDownRecByteCnt = RegInit(0.U(64.W)); cReg.statDownRecByteCnt := statDownRecByteCnt + + val statUpRecErrorCnt = RegInit(0.U(32.W)); cReg.statUpRecErrorCnt := statUpRecErrorCnt + val statUpRecHeaderErrorCnt = RegInit(0.U(16.W)); cReg.statUpRecHeaderErrorCnt := statUpRecHeaderErrorCnt + val statUpRecSubHeaderErrorCnt = RegInit(0.U(16.W)); cReg.statUpRecSubHeaderErrorCnt := statUpRecSubHeaderErrorCnt + val statUpRecPayloadErrorCnt = RegInit(0.U(16.W)); cReg.statUpRecPayloadErrorCnt := statUpRecPayloadErrorCnt + val statUpRecSubTailErrorCnt = RegInit(0.U(16.W)); cReg.statUpRecSubTailErrorCnt := statUpRecSubTailErrorCnt + val statUpRecCRCErrorCnt = RegInit(0.U(16.W)); cReg.statUpRecCRCErrorCnt := statUpRecCRCErrorCnt + val statUpRecFinishCnt = RegInit(0.U(32.W)); cReg.statUpRecFinishCnt := statUpRecFinishCnt + val statUpRecByteCnt = RegInit(0.U(64.W)); cReg.statUpRecByteCnt := statUpRecByteCnt + + + + when(io.lvds.isEnW & (io.lvds.addrw === "h80".U )){ + statDownRecErrorCnt := 0.U + } .elsewhen( io.downRecStat.isRecError ){ + statDownRecErrorCnt := statDownRecErrorCnt + 1.U + } + + when(io.lvds.isEnW & (io.lvds.addrw === "h82".U )){ + statDownRecHeaderErrorCnt := 0.U + } .elsewhen( io.downRecStat.isHeaderError ){ + statDownRecHeaderErrorCnt := statDownRecHeaderErrorCnt + 1.U + } + + when(io.lvds.isEnW & (io.lvds.addrw === "h84".U )){ + statDownRecSubHeaderErrorCnt := 0.U + } .elsewhen( io.downRecStat.isSubHeaderError ){ + statDownRecSubHeaderErrorCnt := statDownRecSubHeaderErrorCnt + 1.U + } + + when(io.lvds.isEnW & (io.lvds.addrw === "h86".U )){ + statDownRecPayloadErrorCnt := 0.U + } .elsewhen( io.downRecStat.isPayloadError ){ + statDownRecPayloadErrorCnt := statDownRecPayloadErrorCnt + 1.U + } + + when(io.lvds.isEnW & (io.lvds.addrw === "h88".U )){ + statDownRecSubTailErrorCnt := 0.U + } .elsewhen( io.downRecStat.isSubTailError ){ + statDownRecSubTailErrorCnt := statDownRecSubTailErrorCnt + 1.U + } + + when(io.lvds.isEnW & (io.lvds.addrw === "h8a".U )){ + statDownRecCRCErrorCnt := 0.U + } .elsewhen( io.downRecStat.isCRCError ){ + statDownRecCRCErrorCnt := statDownRecCRCErrorCnt + 1.U + } + + when(io.lvds.isEnW & (io.lvds.addrw === "h8c".U )){ + statDownRecFinishCnt := 0.U + } .elsewhen( io.downRecStat.isFinish ){ + statDownRecFinishCnt := statDownRecFinishCnt + 1.U + } + + when(io.lvds.isEnW & (io.lvds.addrw === "h90".U )){ + statDownRecByteCnt := 0.U + } .elsewhen( io.downRecStat.isRecByteAck ){ + statDownRecByteCnt := statDownRecByteCnt + 1.U + } + + when(io.lvds.isEnW & (io.lvds.addrw === "ha0".U )){ + statUpRecErrorCnt := 0.U + } .elsewhen( io.upRecStat.isRecError ){ + statUpRecErrorCnt := statUpRecErrorCnt + 1.U + } + + when(io.lvds.isEnW & (io.lvds.addrw === "ha2".U )){ + statUpRecHeaderErrorCnt := 0.U + } .elsewhen( io.upRecStat.isHeaderError ){ + statUpRecHeaderErrorCnt := statUpRecHeaderErrorCnt + 1.U + } + + when(io.lvds.isEnW & (io.lvds.addrw === "ha4".U )){ + statUpRecSubHeaderErrorCnt := 0.U + } .elsewhen( io.upRecStat.isSubHeaderError ){ + statUpRecSubHeaderErrorCnt := statUpRecSubHeaderErrorCnt + 1.U + } + + when(io.lvds.isEnW & (io.lvds.addrw === "ha6".U )){ + statUpRecPayloadErrorCnt := 0.U + } .elsewhen( io.upRecStat.isPayloadError ){ + statUpRecPayloadErrorCnt := statUpRecPayloadErrorCnt + 1.U + } + + when(io.lvds.isEnW & (io.lvds.addrw === "ha8".U )){ + statUpRecSubTailErrorCnt := 0.U + } .elsewhen( io.upRecStat.isSubTailError ){ + statUpRecSubTailErrorCnt := statUpRecSubTailErrorCnt + 1.U + } + + when(io.lvds.isEnW & (io.lvds.addrw === "haa".U )){ + statUpRecCRCErrorCnt := 0.U + } .elsewhen( io.upRecStat.isCRCError ){ + statUpRecCRCErrorCnt := statUpRecCRCErrorCnt + 1.U + } + + when(io.lvds.isEnW & (io.lvds.addrw === "hac".U )){ + statUpRecFinishCnt := 0.U + } .elsewhen( io.upRecStat.isFinish ){ + statUpRecFinishCnt := statUpRecFinishCnt + 1.U + } + + when(io.lvds.isEnW & (io.lvds.addrw === "hb0".U )){ + statUpRecByteCnt := 0.U + } .elsewhen( io.upRecStat.isRecByteAck ){ + statUpRecByteCnt := statUpRecByteCnt + 1.U + } + + +} + + + +class Interface extends InterfaceBase +with InterfaceMCUop +with InterfaceCheckSM +with InterfaceEBMMU +with InterfaceSync +with InterfaceStat +with InterfaceWdt +with InterfaceSystem +with InterfaceInterrupt +with InterfaceEvent +with InterfaceAnalog +{ + cReg.hwVersion := "h1".U + cReg.hwSerial := io.hwSerial + cReg.uniCode := io.uniCode + + + io.txReq.bits.txSM := mReg.txSM + io.txReq.bits.rxSM := mReg.rxSM + io.txReq.valid := RegNext(isEnW & addrw === "h20".U & dataw.extract(0) === "b1".U, false.B) + + + sReg.localDevIndex := io.localDevIndex + + sReg.isDevOnRight := io.isDevOnRight + sReg.isDevOnRightModify := io.isDevOnRightModify + sReg.indexOfRightDev := io.indexOfRightDev + +} + diff --git a/src/main/scala/backBoard/shin/MasterParser.scala b/src/main/scala/backBoard/shin/MasterParser.scala index 9ce1cb6..4422594 100644 --- a/src/main/scala/backBoard/shin/MasterParser.scala +++ b/src/main/scala/backBoard/shin/MasterParser.scala @@ -1,210 +1,210 @@ -package BACK - -import chisel3._ -import chisel3.util._ - -class MasterParserIO extends Bundle{ - val downOut = Decoupled(new AXIS_Bundle(8)) - val upIn = Flipped( Decoupled(new AXIS_Bundle(8)) ) - - val sram_w = Flipped(new SRAM2kWRIO) - val sram_r = Flipped(new SRAM2kRDIO) - - val req = Input(Bool()) - val rsp = Valid(new Bundle{ - val isError = Bool() - }) - - val rxEnq = Output( Bool()) - val txDeq = Output( Bool()) - - val cReg = Input(new CommonRegisterBundle) - val mReg = Input(new MasterRegisterBundle) - - val deltaTimeStamp = Output(UInt(32.W)) - - val upRecStat = Output(new Stat_IO_Bundle) - -} - -abstract class MasterParserBase extends Module with RequireAsyncReset{ - val io: MasterParserIO = IO(new MasterParserIO) - - val txCnt = RegInit(0.U(12.W)) - val txLen = RegInit(0.U(11.W)) - val txAddr = RegInit(0.U(15.W)) - val rxCnt = RegInit(0.U(12.W)) - val rxLen = RegInit(0.U(11.W)) - val rxAddr = RegInit(0.U(15.W)) - - val reqReady = RegInit(true.B) - - - val txcrc = Module(new crc32_8) - val rxcrc = Module(new crc32_8) - - when( io.req ){ - reqReady := false.B - } .elsewhen( io.downOut.fire & txCnt === txLen + (4-1).U ){ - reqReady := true.B - } - - when( io.req ){ - txLen := Mux1H(Seq( - ( io.mReg.txSM === 0.U ) -> io.cReg.smTrigLen(1), - ( io.mReg.txSM === 1.U ) -> io.cReg.smTrigLen(3), - ( io.mReg.txSM === 2.U ) -> io.cReg.smTrigLen(5), - ( io.mReg.txSM === 3.U ) -> io.cReg.smTrigLen(7), - )) - rxLen := Mux1H(Seq( - ( io.mReg.rxSM === 0.U ) -> io.cReg.smTrigLen(0), - ( io.mReg.rxSM === 1.U ) -> io.cReg.smTrigLen(2), - ( io.mReg.rxSM === 2.U ) -> io.cReg.smTrigLen(4), - ( io.mReg.rxSM === 3.U ) -> io.cReg.smTrigLen(6), - )) - txCnt := 0.U - } .elsewhen( io.downOut.fire ){ - txCnt := txCnt + 1.U - } - - when( io.req ){ - txAddr := 0.U - } .elsewhen( io.downOut.fire ){ - txAddr := txAddr + 1.U - } - - when( io.req ){ - rxAddr := 0.U - } .elsewhen( io.upIn.fire ){ - rxAddr := rxAddr + 1.U - } - - - - io.sram_r.enr := - io.req | io.downOut.fire - - io.sram_r.addrr := Mux( io.req, 0.U, txAddr + 1.U ) - - io.downOut.valid := ~reqReady - - - val isRplTimeStamp = io.mReg.rplTimeStampTx.extract(15) - val isRplDeltaStamp = io.mReg.rplTimeStampTx.extract(14) - val rplCnt0 = io.mReg.rplTimeStampTx(10,0) + 0.U - val rplCnt1 = io.mReg.rplTimeStampTx(10,0) + 1.U - val rplCnt2 = io.mReg.rplTimeStampTx(10,0) + 2.U - val rplCnt3 = io.mReg.rplTimeStampTx(10,0) + 3.U - val rplCnt4 = io.mReg.rplTimeStampTx(10,0) + 4.U - val rplCnt5 = io.mReg.rplTimeStampTx(10,0) + 5.U - val rplCnt6 = io.mReg.rplTimeStampTx(10,0) + 6.U - val rplCnt7 = io.mReg.rplTimeStampTx(10,0) + 7.U - val rplCnt8 = io.mReg.rplTimeStampTx(10,0) + 8.U - val rplCnt9 = io.mReg.rplTimeStampTx(10,0) + 9.U - val rplCnt10 = io.mReg.rplTimeStampTx(10,0) + 10.U - val rplCnt11 = io.mReg.rplTimeStampTx(10,0) + 11.U - - - io.downOut.bits.tdata := Mux1H(Seq( - ( txCnt < txLen ) -> - MuxCase( io.sram_r.datar, Array( - ( isRplTimeStamp & ( txCnt === rplCnt0 ) ) -> RegEnable(io.cReg.recoTimeStamp(7,0), 0.U(8.W), io.downOut.fire & txCnt === 0.U ), - ( isRplTimeStamp & ( txCnt === rplCnt1 ) ) -> RegEnable(io.cReg.recoTimeStamp(15,8), 0.U(8.W), io.downOut.fire & txCnt === 0.U ), - ( isRplTimeStamp & ( txCnt === rplCnt2 ) ) -> RegEnable(io.cReg.recoTimeStamp(23,16), 0.U(8.W), io.downOut.fire & txCnt === 0.U ), - ( isRplTimeStamp & ( txCnt === rplCnt3 ) ) -> RegEnable(io.cReg.recoTimeStamp(31,24), 0.U(8.W), io.downOut.fire & txCnt === 0.U ), - ( isRplTimeStamp & ( txCnt === rplCnt4 ) ) -> RegEnable(io.cReg.recoTimeStamp(39,32), 0.U(8.W), io.downOut.fire & txCnt === 0.U ), - ( isRplTimeStamp & ( txCnt === rplCnt5 ) ) -> RegEnable(io.cReg.recoTimeStamp(47,40), 0.U(8.W), io.downOut.fire & txCnt === 0.U ), - ( isRplTimeStamp & ( txCnt === rplCnt6 ) ) -> RegEnable(io.cReg.recoTimeStamp(55,48), 0.U(8.W), io.downOut.fire & txCnt === 0.U ), - ( isRplTimeStamp & ( txCnt === rplCnt7 ) ) -> RegEnable(io.cReg.recoTimeStamp(63,56), 0.U(8.W), io.downOut.fire & txCnt === 0.U ), - ( isRplDeltaStamp & ( txCnt === rplCnt8 ) ) -> io.cReg.mstDeltaTime(7,0), - ( isRplDeltaStamp & ( txCnt === rplCnt9 ) ) -> io.cReg.mstDeltaTime(15,8), - ( isRplDeltaStamp & ( txCnt === rplCnt10 ) ) -> io.cReg.mstDeltaTime(23,16), - ( isRplDeltaStamp & ( txCnt === rplCnt11 ) ) -> io.cReg.mstDeltaTime(31,24), - )), - ( txCnt === txLen + 0.U ) -> txcrc.io.crc(31,24), - ( txCnt === txLen + 1.U ) -> txcrc.io.crc(23,16), - ( txCnt === txLen + 2.U ) -> txcrc.io.crc(15, 8), - ( txCnt === txLen + 3.U ) -> txcrc.io.crc( 7, 0), - )) - io.downOut.bits.tuser := false.B - io.downOut.bits.tlast := txCnt === (txLen + 3.U) - - val recCrcCheck = RegInit(0.U(32.W)) - - when( io.req ){ - rxCnt := 0.U - } .elsewhen( io.upIn.fire ){ - rxCnt := rxCnt + 1.U - } - - - io.upIn.ready := true.B - - io.sram_w.enw := io.upIn.fire - io.sram_w.addrw := rxAddr - io.sram_w.dataw := io.upIn.bits.tdata - - - io.rsp.valid := io.upIn.fire & io.upIn.bits.tlast - io.rsp.bits.isError := io.upIn.fire & io.upIn.bits.tlast & (Cat( recCrcCheck(31,8), io.upIn.bits.tdata ) =/= rxcrc.io.crc) - - io.rxEnq := io.upIn.fire & io.upIn.bits.tlast - io.txDeq := io.downOut.fire & io.downOut.bits.tlast - - txcrc.io.isEnable := io.downOut.fire & txCnt < txLen - txcrc.io.dataIn := io.downOut.bits.tdata - txcrc.io.flush := reqReady - - rxcrc.io.isEnable := io.upIn.fire & rxCnt < rxLen - rxcrc.io.dataIn := io.upIn.bits.tdata - rxcrc.io.flush := io.rsp.fire - - when( io.upIn.fire ){ - when( rxCnt === rxLen ){ - recCrcCheck := io.upIn.bits.tdata << 24 - } .elsewhen( rxCnt === (rxLen + 1.U) ){ - recCrcCheck := Cat( recCrcCheck(31,24), io.upIn.bits.tdata, recCrcCheck(15,0) ) - } .elsewhen( rxCnt === (rxLen + 2.U) ){ - recCrcCheck := Cat( recCrcCheck(31,16), io.upIn.bits.tdata, recCrcCheck( 7,0) ) - } .elsewhen( rxCnt === (rxLen + 3.U) ){ - recCrcCheck := Cat( recCrcCheck(31,8), io.upIn.bits.tdata ) - } - } - - -} - - -trait MasterParserStat{ this: MasterParserBase => - io.upRecStat.isHeaderError := false.B - io.upRecStat.isSubHeaderError := false.B - io.upRecStat.isPayloadError := false.B - io.upRecStat.isSubTailError := false.B - io.upRecStat.isCRCError := io.rsp.valid & io.rsp.bits.isError - io.upRecStat.isFinish := io.rsp.valid & ~io.rsp.bits.isError - io.upRecStat.isRecByteAck := io.upIn.fire - -} - -class MasterParser extends MasterParserBase -with MasterParserStat{ - val deltaTimeStamp = RegInit(0.U(32.W)) - // dontTouch(deltaTimeStamp) - io.deltaTimeStamp := deltaTimeStamp - - val txStamps = RegInit(0.U(32.W)) - val pkgChkCnt = RegInit(0.U(4.W)) - - when( io.upIn.fire & io.upIn.bits.tlast ){ - pkgChkCnt := 0.U - } .elsewhen( io.downOut.fire & pkgChkCnt =/= 9.U ){ - pkgChkCnt := pkgChkCnt + 1.U - } - - - when( io.downOut.fire & io.downOut.bits.tlast ){ - txStamps := io.cReg.timeStamp(31,0) - } .elsewhen( io.upIn.fire & io.upIn.bits.tlast & ~io.upIn.bits.tuser & pkgChkCnt === 9.U ){ - deltaTimeStamp := io.cReg.timeStamp(31,0) - txStamps - } +package BACK + +import chisel3._ +import chisel3.util._ + +class MasterParserIO extends Bundle{ + val downOut = Decoupled(new AXIS_Bundle(8)) + val upIn = Flipped( Decoupled(new AXIS_Bundle(8)) ) + + val sram_w = Flipped(new SRAM2kWRIO) + val sram_r = Flipped(new SRAM2kRDIO) + + val req = Input(Bool()) + val rsp = Valid(new Bundle{ + val isError = Bool() + }) + + val rxEnq = Output( Bool()) + val txDeq = Output( Bool()) + + val cReg = Input(new CommonRegisterBundle) + val mReg = Input(new MasterRegisterBundle) + + val deltaTimeStamp = Output(UInt(32.W)) + + val upRecStat = Output(new Stat_IO_Bundle) + +} + +abstract class MasterParserBase extends Module with RequireAsyncReset{ + val io: MasterParserIO = IO(new MasterParserIO) + + val txCnt = RegInit(0.U(12.W)) + val txLen = RegInit(0.U(11.W)) + val txAddr = RegInit(0.U(15.W)) + val rxCnt = RegInit(0.U(12.W)) + val rxLen = RegInit(0.U(11.W)) + val rxAddr = RegInit(0.U(15.W)) + + val reqReady = RegInit(true.B) + + + val txcrc = Module(new crc32_8) + val rxcrc = Module(new crc32_8) + + when( io.req ){ + reqReady := false.B + } .elsewhen( io.downOut.fire & txCnt === txLen + (4-1).U ){ + reqReady := true.B + } + + when( io.req ){ + txLen := Mux1H(Seq( + ( io.mReg.txSM === 0.U ) -> io.cReg.smTrigLen(1), + ( io.mReg.txSM === 1.U ) -> io.cReg.smTrigLen(3), + ( io.mReg.txSM === 2.U ) -> io.cReg.smTrigLen(5), + ( io.mReg.txSM === 3.U ) -> io.cReg.smTrigLen(7), + )) + rxLen := Mux1H(Seq( + ( io.mReg.rxSM === 0.U ) -> io.cReg.smTrigLen(0), + ( io.mReg.rxSM === 1.U ) -> io.cReg.smTrigLen(2), + ( io.mReg.rxSM === 2.U ) -> io.cReg.smTrigLen(4), + ( io.mReg.rxSM === 3.U ) -> io.cReg.smTrigLen(6), + )) + txCnt := 0.U + } .elsewhen( io.downOut.fire ){ + txCnt := txCnt + 1.U + } + + when( io.req ){ + txAddr := 0.U + } .elsewhen( io.downOut.fire ){ + txAddr := txAddr + 1.U + } + + when( io.req ){ + rxAddr := 0.U + } .elsewhen( io.upIn.fire ){ + rxAddr := rxAddr + 1.U + } + + + + io.sram_r.enr := + io.req | io.downOut.fire + + io.sram_r.addrr := Mux( io.req, 0.U, txAddr + 1.U ) + + io.downOut.valid := ~reqReady + + + val isRplTimeStamp = io.mReg.rplTimeStampTx.extract(15) + val isRplDeltaStamp = io.mReg.rplTimeStampTx.extract(14) + val rplCnt0 = io.mReg.rplTimeStampTx(10,0) + 0.U + val rplCnt1 = io.mReg.rplTimeStampTx(10,0) + 1.U + val rplCnt2 = io.mReg.rplTimeStampTx(10,0) + 2.U + val rplCnt3 = io.mReg.rplTimeStampTx(10,0) + 3.U + val rplCnt4 = io.mReg.rplTimeStampTx(10,0) + 4.U + val rplCnt5 = io.mReg.rplTimeStampTx(10,0) + 5.U + val rplCnt6 = io.mReg.rplTimeStampTx(10,0) + 6.U + val rplCnt7 = io.mReg.rplTimeStampTx(10,0) + 7.U + val rplCnt8 = io.mReg.rplTimeStampTx(10,0) + 8.U + val rplCnt9 = io.mReg.rplTimeStampTx(10,0) + 9.U + val rplCnt10 = io.mReg.rplTimeStampTx(10,0) + 10.U + val rplCnt11 = io.mReg.rplTimeStampTx(10,0) + 11.U + + + io.downOut.bits.tdata := Mux1H(Seq( + ( txCnt < txLen ) -> + MuxCase( io.sram_r.datar, Array( + ( isRplTimeStamp & ( txCnt === rplCnt0 ) ) -> RegEnable(io.cReg.recoTimeStamp(7,0), 0.U(8.W), io.downOut.fire & txCnt === 0.U ), + ( isRplTimeStamp & ( txCnt === rplCnt1 ) ) -> RegEnable(io.cReg.recoTimeStamp(15,8), 0.U(8.W), io.downOut.fire & txCnt === 0.U ), + ( isRplTimeStamp & ( txCnt === rplCnt2 ) ) -> RegEnable(io.cReg.recoTimeStamp(23,16), 0.U(8.W), io.downOut.fire & txCnt === 0.U ), + ( isRplTimeStamp & ( txCnt === rplCnt3 ) ) -> RegEnable(io.cReg.recoTimeStamp(31,24), 0.U(8.W), io.downOut.fire & txCnt === 0.U ), + ( isRplTimeStamp & ( txCnt === rplCnt4 ) ) -> RegEnable(io.cReg.recoTimeStamp(39,32), 0.U(8.W), io.downOut.fire & txCnt === 0.U ), + ( isRplTimeStamp & ( txCnt === rplCnt5 ) ) -> RegEnable(io.cReg.recoTimeStamp(47,40), 0.U(8.W), io.downOut.fire & txCnt === 0.U ), + ( isRplTimeStamp & ( txCnt === rplCnt6 ) ) -> RegEnable(io.cReg.recoTimeStamp(55,48), 0.U(8.W), io.downOut.fire & txCnt === 0.U ), + ( isRplTimeStamp & ( txCnt === rplCnt7 ) ) -> RegEnable(io.cReg.recoTimeStamp(63,56), 0.U(8.W), io.downOut.fire & txCnt === 0.U ), + ( isRplDeltaStamp & ( txCnt === rplCnt8 ) ) -> io.cReg.mstDeltaTime(7,0), + ( isRplDeltaStamp & ( txCnt === rplCnt9 ) ) -> io.cReg.mstDeltaTime(15,8), + ( isRplDeltaStamp & ( txCnt === rplCnt10 ) ) -> io.cReg.mstDeltaTime(23,16), + ( isRplDeltaStamp & ( txCnt === rplCnt11 ) ) -> io.cReg.mstDeltaTime(31,24), + )), + ( txCnt === txLen + 0.U ) -> txcrc.io.crc(31,24), + ( txCnt === txLen + 1.U ) -> txcrc.io.crc(23,16), + ( txCnt === txLen + 2.U ) -> txcrc.io.crc(15, 8), + ( txCnt === txLen + 3.U ) -> txcrc.io.crc( 7, 0), + )) + io.downOut.bits.tuser := false.B + io.downOut.bits.tlast := txCnt === (txLen + 3.U) + + val recCrcCheck = RegInit(0.U(32.W)) + + when( io.req ){ + rxCnt := 0.U + } .elsewhen( io.upIn.fire ){ + rxCnt := rxCnt + 1.U + } + + + io.upIn.ready := true.B + + io.sram_w.enw := io.upIn.fire + io.sram_w.addrw := rxAddr + io.sram_w.dataw := io.upIn.bits.tdata + + + io.rsp.valid := io.upIn.fire & io.upIn.bits.tlast + io.rsp.bits.isError := io.upIn.fire & io.upIn.bits.tlast & (Cat( recCrcCheck(31,8), io.upIn.bits.tdata ) =/= rxcrc.io.crc) + + io.rxEnq := io.upIn.fire & io.upIn.bits.tlast + io.txDeq := io.downOut.fire & io.downOut.bits.tlast + + txcrc.io.isEnable := io.downOut.fire & txCnt < txLen + txcrc.io.dataIn := io.downOut.bits.tdata + txcrc.io.flush := reqReady + + rxcrc.io.isEnable := io.upIn.fire & rxCnt < rxLen + rxcrc.io.dataIn := io.upIn.bits.tdata + rxcrc.io.flush := io.rsp.fire + + when( io.upIn.fire ){ + when( rxCnt === rxLen ){ + recCrcCheck := io.upIn.bits.tdata << 24 + } .elsewhen( rxCnt === (rxLen + 1.U) ){ + recCrcCheck := Cat( recCrcCheck(31,24), io.upIn.bits.tdata, recCrcCheck(15,0) ) + } .elsewhen( rxCnt === (rxLen + 2.U) ){ + recCrcCheck := Cat( recCrcCheck(31,16), io.upIn.bits.tdata, recCrcCheck( 7,0) ) + } .elsewhen( rxCnt === (rxLen + 3.U) ){ + recCrcCheck := Cat( recCrcCheck(31,8), io.upIn.bits.tdata ) + } + } + + +} + + +trait MasterParserStat{ this: MasterParserBase => + io.upRecStat.isHeaderError := false.B + io.upRecStat.isSubHeaderError := false.B + io.upRecStat.isPayloadError := false.B + io.upRecStat.isSubTailError := false.B + io.upRecStat.isCRCError := io.rsp.valid & io.rsp.bits.isError + io.upRecStat.isFinish := io.rsp.valid & ~io.rsp.bits.isError + io.upRecStat.isRecByteAck := io.upIn.fire + +} + +class MasterParser extends MasterParserBase +with MasterParserStat{ + val deltaTimeStamp = RegInit(0.U(32.W)) + // dontTouch(deltaTimeStamp) + io.deltaTimeStamp := deltaTimeStamp + + val txStamps = RegInit(0.U(32.W)) + val pkgChkCnt = RegInit(0.U(4.W)) + + when( io.upIn.fire & io.upIn.bits.tlast ){ + pkgChkCnt := 0.U + } .elsewhen( io.downOut.fire & pkgChkCnt =/= 9.U ){ + pkgChkCnt := pkgChkCnt + 1.U + } + + + when( io.downOut.fire & io.downOut.bits.tlast ){ + txStamps := io.cReg.timeStamp(31,0) + } .elsewhen( io.upIn.fire & io.upIn.bits.tlast & ~io.upIn.bits.tuser & pkgChkCnt === 9.U ){ + deltaTimeStamp := io.cReg.timeStamp(31,0) - txStamps + } } \ No newline at end of file diff --git a/src/main/scala/backBoard/shin/MstSlvSwitch.scala b/src/main/scala/backBoard/shin/MstSlvSwitch.scala index 3a2124c..51879e0 100644 --- a/src/main/scala/backBoard/shin/MstSlvSwitch.scala +++ b/src/main/scala/backBoard/shin/MstSlvSwitch.scala @@ -1,682 +1,682 @@ -package BACK - -import chisel3._ -import chisel3.util._ - -class TopBase_IO_Bundle extends Bundle{ - val dDatIn = Input(Bool()) - val dDatOut = Output(Bool()) - val uDatIn = Input(Bool()) - val uDatOut = Output(Bool()) - - val iqspi = new QSPIInterfaceIO - val ospi = new SSPIInterfaceIO - val oqspi = new QSPIInterfaceIO - val aqspi = new QSPIInterfaceIO - - val iSync = Output(Vec(4, Bool())) - - val isSoftReset = Output(Bool()) - - val interrupt = Output(Bool()) - - val latchPin = Input(Vec(2, Bool())) - val hwSerial = Input(UInt(48.W)) - val uniCode = Input(UInt(64.W)) - - val pllCtrl = Output(UInt(32.W)) - val xtal = Output(UInt(12.W)) - val anamuxSel = Output(UInt(5.W)) - val ldo2p5 = Output(UInt(8.W)) - val ldo1p1 = Output(UInt(8.W)) - val refTop = Output(UInt(3.W)) - val bias = Output(UInt(2.W)) - val div4 = Output(UInt(4.W)) - - val spiSel = Output(UInt(2.W)) - val isPllCfg = Output(Bool()) -} - - - -class MstSlvSwitchIO extends TopBase_IO_Bundle{ - val downCDRSampleIn = Vec(3, Flipped(new CDRInSampleIO) ) - val upCDRSampleIn = Vec(3, Flipped(new CDRInSampleIO) ) -} - - - - - - -abstract class MstSlvSwitchBase extends Module with RequireAsyncReset{ - - val io: MstSlvSwitchIO = IO(new MstSlvSwitchIO) - - val downCDROut = Module(new CDROut) - val upCDROut = Module(new CDROut) - - val downCDRInAxis = Module(new CDRInAxis) - val upCDRInAxis = Module(new CDRInAxis) - - val slaveParser = Module(new SlaveParser ) - val masterParser = Module(new MasterParser) - - val b4b5DownEncoder = Module(new b4b5DualEncode) - val b4b5DownDecoder = Module(new b4b5DualDecode) - val b4b5UpEncoder = Module(new b4b5DualEncode) - val b4b5UpDecoder = Module(new b4b5DualDecode) - - val b8b10DownEncoder = Module(new b8b10Encode) - val b8b10DownDecoder = Module(new b8b10Decode) - val b8b10UpEncoder = Module(new b8b10Encode) - val b8b10UpDecoder = Module(new b8b10Decode) - - val interface = Module(new Interface) - - val downInSerDat = Wire(Bool()) - val downInSyncSerDat = Wire(Bool()); downCDRInAxis.io.syncSerDat := downInSyncSerDat - val upInSerDat = Wire(Bool()) - val upInSyncSerDat = Wire(Bool()); upCDRInAxis.io.syncSerDat := upInSyncSerDat - - dontTouch(downInSerDat) - dontTouch(downInSyncSerDat) - dontTouch(upInSerDat) - dontTouch(upInSyncSerDat) - - interface.io.latchPin := io.latchPin - interface.io.uniCode := io.uniCode - interface.io.hwSerial := io.hwSerial - - interface.io.intTransEnd(0) := downCDRInAxis.io.axis.fire & downCDRInAxis.io.axis.bits.tlast - interface.io.intTransEnd(1) := downCDROut.io.axis.fire & downCDROut.io.axis.bits.tlast - interface.io.intTransEnd(2) := upCDRInAxis.io.axis.fire & upCDRInAxis.io.axis.bits.tlast - interface.io.intTransEnd(3) := upCDROut.io.axis.fire & upCDROut.io.axis.bits.tlast - - io.isSoftReset := interface.io.isSoftReset - io.interrupt := interface.io.interrupt - - io.ospi <> interface.io.ospi - io.iqspi <> interface.io.iqspi - io.oqspi <> interface.io.oqspi - io.aqspi <> interface.io.aqspi - - io.iSync := interface.io.sync - - - io.pllCtrl := interface.io.cReg.pllCtrl - io.xtal := interface.io.cReg.xtal - io.anamuxSel := interface.io.cReg.anamuxSel - io.ldo2p5 := interface.io.cReg.ldo2p5 - io.ldo1p1 := interface.io.cReg.ldo1p1 - io.refTop := interface.io.cReg.refTop - io.bias := interface.io.cReg.bias - io.div4 := interface.io.cReg.div4 - - io.spiSel := interface.io.cReg.spiSel - io.isPllCfg := interface.io.isPllCfg - - val sram = Seq( - for( _ <- 0 until 4 ) yield { Module(new ShareSRAM2k) }, - for( _ <- 0 until 4 ) yield { Module(new ShareSRAM2k) }, - for( _ <- 0 until 4 ) yield { Module(new ShareSRAM2k) }, - for( _ <- 0 until 4 ) yield { Module(new ShareSRAM2k) }, - for( _ <- 0 until 2 ) yield { Module(new ShareSRAM2k) }, - for( _ <- 0 until 2 ) yield { Module(new ShareSRAM2k) }, - for( _ <- 0 until 2 ) yield { Module(new ShareSRAM2k) }, - for( _ <- 0 until 2 ) yield { Module(new ShareSRAM2k) }, - ) - - - val smUnit = Seq( - Module( new SMUnit(depth = 4) ), - Module( new SMUnit(depth = 4) ), - Module( new SMUnit(depth = 4) ), - Module( new SMUnit(depth = 4) ), - Module( new SMUnit(depth = 2) ), - Module( new SMUnit(depth = 2) ), - Module( new SMUnit(depth = 2) ), - Module( new SMUnit(depth = 2) ), - ) - - val lvdsSMEnq = for( i <- 0 until 4 ) yield WireDefault(false.B); interface.io.lvdsSMEnq := lvdsSMEnq - val lvdsSMDeq = for( i <- 0 until 4 ) yield WireDefault(false.B); interface.io.lvdsSMDeq := lvdsSMDeq - val lvdsSMComf = for( i <- 0 until 4 ) yield WireDefault(false.B) - val lvdsSMAbrt = for( i <- 0 until 4 ) yield WireDefault(false.B) - - smUnit(0).io.enq := lvdsSMEnq(0) - smUnit(2).io.enq := lvdsSMEnq(1) - smUnit(4).io.enq := lvdsSMEnq(2) - smUnit(6).io.enq := lvdsSMEnq(3) - - smUnit(0).io.isComf := lvdsSMComf(0) - smUnit(2).io.isComf := lvdsSMComf(1) - smUnit(4).io.isComf := lvdsSMComf(2) - smUnit(6).io.isComf := lvdsSMComf(3) - - smUnit(0).io.isAbrt := lvdsSMAbrt(0) - smUnit(2).io.isAbrt := lvdsSMAbrt(1) - smUnit(4).io.isAbrt := lvdsSMAbrt(2) - smUnit(6).io.isAbrt := lvdsSMAbrt(3) - - smUnit(1).io.deq := lvdsSMDeq(0) - smUnit(3).io.deq := lvdsSMDeq(1) - smUnit(5).io.deq := lvdsSMDeq(2) - smUnit(7).io.deq := lvdsSMDeq(3) - - smUnit(0).io.sram_r <> interface.io.sram_r(0) - smUnit(2).io.sram_r <> interface.io.sram_r(1) - smUnit(4).io.sram_r <> interface.io.sram_r(2) - smUnit(6).io.sram_r <> interface.io.sram_r(3) - - smUnit(1).io.sram_w := interface.io.sram_w(0) - smUnit(3).io.sram_w := interface.io.sram_w(1) - smUnit(5).io.sram_w := interface.io.sram_w(2) - smUnit(7).io.sram_w := interface.io.sram_w(3) - - smUnit(0).io.deq := interface.io.dSMdeq(0) - smUnit(2).io.deq := interface.io.dSMdeq(1) - smUnit(4).io.deq := interface.io.dSMdeq(2) - smUnit(6).io.deq := interface.io.dSMdeq(3) - - - smUnit(1).io.enq := interface.io.uSMenq(0) - smUnit(3).io.enq := interface.io.uSMenq(1) - smUnit(5).io.enq := interface.io.uSMenq(2) - smUnit(7).io.enq := interface.io.uSMenq(3) - - smUnit(1).io.isComf := RegNext( smUnit(1).io.enq, false.B ) - smUnit(3).io.isComf := RegNext( smUnit(3).io.enq, false.B ) - smUnit(5).io.isComf := RegNext( smUnit(5).io.enq, false.B ) - smUnit(7).io.isComf := RegNext( smUnit(7).io.enq, false.B ) - - smUnit(1).io.isAbrt := false.B - smUnit(3).io.isAbrt := false.B - smUnit(5).io.isAbrt := false.B - smUnit(7).io.isAbrt := false.B - - for( i <- 0 until 8 ){ - interface.io.smUsedDepth(i) := smUnit(i).io.cnt - smUnit(i).io.flush := interface.io.isSMReset(i) - } - - - for( i <- 0 until 4 ){ - for( j <- 0 until 4 ){ - sram(i)(j).io.clockr := clock.asBool - sram(i)(j).io.clockw := clock.asBool - - smUnit(i).io.sram(j).rd.datar := sram(i)(j).io.datar - sram(i)(j).io.dataw := smUnit(i).io.sram(j).wr.dataw - sram(i)(j).io.addrw := smUnit(i).io.sram(j).wr.addrw - sram(i)(j).io.enw := smUnit(i).io.sram(j).wr.enw - sram(i)(j).io.addrr := smUnit(i).io.sram(j).rd.addrr - sram(i)(j).io.enr := smUnit(i).io.sram(j).rd.enr - } - } - - for( i <- 4 until 8 ){ - for( j <- 0 until 2 ){ - sram(i)(j).io.clockr := clock.asBool - sram(i)(j).io.clockw := clock.asBool - - smUnit(i).io.sram(j).rd.datar := sram(i)(j).io.datar - sram(i)(j).io.dataw := smUnit(i).io.sram(j).wr.dataw - sram(i)(j).io.addrw := smUnit(i).io.sram(j).wr.addrw - sram(i)(j).io.enw := smUnit(i).io.sram(j).wr.enw - sram(i)(j).io.addrr := smUnit(i).io.sram(j).rd.addrr - sram(i)(j).io.enr := smUnit(i).io.sram(j).rd.enr - } - } - - - - - //default - { - smUnit(0).io.sram_w := 0.U.asTypeOf(new SRAM2kWRIO) - smUnit(2).io.sram_w := 0.U.asTypeOf(new SRAM2kWRIO) - smUnit(4).io.sram_w := 0.U.asTypeOf(new SRAM2kWRIO) - smUnit(6).io.sram_w := 0.U.asTypeOf(new SRAM2kWRIO) - - smUnit(1).io.sram_r.enr := false.B - smUnit(3).io.sram_r.enr := false.B - smUnit(5).io.sram_r.enr := false.B - smUnit(7).io.sram_r.enr := false.B - smUnit(1).io.sram_r.addrr := 0.U - smUnit(3).io.sram_r.addrr := 0.U - smUnit(5).io.sram_r.addrr := 0.U - smUnit(7).io.sram_r.addrr := 0.U - - slaveParser.io.sram_r(0).datar := 0.U - slaveParser.io.sram_r(1).datar := 0.U - slaveParser.io.sram_r(2).datar := 0.U - slaveParser.io.sram_r(3).datar := 0.U - masterParser.io.sram_r.datar := 0.U - - downCDRInAxis.io.axis.ready := false.B - slaveParser.io.downIn.valid := false.B - slaveParser.io.downIn.bits := 0.U.asTypeOf(new AXIS_Bundle(8)) - - slaveParser.io.downOut.ready := false.B - masterParser.io.downOut.ready := false.B - downCDROut.io.axis.valid := false.B - downCDROut.io.axis.bits := 0.U.asTypeOf(new AXIS_Bundle(8)) - - upCDRInAxis.io.axis.ready := false.B - slaveParser.io.upIn.valid := false.B - slaveParser.io.upIn.bits := 0.U.asTypeOf(new AXIS_Bundle(8)) - masterParser.io.upIn.valid := false.B - masterParser.io.upIn.bits := 0.U.asTypeOf(new AXIS_Bundle(8)) - - slaveParser.io.upOut.ready := false.B - upCDROut.io.axis.valid := false.B - upCDROut.io.axis.bits := 0.U.asTypeOf(new AXIS_Bundle(8)) - - interface.io.mstDeltaTime := 0.U - - interface.io.slvDeltaTime := 0.U - interface.io.deltaFinal := 0.U - - interface.io.intMstTrig(0) := false.B - interface.io.intMstTrig(1) := false.B - - interface.io.intSlvTrig(0) := false.B - interface.io.intSlvTrig(1) := false.B - interface.io.intSlvTrig(2) := false.B - interface.io.intSlvTrig(3) := false.B - interface.io.intSlvTrig(4) := false.B - interface.io.intSlvTrig(5) := false.B - interface.io.intSlvTrig(6) := false.B - interface.io.intSlvTrig(7) := false.B - - interface.io.intHWTrig(0) := false.B - interface.io.intHWTrig(1) := false.B - - interface.io.downRecStat := 0.U.asTypeOf(new Stat_IO_Bundle) - interface.io.upRecStat := 0.U.asTypeOf(new Stat_IO_Bundle) - } - -} - -trait MstSlvSwitchMaster{ this: MstSlvSwitchBase => - - when( interface.io.cReg.modeSel === true.B ){ - masterParser.io.downOut <> downCDROut.io.axis - masterParser.io.upIn <> upCDRInAxis.io.axis - } - - when( interface.io.cReg.modeSel === true.B ){ - - when( interface.io.txReq.bits.rxSM === 0.U ){ - smUnit(0).io.sram_w := masterParser.io.sram_w - lvdsSMEnq(0) := masterParser.io.rxEnq - lvdsSMComf(0) := RegNext(masterParser.io.rxEnq, false.B) - lvdsSMAbrt(0) := false.B - } .elsewhen( interface.io.txReq.bits.rxSM === 1.U ){ - smUnit(2).io.sram_w := masterParser.io.sram_w - lvdsSMEnq(1) := masterParser.io.rxEnq - lvdsSMComf(1) := RegNext(masterParser.io.rxEnq, false.B) - lvdsSMAbrt(1) := false.B - } .elsewhen( interface.io.txReq.bits.rxSM === 2.U ){ - smUnit(4).io.sram_w := masterParser.io.sram_w - lvdsSMEnq(2) := masterParser.io.rxEnq - lvdsSMComf(2) := RegNext(masterParser.io.rxEnq, false.B) - lvdsSMAbrt(2) := false.B - } .elsewhen( interface.io.txReq.bits.rxSM === 3.U ){ - smUnit(6).io.sram_w := masterParser.io.sram_w - lvdsSMEnq(3) := masterParser.io.rxEnq - lvdsSMComf(3) := RegNext(masterParser.io.rxEnq, false.B) - lvdsSMAbrt(3) := false.B - } - - when( interface.io.txReq.bits.txSM === 0.U ){ - smUnit(1).io.sram_r <> masterParser.io.sram_r - lvdsSMDeq(0) := masterParser.io.txDeq - } .elsewhen( interface.io.txReq.bits.txSM === 1.U ){ - smUnit(3).io.sram_r <> masterParser.io.sram_r - lvdsSMDeq(1) := masterParser.io.txDeq - } .elsewhen( interface.io.txReq.bits.txSM === 2.U ){ - smUnit(5).io.sram_r <> masterParser.io.sram_r - lvdsSMDeq(2) := masterParser.io.txDeq - } .elsewhen( interface.io.txReq.bits.txSM === 3.U ){ - smUnit(7).io.sram_r <> masterParser.io.sram_r - lvdsSMDeq(3) := masterParser.io.txDeq - } - - - - interface.io.mstDeltaTime := masterParser.io.deltaTimeStamp - interface.io.intMstTrig(0) := masterParser.io.txDeq - interface.io.intMstTrig(1) := masterParser.io.rxEnq - - interface.io.downRecStat := 0.U.asTypeOf(new Stat_IO_Bundle) - interface.io.upRecStat := masterParser.io.upRecStat - - } - - masterParser.io.req := interface.io.txReq.valid - - masterParser.io.cReg := interface.io.cReg - masterParser.io.mReg := interface.io.mReg - - -} - - -trait MstSlvSwitchSlave{ this: MstSlvSwitchBase => - - when( interface.io.cReg.modeSel === false.B ){ - slaveParser.io.downIn <> downCDRInAxis.io.axis - downCDROut.io.axis <> slaveParser.io.downOut - slaveParser.io.upIn <> upCDRInAxis.io.axis - upCDROut.io.axis <> slaveParser.io.upOut - } - - slaveParser.io.cReg := interface.io.cReg - slaveParser.io.sReg := interface.io.sReg - - when( interface.io.cReg.modeSel === false.B ){ - smUnit(0).io.sram_w := slaveParser.io.sram_w(0) - smUnit(2).io.sram_w := slaveParser.io.sram_w(1) - smUnit(4).io.sram_w := slaveParser.io.sram_w(2) - smUnit(6).io.sram_w := slaveParser.io.sram_w(3) - - smUnit(1).io.sram_r <> slaveParser.io.sram_r(0) - smUnit(3).io.sram_r <> slaveParser.io.sram_r(1) - smUnit(5).io.sram_r <> slaveParser.io.sram_r(2) - smUnit(7).io.sram_r <> slaveParser.io.sram_r(3) - - lvdsSMEnq(0) := slaveParser.io.dSMenq(0) - lvdsSMEnq(1) := slaveParser.io.dSMenq(1) - lvdsSMEnq(2) := slaveParser.io.dSMenq(2) - lvdsSMEnq(3) := slaveParser.io.dSMenq(3) - - lvdsSMComf(0) := slaveParser.io.downRecStat.isFinish - lvdsSMComf(1) := slaveParser.io.downRecStat.isFinish - lvdsSMComf(2) := slaveParser.io.downRecStat.isFinish - lvdsSMComf(3) := slaveParser.io.downRecStat.isFinish - - lvdsSMAbrt(0) := slaveParser.io.downRecStat.isRecError - lvdsSMAbrt(1) := slaveParser.io.downRecStat.isRecError - lvdsSMAbrt(2) := slaveParser.io.downRecStat.isRecError - lvdsSMAbrt(3) := slaveParser.io.downRecStat.isRecError - - lvdsSMDeq(0) := slaveParser.io.uSMdeq(0) - lvdsSMDeq(1) := slaveParser.io.uSMdeq(1) - lvdsSMDeq(2) := slaveParser.io.uSMdeq(2) - lvdsSMDeq(3) := slaveParser.io.uSMdeq(3) - - interface.io.mstDeltaTime := slaveParser.io.mstDeltaTimeStamp - interface.io.slvDeltaTime := slaveParser.io.slvDeltaTime - interface.io.deltaFinal := slaveParser.io.deltaFinal - - interface.io.intSlvTrig(0) := slaveParser.io.dSMenq(0) - interface.io.intSlvTrig(1) := slaveParser.io.uSMdeq(0) - interface.io.intSlvTrig(2) := slaveParser.io.dSMenq(1) - interface.io.intSlvTrig(3) := slaveParser.io.uSMdeq(1) - interface.io.intSlvTrig(4) := slaveParser.io.dSMenq(2) - interface.io.intSlvTrig(5) := slaveParser.io.uSMdeq(2) - interface.io.intSlvTrig(6) := slaveParser.io.dSMenq(3) - interface.io.intSlvTrig(7) := slaveParser.io.uSMdeq(3) - - interface.io.intHWTrig(0) := slaveParser.io.intHWTrig(0) - interface.io.intHWTrig(1) := slaveParser.io.intHWTrig(1) - - - interface.io.downRecStat := slaveParser.io.downRecStat - interface.io.upRecStat := slaveParser.io.upRecStat - - } - - slaveParser.io.intHWClr(0) := interface.io.intHWTrig(0) & interface.io.intHWClr(0) - slaveParser.io.intHWClr(1) := interface.io.intHWTrig(1) & interface.io.intHWClr(1) - downCDRInAxis.io.flush := RegNext( interface.io.intHWTrig(0) & interface.io.intHWClr(0), false.B ) - upCDRInAxis.io.flush := RegNext( interface.io.intHWTrig(1) & interface.io.intHWClr(1), false.B ) - downCDROut.io.flush := RegNext( interface.io.intHWTrig(0) & interface.io.intHWClr(0), false.B ) - upCDROut.io.flush := RegNext( interface.io.intHWTrig(1) & interface.io.intHWClr(1), false.B ) - - interface.io.lvds <> slaveParser.io.lvds - - interface.io.localDevIndex := slaveParser.io.localDevIndex - - //从站链路寄存器 - interface.io.isDevOnRight := slaveParser.io.isDevOnRight - interface.io.isDevOnRightModify := slaveParser.io.isDevOnRightModify - interface.io.indexOfRightDev := slaveParser.io.indexOfRightDev -} - - -trait MstSlvSwitchWatchDog{ this: MstSlvSwitchBase => - - //看门狗1~16,SM监控 - val isWdtSMEnable = for( _ <- 0 until 16 ) yield { RegInit(false.B) } - val wdtSMCnt = for( _ <- 0 until 16 ) yield { RegInit(0.U(32.W)) } - - for( i <- 0 until 8 ){ - when( smUnit(i).io.enq || interface.io.wdtTrigger(2*i+1) ){ - isWdtSMEnable(2*i) := false.B - } .elsewhen( ~isWdtSMEnable(2*i) & smUnit(i).io.sram_w.enw & interface.io.cReg.wdtEnable.extract(2*i+1) ){ - isWdtSMEnable(2*i) := true.B - } - - when( smUnit(i).io.deq || interface.io.wdtTrigger(2*i+2) ){ - isWdtSMEnable(2*i + 1) := false.B - } .elsewhen( ~isWdtSMEnable(2*i + 1) & smUnit(i).io.sram_r.enr & interface.io.cReg.wdtEnable.extract(2*i+2) ){ - isWdtSMEnable(2*i + 1) := true.B - } - } - - for( i <- 0 until 16 ){ - when( isWdtSMEnable(i) & (wdtSMCnt(i) < interface.io.cReg.wdtTarCnt(i+1)) ){ - wdtSMCnt(i) := wdtSMCnt(i) + 1.U - } .elsewhen( ~isWdtSMEnable(i) || (wdtSMCnt(i) >= interface.io.cReg.wdtTarCnt(i+1)) ){ - wdtSMCnt(i) := 0.U - } - - // assert( wdtSMCnt(i) <= interface.io.cReg.wdtTarCnt(i+1), s"Assert Failed! wdtSMCnt($i) is larger than wdtTarCnt, Special situation?" ) - - interface.io.wdtTrigger(i+1) := wdtSMCnt(i) === interface.io.cReg.wdtTarCnt(i+1) - } - - //看门狗0 发送后回包是否超时 - val isWdtRec2RtnEnable = RegInit(false.B) - val wdtRec2RtnCnt = RegInit(0.U(32.W)) - - when( - (upCDRInAxis.io.axis.fire & upCDRInAxis.io.axis.bits.tlast) || - ~interface.io.cReg.wdtEnable.extract(0) || - interface.io.wdtTrigger(0) - ){ - isWdtRec2RtnEnable := false.B - } .elsewhen( ~isWdtRec2RtnEnable & downCDROut.io.axis.fire & interface.io.cReg.wdtEnable.extract(0) ){ - isWdtRec2RtnEnable := true.B - } - - when( isWdtRec2RtnEnable & (wdtRec2RtnCnt < interface.io.cReg.wdtTarCnt(0)) ){ - wdtRec2RtnCnt := wdtRec2RtnCnt + 1.U - } .elsewhen( ~isWdtRec2RtnEnable || (wdtRec2RtnCnt >= interface.io.cReg.wdtTarCnt(0)) ){ - wdtRec2RtnCnt := 0.U - } - - // assert( wdtRecCnt < interface.io.cReg.wdtTarCnt(0), "Assert Failed! wdtRecCnt is larger than wdtTarCnt, Special situation?" ) - - interface.io.wdtTrigger(0) := wdtRec2RtnCnt === interface.io.cReg.wdtTarCnt(0) - - //看门狗17 - val wdtRec2RecCnt = RegInit(0.U(32.W)) - - when( interface.io.cReg.wdtEnable.extract(17) & (wdtRec2RecCnt < interface.io.cReg.wdtTarCnt(17)) ){ - wdtRec2RecCnt := wdtRec2RecCnt + 1.U - } .elsewhen( - ~interface.io.cReg.wdtEnable.extract(17) || - downCDRInAxis.io.axis.fire || - (wdtRec2RecCnt >= interface.io.cReg.wdtTarCnt(17)) - ){ - wdtRec2RecCnt := 0.U - } - - interface.io.wdtTrigger(17) := wdtRec2RecCnt === interface.io.cReg.wdtTarCnt(17) - -} - -trait MstSlvSwitchDataPath{ this: MstSlvSwitchBase => - val isDwUpEx = interface.io.cReg.dwupEx.extract(0) - - when( ~isDwUpEx ){ //未交叉 - when( interface.io.cReg.modeSel === false.B ){ //slave - when( (slaveParser.io.intHWTrig(0) | slaveParser.io.intHWTrig(1)) | interface.io.isPoReset ){ //硬件错误 - downInSerDat := false.B - upInSerDat := false.B - when( slaveParser.io.isLoop ){ //回环 - io.dDatOut := false.B - io.uDatOut := io.dDatIn - } .otherwise{ //非回环 - io.dDatOut := io.dDatIn - io.uDatOut := io.uDatIn - } - } .otherwise{ //无硬件错误 - when( slaveParser.io.isLoop ){ //回环 - downInSerDat := io.dDatIn - upInSerDat := downCDROut.io.serDat - io.dDatOut := false.B - io.uDatOut := upCDROut.io.serDat - } .otherwise{ //非回环 - downInSerDat := io.dDatIn - upInSerDat := io.uDatIn - io.dDatOut := downCDROut.io.serDat - io.uDatOut := upCDROut.io.serDat - } - } - } .otherwise{ //master - downInSerDat := false.B - upInSerDat := io.uDatIn - io.dDatOut := downCDROut.io.serDat - io.uDatOut := false.B - } - } .otherwise{ //交叉 - when( interface.io.cReg.modeSel === false.B ){ //slave - when( (slaveParser.io.intHWTrig(0) | slaveParser.io.intHWTrig(1)) | interface.io.isPoReset ){ //硬件错误 - - when( slaveParser.io.isLoop ){ //回环 - io.dDatOut := io.uDatIn - io.uDatOut := false.B - downInSerDat := false.B - upInSerDat := false.B - } .otherwise{ //非回环 - io.dDatOut := io.dDatIn - io.uDatOut := io.uDatIn - downInSerDat := false.B - upInSerDat := false.B - } - } .otherwise{ //无硬件错误 - when( slaveParser.io.isLoop ){ //回环 - downInSerDat := io.uDatIn - upInSerDat := downCDROut.io.serDat - io.uDatOut := false.B - io.dDatOut := upCDROut.io.serDat - } .otherwise{ //非回环 - downInSerDat := io.uDatIn - upInSerDat := io.dDatIn - io.dDatOut := upCDROut.io.serDat - io.uDatOut := downCDROut.io.serDat - } - } - } .otherwise{ //master - downInSerDat := false.B - upInSerDat := io.dDatIn - io.uDatOut := downCDROut.io.serDat - io.dDatOut := false.B - } - } -} - -trait MstSlvSwitchB8B4{ this: MstSlvSwitchBase => - val isUsing8b10b = interface.io.cReg.b8b4Sel.extract(0) - - when( isUsing8b10b ){ - b8b10DownEncoder.io <> downCDROut.io.encode - b8b10DownDecoder.io <> downCDRInAxis.io.decode - b8b10UpEncoder.io <> upCDROut.io.encode - b8b10UpDecoder.io <> upCDRInAxis.io.decode - - b4b5DownEncoder.io.isEnable := false.B - b4b5DownEncoder.io.dataIn := 0.U - b4b5DownDecoder.io.dataIn := 0.U - b4b5UpEncoder.io.isEnable := false.B - b4b5UpEncoder.io.dataIn := 0.U - b4b5UpDecoder.io.dataIn := 0.U - } .otherwise{ - b4b5DownEncoder.io <> downCDROut.io.encode - b4b5DownDecoder.io <> downCDRInAxis.io.decode - b4b5UpEncoder.io <> upCDROut.io.encode - b4b5UpDecoder.io <> upCDRInAxis.io.decode - - b8b10DownEncoder.io.isEnable := false.B - b8b10DownEncoder.io.dataIn := 0.U - b8b10DownDecoder.io.dataIn := 0.U - b8b10UpEncoder.io.isEnable := false.B - b8b10UpEncoder.io.dataIn := 0.U - b8b10UpDecoder.io.dataIn := 0.U - } -} - -trait MstSlvSwitchCDRIn{ this: MstSlvSwitchBase => - val cdrSelB = interface.io.cReg.cdrParam === 1.U - val cdrSelC = interface.io.cReg.cdrParam === 2.U - val cdrSelA = ~cdrSelB & ~cdrSelC - - when(cdrSelB){ - io.downCDRSampleIn(1).serDat := downInSerDat - io.upCDRSampleIn(1).serDat := upInSerDat - downInSyncSerDat := io.downCDRSampleIn(1).syncSerDat - upInSyncSerDat := io.upCDRSampleIn(1).syncSerDat - - io.downCDRSampleIn(0).serDat := false.B - io.upCDRSampleIn(0).serDat := false.B - io.downCDRSampleIn(2).serDat := false.B - io.upCDRSampleIn(2).serDat := false.B - } .elsewhen(cdrSelC){ - io.downCDRSampleIn(2).serDat := downInSerDat - io.upCDRSampleIn(2).serDat := upInSerDat - downInSyncSerDat := io.downCDRSampleIn(2).syncSerDat - upInSyncSerDat := io.upCDRSampleIn(2).syncSerDat - - io.downCDRSampleIn(0).serDat := false.B - io.upCDRSampleIn(0).serDat := false.B - io.downCDRSampleIn(1).serDat := false.B - io.upCDRSampleIn(1).serDat := false.B - } .otherwise{ - io.downCDRSampleIn(0).serDat := downInSerDat - io.upCDRSampleIn(0).serDat := upInSerDat - downInSyncSerDat := io.downCDRSampleIn(0).syncSerDat - upInSyncSerDat := io.upCDRSampleIn(0).syncSerDat - - io.downCDRSampleIn(1).serDat := false.B - io.upCDRSampleIn(1).serDat := false.B - io.downCDRSampleIn(2).serDat := false.B - io.upCDRSampleIn(2).serDat := false.B - } - - - -} - -class MstSlvSwitch extends MstSlvSwitchBase -with MstSlvSwitchMaster -with MstSlvSwitchSlave -with MstSlvSwitchWatchDog -with MstSlvSwitchDataPath -with MstSlvSwitchB8B4 -with MstSlvSwitchCDRIn{ - - - - - - - - - - -} +package BACK + +import chisel3._ +import chisel3.util._ + +class TopBase_IO_Bundle extends Bundle{ + val dDatIn = Input(Bool()) + val dDatOut = Output(Bool()) + val uDatIn = Input(Bool()) + val uDatOut = Output(Bool()) + + val iqspi = new QSPIInterfaceIO + val ospi = new SSPIInterfaceIO + val oqspi = new QSPIInterfaceIO + val aqspi = new QSPIInterfaceIO + + val iSync = Output(Vec(4, Bool())) + + val isSoftReset = Output(Bool()) + + val interrupt = Output(Bool()) + + val latchPin = Input(Vec(2, Bool())) + val hwSerial = Input(UInt(48.W)) + val uniCode = Input(UInt(64.W)) + + val pllCtrl = Output(UInt(32.W)) + val xtal = Output(UInt(12.W)) + val anamuxSel = Output(UInt(5.W)) + val ldo2p5 = Output(UInt(8.W)) + val ldo1p1 = Output(UInt(8.W)) + val refTop = Output(UInt(3.W)) + val bias = Output(UInt(2.W)) + val div4 = Output(UInt(4.W)) + + val spiSel = Output(UInt(2.W)) + val isPllCfg = Output(Bool()) +} + + + +class MstSlvSwitchIO extends TopBase_IO_Bundle{ + val downCDRSampleIn = Vec(3, Flipped(new CDRInSampleIO) ) + val upCDRSampleIn = Vec(3, Flipped(new CDRInSampleIO) ) +} + + + + + + +abstract class MstSlvSwitchBase extends Module with RequireAsyncReset{ + + val io: MstSlvSwitchIO = IO(new MstSlvSwitchIO) + + val downCDROut = Module(new CDROut) + val upCDROut = Module(new CDROut) + + val downCDRInAxis = Module(new CDRInAxis) + val upCDRInAxis = Module(new CDRInAxis) + + val slaveParser = Module(new SlaveParser ) + val masterParser = Module(new MasterParser) + + val b4b5DownEncoder = Module(new b4b5DualEncode) + val b4b5DownDecoder = Module(new b4b5DualDecode) + val b4b5UpEncoder = Module(new b4b5DualEncode) + val b4b5UpDecoder = Module(new b4b5DualDecode) + + val b8b10DownEncoder = Module(new b8b10Encode) + val b8b10DownDecoder = Module(new b8b10Decode) + val b8b10UpEncoder = Module(new b8b10Encode) + val b8b10UpDecoder = Module(new b8b10Decode) + + val interface = Module(new Interface) + + val downInSerDat = Wire(Bool()) + val downInSyncSerDat = Wire(Bool()); downCDRInAxis.io.syncSerDat := downInSyncSerDat + val upInSerDat = Wire(Bool()) + val upInSyncSerDat = Wire(Bool()); upCDRInAxis.io.syncSerDat := upInSyncSerDat + + dontTouch(downInSerDat) + dontTouch(downInSyncSerDat) + dontTouch(upInSerDat) + dontTouch(upInSyncSerDat) + + interface.io.latchPin := io.latchPin + interface.io.uniCode := io.uniCode + interface.io.hwSerial := io.hwSerial + + interface.io.intTransEnd(0) := downCDRInAxis.io.axis.fire & downCDRInAxis.io.axis.bits.tlast + interface.io.intTransEnd(1) := downCDROut.io.axis.fire & downCDROut.io.axis.bits.tlast + interface.io.intTransEnd(2) := upCDRInAxis.io.axis.fire & upCDRInAxis.io.axis.bits.tlast + interface.io.intTransEnd(3) := upCDROut.io.axis.fire & upCDROut.io.axis.bits.tlast + + io.isSoftReset := interface.io.isSoftReset + io.interrupt := interface.io.interrupt + + io.ospi <> interface.io.ospi + io.iqspi <> interface.io.iqspi + io.oqspi <> interface.io.oqspi + io.aqspi <> interface.io.aqspi + + io.iSync := interface.io.sync + + + io.pllCtrl := interface.io.cReg.pllCtrl + io.xtal := interface.io.cReg.xtal + io.anamuxSel := interface.io.cReg.anamuxSel + io.ldo2p5 := interface.io.cReg.ldo2p5 + io.ldo1p1 := interface.io.cReg.ldo1p1 + io.refTop := interface.io.cReg.refTop + io.bias := interface.io.cReg.bias + io.div4 := interface.io.cReg.div4 + + io.spiSel := interface.io.cReg.spiSel + io.isPllCfg := interface.io.isPllCfg + + val sram = Seq( + for( _ <- 0 until 4 ) yield { Module(new ShareSRAM2k) }, + for( _ <- 0 until 4 ) yield { Module(new ShareSRAM2k) }, + for( _ <- 0 until 4 ) yield { Module(new ShareSRAM2k) }, + for( _ <- 0 until 4 ) yield { Module(new ShareSRAM2k) }, + for( _ <- 0 until 2 ) yield { Module(new ShareSRAM2k) }, + for( _ <- 0 until 2 ) yield { Module(new ShareSRAM2k) }, + for( _ <- 0 until 2 ) yield { Module(new ShareSRAM2k) }, + for( _ <- 0 until 2 ) yield { Module(new ShareSRAM2k) }, + ) + + + val smUnit = Seq( + Module( new SMUnit(depth = 4) ), + Module( new SMUnit(depth = 4) ), + Module( new SMUnit(depth = 4) ), + Module( new SMUnit(depth = 4) ), + Module( new SMUnit(depth = 2) ), + Module( new SMUnit(depth = 2) ), + Module( new SMUnit(depth = 2) ), + Module( new SMUnit(depth = 2) ), + ) + + val lvdsSMEnq = for( i <- 0 until 4 ) yield WireDefault(false.B); interface.io.lvdsSMEnq := lvdsSMEnq + val lvdsSMDeq = for( i <- 0 until 4 ) yield WireDefault(false.B); interface.io.lvdsSMDeq := lvdsSMDeq + val lvdsSMComf = for( i <- 0 until 4 ) yield WireDefault(false.B) + val lvdsSMAbrt = for( i <- 0 until 4 ) yield WireDefault(false.B) + + smUnit(0).io.enq := lvdsSMEnq(0) + smUnit(2).io.enq := lvdsSMEnq(1) + smUnit(4).io.enq := lvdsSMEnq(2) + smUnit(6).io.enq := lvdsSMEnq(3) + + smUnit(0).io.isComf := lvdsSMComf(0) + smUnit(2).io.isComf := lvdsSMComf(1) + smUnit(4).io.isComf := lvdsSMComf(2) + smUnit(6).io.isComf := lvdsSMComf(3) + + smUnit(0).io.isAbrt := lvdsSMAbrt(0) + smUnit(2).io.isAbrt := lvdsSMAbrt(1) + smUnit(4).io.isAbrt := lvdsSMAbrt(2) + smUnit(6).io.isAbrt := lvdsSMAbrt(3) + + smUnit(1).io.deq := lvdsSMDeq(0) + smUnit(3).io.deq := lvdsSMDeq(1) + smUnit(5).io.deq := lvdsSMDeq(2) + smUnit(7).io.deq := lvdsSMDeq(3) + + smUnit(0).io.sram_r <> interface.io.sram_r(0) + smUnit(2).io.sram_r <> interface.io.sram_r(1) + smUnit(4).io.sram_r <> interface.io.sram_r(2) + smUnit(6).io.sram_r <> interface.io.sram_r(3) + + smUnit(1).io.sram_w := interface.io.sram_w(0) + smUnit(3).io.sram_w := interface.io.sram_w(1) + smUnit(5).io.sram_w := interface.io.sram_w(2) + smUnit(7).io.sram_w := interface.io.sram_w(3) + + smUnit(0).io.deq := interface.io.dSMdeq(0) + smUnit(2).io.deq := interface.io.dSMdeq(1) + smUnit(4).io.deq := interface.io.dSMdeq(2) + smUnit(6).io.deq := interface.io.dSMdeq(3) + + + smUnit(1).io.enq := interface.io.uSMenq(0) + smUnit(3).io.enq := interface.io.uSMenq(1) + smUnit(5).io.enq := interface.io.uSMenq(2) + smUnit(7).io.enq := interface.io.uSMenq(3) + + smUnit(1).io.isComf := RegNext( smUnit(1).io.enq, false.B ) + smUnit(3).io.isComf := RegNext( smUnit(3).io.enq, false.B ) + smUnit(5).io.isComf := RegNext( smUnit(5).io.enq, false.B ) + smUnit(7).io.isComf := RegNext( smUnit(7).io.enq, false.B ) + + smUnit(1).io.isAbrt := false.B + smUnit(3).io.isAbrt := false.B + smUnit(5).io.isAbrt := false.B + smUnit(7).io.isAbrt := false.B + + for( i <- 0 until 8 ){ + interface.io.smUsedDepth(i) := smUnit(i).io.cnt + smUnit(i).io.flush := interface.io.isSMReset(i) + } + + + for( i <- 0 until 4 ){ + for( j <- 0 until 4 ){ + sram(i)(j).io.clockr := clock.asBool + sram(i)(j).io.clockw := clock.asBool + + smUnit(i).io.sram(j).rd.datar := sram(i)(j).io.datar + sram(i)(j).io.dataw := smUnit(i).io.sram(j).wr.dataw + sram(i)(j).io.addrw := smUnit(i).io.sram(j).wr.addrw + sram(i)(j).io.enw := smUnit(i).io.sram(j).wr.enw + sram(i)(j).io.addrr := smUnit(i).io.sram(j).rd.addrr + sram(i)(j).io.enr := smUnit(i).io.sram(j).rd.enr + } + } + + for( i <- 4 until 8 ){ + for( j <- 0 until 2 ){ + sram(i)(j).io.clockr := clock.asBool + sram(i)(j).io.clockw := clock.asBool + + smUnit(i).io.sram(j).rd.datar := sram(i)(j).io.datar + sram(i)(j).io.dataw := smUnit(i).io.sram(j).wr.dataw + sram(i)(j).io.addrw := smUnit(i).io.sram(j).wr.addrw + sram(i)(j).io.enw := smUnit(i).io.sram(j).wr.enw + sram(i)(j).io.addrr := smUnit(i).io.sram(j).rd.addrr + sram(i)(j).io.enr := smUnit(i).io.sram(j).rd.enr + } + } + + + + + //default + { + smUnit(0).io.sram_w := 0.U.asTypeOf(new SRAM2kWRIO) + smUnit(2).io.sram_w := 0.U.asTypeOf(new SRAM2kWRIO) + smUnit(4).io.sram_w := 0.U.asTypeOf(new SRAM2kWRIO) + smUnit(6).io.sram_w := 0.U.asTypeOf(new SRAM2kWRIO) + + smUnit(1).io.sram_r.enr := false.B + smUnit(3).io.sram_r.enr := false.B + smUnit(5).io.sram_r.enr := false.B + smUnit(7).io.sram_r.enr := false.B + smUnit(1).io.sram_r.addrr := 0.U + smUnit(3).io.sram_r.addrr := 0.U + smUnit(5).io.sram_r.addrr := 0.U + smUnit(7).io.sram_r.addrr := 0.U + + slaveParser.io.sram_r(0).datar := 0.U + slaveParser.io.sram_r(1).datar := 0.U + slaveParser.io.sram_r(2).datar := 0.U + slaveParser.io.sram_r(3).datar := 0.U + masterParser.io.sram_r.datar := 0.U + + downCDRInAxis.io.axis.ready := false.B + slaveParser.io.downIn.valid := false.B + slaveParser.io.downIn.bits := 0.U.asTypeOf(new AXIS_Bundle(8)) + + slaveParser.io.downOut.ready := false.B + masterParser.io.downOut.ready := false.B + downCDROut.io.axis.valid := false.B + downCDROut.io.axis.bits := 0.U.asTypeOf(new AXIS_Bundle(8)) + + upCDRInAxis.io.axis.ready := false.B + slaveParser.io.upIn.valid := false.B + slaveParser.io.upIn.bits := 0.U.asTypeOf(new AXIS_Bundle(8)) + masterParser.io.upIn.valid := false.B + masterParser.io.upIn.bits := 0.U.asTypeOf(new AXIS_Bundle(8)) + + slaveParser.io.upOut.ready := false.B + upCDROut.io.axis.valid := false.B + upCDROut.io.axis.bits := 0.U.asTypeOf(new AXIS_Bundle(8)) + + interface.io.mstDeltaTime := 0.U + + interface.io.slvDeltaTime := 0.U + interface.io.deltaFinal := 0.U + + interface.io.intMstTrig(0) := false.B + interface.io.intMstTrig(1) := false.B + + interface.io.intSlvTrig(0) := false.B + interface.io.intSlvTrig(1) := false.B + interface.io.intSlvTrig(2) := false.B + interface.io.intSlvTrig(3) := false.B + interface.io.intSlvTrig(4) := false.B + interface.io.intSlvTrig(5) := false.B + interface.io.intSlvTrig(6) := false.B + interface.io.intSlvTrig(7) := false.B + + interface.io.intHWTrig(0) := false.B + interface.io.intHWTrig(1) := false.B + + interface.io.downRecStat := 0.U.asTypeOf(new Stat_IO_Bundle) + interface.io.upRecStat := 0.U.asTypeOf(new Stat_IO_Bundle) + } + +} + +trait MstSlvSwitchMaster{ this: MstSlvSwitchBase => + + when( interface.io.cReg.modeSel === true.B ){ + masterParser.io.downOut <> downCDROut.io.axis + masterParser.io.upIn <> upCDRInAxis.io.axis + } + + when( interface.io.cReg.modeSel === true.B ){ + + when( interface.io.txReq.bits.rxSM === 0.U ){ + smUnit(0).io.sram_w := masterParser.io.sram_w + lvdsSMEnq(0) := masterParser.io.rxEnq + lvdsSMComf(0) := RegNext(masterParser.io.rxEnq, false.B) + lvdsSMAbrt(0) := false.B + } .elsewhen( interface.io.txReq.bits.rxSM === 1.U ){ + smUnit(2).io.sram_w := masterParser.io.sram_w + lvdsSMEnq(1) := masterParser.io.rxEnq + lvdsSMComf(1) := RegNext(masterParser.io.rxEnq, false.B) + lvdsSMAbrt(1) := false.B + } .elsewhen( interface.io.txReq.bits.rxSM === 2.U ){ + smUnit(4).io.sram_w := masterParser.io.sram_w + lvdsSMEnq(2) := masterParser.io.rxEnq + lvdsSMComf(2) := RegNext(masterParser.io.rxEnq, false.B) + lvdsSMAbrt(2) := false.B + } .elsewhen( interface.io.txReq.bits.rxSM === 3.U ){ + smUnit(6).io.sram_w := masterParser.io.sram_w + lvdsSMEnq(3) := masterParser.io.rxEnq + lvdsSMComf(3) := RegNext(masterParser.io.rxEnq, false.B) + lvdsSMAbrt(3) := false.B + } + + when( interface.io.txReq.bits.txSM === 0.U ){ + smUnit(1).io.sram_r <> masterParser.io.sram_r + lvdsSMDeq(0) := masterParser.io.txDeq + } .elsewhen( interface.io.txReq.bits.txSM === 1.U ){ + smUnit(3).io.sram_r <> masterParser.io.sram_r + lvdsSMDeq(1) := masterParser.io.txDeq + } .elsewhen( interface.io.txReq.bits.txSM === 2.U ){ + smUnit(5).io.sram_r <> masterParser.io.sram_r + lvdsSMDeq(2) := masterParser.io.txDeq + } .elsewhen( interface.io.txReq.bits.txSM === 3.U ){ + smUnit(7).io.sram_r <> masterParser.io.sram_r + lvdsSMDeq(3) := masterParser.io.txDeq + } + + + + interface.io.mstDeltaTime := masterParser.io.deltaTimeStamp + interface.io.intMstTrig(0) := masterParser.io.txDeq + interface.io.intMstTrig(1) := masterParser.io.rxEnq + + interface.io.downRecStat := 0.U.asTypeOf(new Stat_IO_Bundle) + interface.io.upRecStat := masterParser.io.upRecStat + + } + + masterParser.io.req := interface.io.txReq.valid + + masterParser.io.cReg := interface.io.cReg + masterParser.io.mReg := interface.io.mReg + + +} + + +trait MstSlvSwitchSlave{ this: MstSlvSwitchBase => + + when( interface.io.cReg.modeSel === false.B ){ + slaveParser.io.downIn <> downCDRInAxis.io.axis + downCDROut.io.axis <> slaveParser.io.downOut + slaveParser.io.upIn <> upCDRInAxis.io.axis + upCDROut.io.axis <> slaveParser.io.upOut + } + + slaveParser.io.cReg := interface.io.cReg + slaveParser.io.sReg := interface.io.sReg + + when( interface.io.cReg.modeSel === false.B ){ + smUnit(0).io.sram_w := slaveParser.io.sram_w(0) + smUnit(2).io.sram_w := slaveParser.io.sram_w(1) + smUnit(4).io.sram_w := slaveParser.io.sram_w(2) + smUnit(6).io.sram_w := slaveParser.io.sram_w(3) + + smUnit(1).io.sram_r <> slaveParser.io.sram_r(0) + smUnit(3).io.sram_r <> slaveParser.io.sram_r(1) + smUnit(5).io.sram_r <> slaveParser.io.sram_r(2) + smUnit(7).io.sram_r <> slaveParser.io.sram_r(3) + + lvdsSMEnq(0) := slaveParser.io.dSMenq(0) + lvdsSMEnq(1) := slaveParser.io.dSMenq(1) + lvdsSMEnq(2) := slaveParser.io.dSMenq(2) + lvdsSMEnq(3) := slaveParser.io.dSMenq(3) + + lvdsSMComf(0) := slaveParser.io.downRecStat.isFinish + lvdsSMComf(1) := slaveParser.io.downRecStat.isFinish + lvdsSMComf(2) := slaveParser.io.downRecStat.isFinish + lvdsSMComf(3) := slaveParser.io.downRecStat.isFinish + + lvdsSMAbrt(0) := slaveParser.io.downRecStat.isRecError + lvdsSMAbrt(1) := slaveParser.io.downRecStat.isRecError + lvdsSMAbrt(2) := slaveParser.io.downRecStat.isRecError + lvdsSMAbrt(3) := slaveParser.io.downRecStat.isRecError + + lvdsSMDeq(0) := slaveParser.io.uSMdeq(0) + lvdsSMDeq(1) := slaveParser.io.uSMdeq(1) + lvdsSMDeq(2) := slaveParser.io.uSMdeq(2) + lvdsSMDeq(3) := slaveParser.io.uSMdeq(3) + + interface.io.mstDeltaTime := slaveParser.io.mstDeltaTimeStamp + interface.io.slvDeltaTime := slaveParser.io.slvDeltaTime + interface.io.deltaFinal := slaveParser.io.deltaFinal + + interface.io.intSlvTrig(0) := slaveParser.io.dSMenq(0) + interface.io.intSlvTrig(1) := slaveParser.io.uSMdeq(0) + interface.io.intSlvTrig(2) := slaveParser.io.dSMenq(1) + interface.io.intSlvTrig(3) := slaveParser.io.uSMdeq(1) + interface.io.intSlvTrig(4) := slaveParser.io.dSMenq(2) + interface.io.intSlvTrig(5) := slaveParser.io.uSMdeq(2) + interface.io.intSlvTrig(6) := slaveParser.io.dSMenq(3) + interface.io.intSlvTrig(7) := slaveParser.io.uSMdeq(3) + + interface.io.intHWTrig(0) := slaveParser.io.intHWTrig(0) + interface.io.intHWTrig(1) := slaveParser.io.intHWTrig(1) + + + interface.io.downRecStat := slaveParser.io.downRecStat + interface.io.upRecStat := slaveParser.io.upRecStat + + } + + slaveParser.io.intHWClr(0) := interface.io.intHWTrig(0) & interface.io.intHWClr(0) + slaveParser.io.intHWClr(1) := interface.io.intHWTrig(1) & interface.io.intHWClr(1) + downCDRInAxis.io.flush := RegNext( interface.io.intHWTrig(0) & interface.io.intHWClr(0), false.B ) + upCDRInAxis.io.flush := RegNext( interface.io.intHWTrig(1) & interface.io.intHWClr(1), false.B ) + downCDROut.io.flush := RegNext( interface.io.intHWTrig(0) & interface.io.intHWClr(0), false.B ) + upCDROut.io.flush := RegNext( interface.io.intHWTrig(1) & interface.io.intHWClr(1), false.B ) + + interface.io.lvds <> slaveParser.io.lvds + + interface.io.localDevIndex := slaveParser.io.localDevIndex + + //从站链路寄存器 + interface.io.isDevOnRight := slaveParser.io.isDevOnRight + interface.io.isDevOnRightModify := slaveParser.io.isDevOnRightModify + interface.io.indexOfRightDev := slaveParser.io.indexOfRightDev +} + + +trait MstSlvSwitchWatchDog{ this: MstSlvSwitchBase => + + //看门狗1~16,SM监控 + val isWdtSMEnable = for( _ <- 0 until 16 ) yield { RegInit(false.B) } + val wdtSMCnt = for( _ <- 0 until 16 ) yield { RegInit(0.U(32.W)) } + + for( i <- 0 until 8 ){ + when( smUnit(i).io.enq || interface.io.wdtTrigger(2*i+1) ){ + isWdtSMEnable(2*i) := false.B + } .elsewhen( ~isWdtSMEnable(2*i) & smUnit(i).io.sram_w.enw & interface.io.cReg.wdtEnable.extract(2*i+1) ){ + isWdtSMEnable(2*i) := true.B + } + + when( smUnit(i).io.deq || interface.io.wdtTrigger(2*i+2) ){ + isWdtSMEnable(2*i + 1) := false.B + } .elsewhen( ~isWdtSMEnable(2*i + 1) & smUnit(i).io.sram_r.enr & interface.io.cReg.wdtEnable.extract(2*i+2) ){ + isWdtSMEnable(2*i + 1) := true.B + } + } + + for( i <- 0 until 16 ){ + when( isWdtSMEnable(i) & (wdtSMCnt(i) < interface.io.cReg.wdtTarCnt(i+1)) ){ + wdtSMCnt(i) := wdtSMCnt(i) + 1.U + } .elsewhen( ~isWdtSMEnable(i) || (wdtSMCnt(i) >= interface.io.cReg.wdtTarCnt(i+1)) ){ + wdtSMCnt(i) := 0.U + } + + // assert( wdtSMCnt(i) <= interface.io.cReg.wdtTarCnt(i+1), s"Assert Failed! wdtSMCnt($i) is larger than wdtTarCnt, Special situation?" ) + + interface.io.wdtTrigger(i+1) := wdtSMCnt(i) === interface.io.cReg.wdtTarCnt(i+1) + } + + //看门狗0 发送后回包是否超时 + val isWdtRec2RtnEnable = RegInit(false.B) + val wdtRec2RtnCnt = RegInit(0.U(32.W)) + + when( + (upCDRInAxis.io.axis.fire & upCDRInAxis.io.axis.bits.tlast) || + ~interface.io.cReg.wdtEnable.extract(0) || + interface.io.wdtTrigger(0) + ){ + isWdtRec2RtnEnable := false.B + } .elsewhen( ~isWdtRec2RtnEnable & downCDROut.io.axis.fire & interface.io.cReg.wdtEnable.extract(0) ){ + isWdtRec2RtnEnable := true.B + } + + when( isWdtRec2RtnEnable & (wdtRec2RtnCnt < interface.io.cReg.wdtTarCnt(0)) ){ + wdtRec2RtnCnt := wdtRec2RtnCnt + 1.U + } .elsewhen( ~isWdtRec2RtnEnable || (wdtRec2RtnCnt >= interface.io.cReg.wdtTarCnt(0)) ){ + wdtRec2RtnCnt := 0.U + } + + // assert( wdtRecCnt < interface.io.cReg.wdtTarCnt(0), "Assert Failed! wdtRecCnt is larger than wdtTarCnt, Special situation?" ) + + interface.io.wdtTrigger(0) := wdtRec2RtnCnt === interface.io.cReg.wdtTarCnt(0) + + //看门狗17 + val wdtRec2RecCnt = RegInit(0.U(32.W)) + + when( interface.io.cReg.wdtEnable.extract(17) & (wdtRec2RecCnt < interface.io.cReg.wdtTarCnt(17)) ){ + wdtRec2RecCnt := wdtRec2RecCnt + 1.U + } .elsewhen( + ~interface.io.cReg.wdtEnable.extract(17) || + downCDRInAxis.io.axis.fire || + (wdtRec2RecCnt >= interface.io.cReg.wdtTarCnt(17)) + ){ + wdtRec2RecCnt := 0.U + } + + interface.io.wdtTrigger(17) := wdtRec2RecCnt === interface.io.cReg.wdtTarCnt(17) + +} + +trait MstSlvSwitchDataPath{ this: MstSlvSwitchBase => + val isDwUpEx = interface.io.cReg.dwupEx.extract(0) + + when( ~isDwUpEx ){ //未交叉 + when( interface.io.cReg.modeSel === false.B ){ //slave + when( (slaveParser.io.intHWTrig(0) | slaveParser.io.intHWTrig(1)) | interface.io.isPoReset ){ //硬件错误 + downInSerDat := false.B + upInSerDat := false.B + when( slaveParser.io.isLoop ){ //回环 + io.dDatOut := false.B + io.uDatOut := io.dDatIn + } .otherwise{ //非回环 + io.dDatOut := io.dDatIn + io.uDatOut := io.uDatIn + } + } .otherwise{ //无硬件错误 + when( slaveParser.io.isLoop ){ //回环 + downInSerDat := io.dDatIn + upInSerDat := downCDROut.io.serDat + io.dDatOut := false.B + io.uDatOut := upCDROut.io.serDat + } .otherwise{ //非回环 + downInSerDat := io.dDatIn + upInSerDat := io.uDatIn + io.dDatOut := downCDROut.io.serDat + io.uDatOut := upCDROut.io.serDat + } + } + } .otherwise{ //master + downInSerDat := false.B + upInSerDat := io.uDatIn + io.dDatOut := downCDROut.io.serDat + io.uDatOut := false.B + } + } .otherwise{ //交叉 + when( interface.io.cReg.modeSel === false.B ){ //slave + when( (slaveParser.io.intHWTrig(0) | slaveParser.io.intHWTrig(1)) | interface.io.isPoReset ){ //硬件错误 + + when( slaveParser.io.isLoop ){ //回环 + io.dDatOut := io.uDatIn + io.uDatOut := false.B + downInSerDat := false.B + upInSerDat := false.B + } .otherwise{ //非回环 + io.dDatOut := io.dDatIn + io.uDatOut := io.uDatIn + downInSerDat := false.B + upInSerDat := false.B + } + } .otherwise{ //无硬件错误 + when( slaveParser.io.isLoop ){ //回环 + downInSerDat := io.uDatIn + upInSerDat := downCDROut.io.serDat + io.uDatOut := false.B + io.dDatOut := upCDROut.io.serDat + } .otherwise{ //非回环 + downInSerDat := io.uDatIn + upInSerDat := io.dDatIn + io.dDatOut := upCDROut.io.serDat + io.uDatOut := downCDROut.io.serDat + } + } + } .otherwise{ //master + downInSerDat := false.B + upInSerDat := io.dDatIn + io.uDatOut := downCDROut.io.serDat + io.dDatOut := false.B + } + } +} + +trait MstSlvSwitchB8B4{ this: MstSlvSwitchBase => + val isUsing8b10b = interface.io.cReg.b8b4Sel.extract(0) + + when( isUsing8b10b ){ + b8b10DownEncoder.io <> downCDROut.io.encode + b8b10DownDecoder.io <> downCDRInAxis.io.decode + b8b10UpEncoder.io <> upCDROut.io.encode + b8b10UpDecoder.io <> upCDRInAxis.io.decode + + b4b5DownEncoder.io.isEnable := false.B + b4b5DownEncoder.io.dataIn := 0.U + b4b5DownDecoder.io.dataIn := 0.U + b4b5UpEncoder.io.isEnable := false.B + b4b5UpEncoder.io.dataIn := 0.U + b4b5UpDecoder.io.dataIn := 0.U + } .otherwise{ + b4b5DownEncoder.io <> downCDROut.io.encode + b4b5DownDecoder.io <> downCDRInAxis.io.decode + b4b5UpEncoder.io <> upCDROut.io.encode + b4b5UpDecoder.io <> upCDRInAxis.io.decode + + b8b10DownEncoder.io.isEnable := false.B + b8b10DownEncoder.io.dataIn := 0.U + b8b10DownDecoder.io.dataIn := 0.U + b8b10UpEncoder.io.isEnable := false.B + b8b10UpEncoder.io.dataIn := 0.U + b8b10UpDecoder.io.dataIn := 0.U + } +} + +trait MstSlvSwitchCDRIn{ this: MstSlvSwitchBase => + val cdrSelB = interface.io.cReg.cdrParam === 1.U + val cdrSelC = interface.io.cReg.cdrParam === 2.U + val cdrSelA = ~cdrSelB & ~cdrSelC + + when(cdrSelB){ + io.downCDRSampleIn(1).serDat := downInSerDat + io.upCDRSampleIn(1).serDat := upInSerDat + downInSyncSerDat := io.downCDRSampleIn(1).syncSerDat + upInSyncSerDat := io.upCDRSampleIn(1).syncSerDat + + io.downCDRSampleIn(0).serDat := false.B + io.upCDRSampleIn(0).serDat := false.B + io.downCDRSampleIn(2).serDat := false.B + io.upCDRSampleIn(2).serDat := false.B + } .elsewhen(cdrSelC){ + io.downCDRSampleIn(2).serDat := downInSerDat + io.upCDRSampleIn(2).serDat := upInSerDat + downInSyncSerDat := io.downCDRSampleIn(2).syncSerDat + upInSyncSerDat := io.upCDRSampleIn(2).syncSerDat + + io.downCDRSampleIn(0).serDat := false.B + io.upCDRSampleIn(0).serDat := false.B + io.downCDRSampleIn(1).serDat := false.B + io.upCDRSampleIn(1).serDat := false.B + } .otherwise{ + io.downCDRSampleIn(0).serDat := downInSerDat + io.upCDRSampleIn(0).serDat := upInSerDat + downInSyncSerDat := io.downCDRSampleIn(0).syncSerDat + upInSyncSerDat := io.upCDRSampleIn(0).syncSerDat + + io.downCDRSampleIn(1).serDat := false.B + io.upCDRSampleIn(1).serDat := false.B + io.downCDRSampleIn(2).serDat := false.B + io.upCDRSampleIn(2).serDat := false.B + } + + + +} + +class MstSlvSwitch extends MstSlvSwitchBase +with MstSlvSwitchMaster +with MstSlvSwitchSlave +with MstSlvSwitchWatchDog +with MstSlvSwitchDataPath +with MstSlvSwitchB8B4 +with MstSlvSwitchCDRIn{ + + + + + + + + + + +} diff --git a/src/main/scala/backBoard/shin/NSpiInterface.scala b/src/main/scala/backBoard/shin/NSpiInterface.scala index 08ebe9f..fa347e4 100644 --- a/src/main/scala/backBoard/shin/NSpiInterface.scala +++ b/src/main/scala/backBoard/shin/NSpiInterface.scala @@ -1,225 +1,227 @@ -package BACK - -import chisel3._ -import chisel3.util._ - - - -abstract class SyncSpiInterfaceBase extends Module with RequireAsyncReset{ - val io = IO(new RegAccessInterfaceIO) - val qspi = IO(new QSPIInterfaceIO) - - val bitSel = withClockAndReset((~qspi.sck).asClock, qspi.csn.asAsyncReset){RegInit(0.U(3.W)) } - val byteSel = withClockAndReset((~qspi.sck).asClock, qspi.csn.asAsyncReset){RegInit(0.U(12.W))} - val exRego = withClockAndReset((~qspi.sck).asClock, qspi.csn.asAsyncReset){RegInit(0.U(8.W))} - val exRegi = withClockAndReset((~qspi.sck).asClock, qspi.csn.asAsyncReset){RegInit(0.U(8.W))} - val addrw_async = for( _ <- 0 until 2 ) yield { withClockAndReset((~qspi.sck).asClock, qspi.csn.asAsyncReset){ RegInit(0.U(16.W)) } } - val addrr_async = for( _ <- 0 until 2 ) yield { withClockAndReset((~qspi.sck).asClock, qspi.csn.asAsyncReset){ RegInit(0.U(16.W)) } } - val dataw_async = for( _ <- 0 until 2 ) yield { withClockAndReset((~qspi.sck).asClock, qspi.csn.asAsyncReset){ RegInit(0.U(8.W)) } } - val isEnR_async = for( _ <- 0 until 2 ) yield { withClockAndReset((~qspi.sck).asClock, qspi.csn.asAsyncReset){ RegInit(false.B) } } - val isEnW_async = for( _ <- 0 until 2 ) yield { withClockAndReset((~qspi.sck).asClock, qspi.csn.asAsyncReset){ RegInit(false.B) } } - - val spiLen = withClockAndReset((~qspi.sck).asClock, qspi.csn.asAsyncReset){ RegInit(2.U(12.W)) } - val spiLenTemp = withClockAndReset((~qspi.sck).asClock, qspi.csn.asAsyncReset){ RegInit(2.U(12.W)) } - val spiCnt = withClockAndReset((~qspi.sck).asClock, qspi.csn.asAsyncReset){ RegInit(0.U(12.W)) } - val isSpiWrite = withClockAndReset((~qspi.sck).asClock, qspi.csn.asAsyncReset){ RegInit(false.B) } - val isSpiRead = withClockAndReset((~qspi.sck).asClock, qspi.csn.asAsyncReset){ RegInit(false.B) } - val isPing_async = withClockAndReset((~qspi.sck).asClock, qspi.csn.asAsyncReset){ RegInit(false.B) } - - - - - - val isPong_sync = RegInit(false.B) - val isEnW_sync = for( i <- 0 until 2 ) yield { ShiftRegisters( isEnW_async(i), 3, false.B, true.B ) } - val isEnR_sync = for( i <- 0 until 2 ) yield { ShiftRegisters( isEnR_async(i), 3, false.B, true.B ) } - val datar_sync = for( _ <- 0 until 2 ) yield { RegInit(0.U(8.W)) } - val isEnW = for( i <- 0 until 2 ) yield { ~isEnW_sync(i)(2) & isEnW_sync(i)(1) } - val isEnR = for( i <- 0 until 2 ) yield { ~isEnR_sync(i)(2) & isEnR_sync(i)(1) } - -} - -trait SyncSpiAsync{ this: SyncSpiInterfaceBase => - - - - qspi.miso := exRego(7, 4) - qspi.isDirIn := isSpiWrite | (byteSel <= 3.U) - - when( true.B ){ - bitSel := ~bitSel - } - - when( bitSel.andR ){ - byteSel := byteSel + 1.U - } - - when( bitSel === 0.U ){ - exRegi := Cat( 0.U, qspi.mosi ) - }.otherwise{ - exRegi := Cat( exRegi(3,0), qspi.mosi ) - } - - when( bitSel.andR ){ - when((byteSel === 1.U || byteSel === 2.U ) ){ - exRego := 0.U //地址1,cmd - } .elsewhen( isSpiRead ){ - when( isPing_async ){ //取巧 - exRego := datar_sync(0) - } .otherwise{ - exRego := datar_sync(1) - } - } - } .otherwise{ - exRego := exRego << 4 - } - - - - - when( isEnR_async(0) | isEnW_async(0) | isEnR_async(1) | isEnW_async(1) ){ - spiCnt := spiCnt + 1.U - } - - - when( byteSel === 2.U & bitSel.andR ){ - spiLenTemp := Cat( qspi.mosi, 0.U(8.W) ) - } .elsewhen( byteSel === 3.U & bitSel === 0.U ){ - spiLenTemp := Cat( spiLenTemp(11, 8), qspi.mosi, 0.U(4.W) ) - } .elsewhen( byteSel === 3.U & bitSel.andR ){ - spiLen := Cat( spiLenTemp(11, 4), qspi.mosi ) - } - - - when( isEnW_async(0) ){ - addrw_async(0) := addrw_async(0) + 2.U - } .elsewhen( isEnW_async(1) ){ - addrw_async(1) := addrw_async(1) + 2.U - } .elsewhen( bitSel === 0.U ){ - when( byteSel === 1.U ){ - addrw_async(0) := exRegi - addrw_async(1) := exRegi - } .elsewhen( byteSel === 2.U ) { - addrw_async(0) := Cat(addrw_async(0)(7,0), exRegi) - addrw_async(1) := Cat(addrw_async(1)(7,0), exRegi) + 1.U - } - } - - - when( isEnR_async(0) ){ - addrr_async(0) := addrr_async(0) + 2.U - } .elsewhen( isEnR_async(1) ){ - addrr_async(1) := addrr_async(1) + 2.U - } .elsewhen( bitSel === 0.U ){ - when( byteSel === 1.U ){ - addrr_async(0) := exRegi - addrr_async(1) := exRegi - } .elsewhen( byteSel === 2.U ) { - addrr_async(0) := Cat(addrr_async(0)(7,0), exRegi) - addrr_async(1) := Cat(addrr_async(1)(7,0), exRegi) + 1.U - } - } - - when( byteSel === 2.U & bitSel === 0.U ){ //CS为低,且SCK上跳的第0byte - when( qspi.mosi.extract(3) ){ - isSpiRead := true.B - } .otherwise{ - isSpiWrite := true.B - } - } - - when( bitSel.andR ){ - when( byteSel >= 4.U & isSpiWrite ){ - when( ~isPing_async ){ - dataw_async(0) := Cat( exRegi(3,0), qspi.mosi ) - } .otherwise{ - dataw_async(1) := Cat( exRegi(3,0), qspi.mosi ) - } - } - } - - when( - (byteSel === 2.U & bitSel === 0.U & (spiCnt <= spiLen) & qspi.mosi === "h8".U) || - (byteSel > 2.U & bitSel === 0.U & (spiCnt <= spiLen) & isSpiRead) - ){ - when( ~isPing_async ){ - isEnR_async(0) := true.B - } .otherwise{ - isEnR_async(1) := true.B - } - } .elsewhen( bitSel.andR ){ - isEnR_async(0) := false.B - isEnR_async(1) := false.B - } - - when( byteSel >= 4.U & bitSel.andR & (spiCnt < spiLen) & isSpiWrite ){ - when( ~isPing_async ){ - isEnW_async(0) := true.B - } .otherwise{ - isEnW_async(1) := true.B - } - } .elsewhen( bitSel === 0.U ){ - isEnW_async(0) := false.B - isEnW_async(1) := false.B - } - - when( isEnR_async(0) | isEnW_async(0) ){ - assert( ~isPing_async ) - isPing_async := true.B - } .elsewhen( isEnR_async(1) | isEnW_async(1) ){ - assert( isPing_async ) - isPing_async := false.B - } - - -} - -trait SyncSpiSync{ this: SyncSpiInterfaceBase => - - io.isEnW := - ( ~isPong_sync & isEnW(0) ) | - ( isPong_sync & isEnW(1) ) - - io.isEnR := - ( ~isPong_sync & isEnR(0) ) | - ( isPong_sync & isEnR(1) ) - - - io.addrw := Mux1H(Seq( - ~isPong_sync -> addrw_async(0), - isPong_sync -> addrw_async(1), - )) - - io.addrr := Mux1H(Seq( - ~isPong_sync -> addrr_async(0), - isPong_sync -> addrr_async(1), - )) - - io.dataw := Mux1H(Seq( - ~isPong_sync -> dataw_async(0), - isPong_sync -> dataw_async(1), - )) - - when( RegNext(io.isEnR, false.B) ){ - when( RegNext(~isPong_sync, false.B) ){ - datar_sync(0) := io.datar - } .otherwise{ - datar_sync(1) := io.datar - } - } - - when( ShiftRegister( qspi.csn, 2, false.B, true.B ) ){ - isPong_sync := false.B - } .elsewhen( io.isEnR | io.isEnW ){ - isPong_sync := ~isPong_sync - } - - -} - -class SyncQSpiInterface extends SyncSpiInterfaceBase -with SyncSpiAsync -with SyncSpiSync{ -} - - +package BACK + +import chisel3._ +import chisel3.util._ + + + +abstract class SyncSpiInterfaceBase extends Module with RequireAsyncReset{ + val io = IO(new RegAccessInterfaceIO) + val qspi = IO(new QSPIInterfaceIO) + + val negedge_sck = (~qspi.sck).asClock + + val bitSel = withClockAndReset(negedge_sck, qspi.csn.asAsyncReset){RegInit(0.U(3.W)) } + val byteSel = withClockAndReset(negedge_sck, qspi.csn.asAsyncReset){RegInit(0.U(12.W))} + val exRego = withClockAndReset(negedge_sck, qspi.csn.asAsyncReset){RegInit(0.U(8.W))} + val exRegi = withClockAndReset(negedge_sck, qspi.csn.asAsyncReset){RegInit(0.U(8.W))} + val addrw_async = for( _ <- 0 until 2 ) yield { withClockAndReset(negedge_sck, qspi.csn.asAsyncReset){ RegInit(0.U(16.W)) } } + val addrr_async = for( _ <- 0 until 2 ) yield { withClockAndReset(negedge_sck, qspi.csn.asAsyncReset){ RegInit(0.U(16.W)) } } + val dataw_async = for( _ <- 0 until 2 ) yield { withClockAndReset(negedge_sck, qspi.csn.asAsyncReset){ RegInit(0.U(8.W)) } } + val isEnR_async = for( _ <- 0 until 2 ) yield { withClockAndReset(negedge_sck, qspi.csn.asAsyncReset){ RegInit(false.B) } } + val isEnW_async = for( _ <- 0 until 2 ) yield { withClockAndReset(negedge_sck, qspi.csn.asAsyncReset){ RegInit(false.B) } } + + val spiLen = withClockAndReset(negedge_sck, qspi.csn.asAsyncReset){ RegInit(2.U(12.W)) } + val spiLenTemp = withClockAndReset(negedge_sck, qspi.csn.asAsyncReset){ RegInit(2.U(12.W)) } + val spiCnt = withClockAndReset(negedge_sck, qspi.csn.asAsyncReset){ RegInit(0.U(12.W)) } + val isSpiWrite = withClockAndReset(negedge_sck, qspi.csn.asAsyncReset){ RegInit(false.B) } + val isSpiRead = withClockAndReset(negedge_sck, qspi.csn.asAsyncReset){ RegInit(false.B) } + val isPing_async = withClockAndReset(negedge_sck, qspi.csn.asAsyncReset){ RegInit(false.B) } + + + + + + val isPong_sync = RegInit(false.B) + val isEnW_sync = for( i <- 0 until 2 ) yield { ShiftRegisters( isEnW_async(i), 3, false.B, true.B ) } + val isEnR_sync = for( i <- 0 until 2 ) yield { ShiftRegisters( isEnR_async(i), 3, false.B, true.B ) } + val datar_sync = for( _ <- 0 until 2 ) yield { RegInit(0.U(8.W)) } + val isEnW = for( i <- 0 until 2 ) yield { ~isEnW_sync(i)(2) & isEnW_sync(i)(1) } + val isEnR = for( i <- 0 until 2 ) yield { ~isEnR_sync(i)(2) & isEnR_sync(i)(1) } + +} + +trait SyncSpiAsync{ this: SyncSpiInterfaceBase => + + + + qspi.miso := exRego(7, 4) + qspi.isDirIn := isSpiWrite | (byteSel <= 3.U) + + when( true.B ){ + bitSel := ~bitSel + } + + when( bitSel.andR ){ + byteSel := byteSel + 1.U + } + + when( bitSel === 0.U ){ + exRegi := Cat( 0.U, qspi.mosi ) + }.otherwise{ + exRegi := Cat( exRegi(3,0), qspi.mosi ) + } + + when( bitSel.andR ){ + when((byteSel === 1.U || byteSel === 2.U ) ){ + exRego := 0.U //地址1,cmd + } .elsewhen( isSpiRead ){ + when( isPing_async ){ //取巧 + exRego := datar_sync(0) + } .otherwise{ + exRego := datar_sync(1) + } + } + } .otherwise{ + exRego := exRego << 4 + } + + + + + when( isEnR_async(0) | isEnW_async(0) | isEnR_async(1) | isEnW_async(1) ){ + spiCnt := spiCnt + 1.U + } + + + when( byteSel === 2.U & bitSel.andR ){ + spiLenTemp := Cat( qspi.mosi, 0.U(8.W) ) + } .elsewhen( byteSel === 3.U & bitSel === 0.U ){ + spiLenTemp := Cat( spiLenTemp(11, 8), qspi.mosi, 0.U(4.W) ) + } .elsewhen( byteSel === 3.U & bitSel.andR ){ + spiLen := Cat( spiLenTemp(11, 4), qspi.mosi ) + } + + + when( isEnW_async(0) ){ + addrw_async(0) := addrw_async(0) + 2.U + } .elsewhen( isEnW_async(1) ){ + addrw_async(1) := addrw_async(1) + 2.U + } .elsewhen( bitSel === 0.U ){ + when( byteSel === 1.U ){ + addrw_async(0) := exRegi + addrw_async(1) := exRegi + } .elsewhen( byteSel === 2.U ) { + addrw_async(0) := Cat(addrw_async(0)(7,0), exRegi) + addrw_async(1) := Cat(addrw_async(1)(7,0), exRegi) + 1.U + } + } + + + when( isEnR_async(0) ){ + addrr_async(0) := addrr_async(0) + 2.U + } .elsewhen( isEnR_async(1) ){ + addrr_async(1) := addrr_async(1) + 2.U + } .elsewhen( bitSel === 0.U ){ + when( byteSel === 1.U ){ + addrr_async(0) := exRegi + addrr_async(1) := exRegi + } .elsewhen( byteSel === 2.U ) { + addrr_async(0) := Cat(addrr_async(0)(7,0), exRegi) + addrr_async(1) := Cat(addrr_async(1)(7,0), exRegi) + 1.U + } + } + + when( byteSel === 2.U & bitSel === 0.U ){ //CS为低,且SCK上跳的第0byte + when( qspi.mosi.extract(3) ){ + isSpiRead := true.B + } .otherwise{ + isSpiWrite := true.B + } + } + + when( bitSel.andR ){ + when( byteSel >= 4.U & isSpiWrite ){ + when( ~isPing_async ){ + dataw_async(0) := Cat( exRegi(3,0), qspi.mosi ) + } .otherwise{ + dataw_async(1) := Cat( exRegi(3,0), qspi.mosi ) + } + } + } + + when( + (byteSel === 2.U & bitSel === 0.U & (spiCnt <= spiLen) & qspi.mosi === "h8".U) || + (byteSel > 2.U & bitSel === 0.U & (spiCnt <= spiLen) & isSpiRead) + ){ + when( ~isPing_async ){ + isEnR_async(0) := true.B + } .otherwise{ + isEnR_async(1) := true.B + } + } .elsewhen( bitSel.andR ){ + isEnR_async(0) := false.B + isEnR_async(1) := false.B + } + + when( byteSel >= 4.U & bitSel.andR & (spiCnt < spiLen) & isSpiWrite ){ + when( ~isPing_async ){ + isEnW_async(0) := true.B + } .otherwise{ + isEnW_async(1) := true.B + } + } .elsewhen( bitSel === 0.U ){ + isEnW_async(0) := false.B + isEnW_async(1) := false.B + } + + when( isEnR_async(0) | isEnW_async(0) ){ + assert( ~isPing_async ) + isPing_async := true.B + } .elsewhen( isEnR_async(1) | isEnW_async(1) ){ + assert( isPing_async ) + isPing_async := false.B + } + + +} + +trait SyncSpiSync{ this: SyncSpiInterfaceBase => + + io.isEnW := + ( ~isPong_sync & isEnW(0) ) | + ( isPong_sync & isEnW(1) ) + + io.isEnR := + ( ~isPong_sync & isEnR(0) ) | + ( isPong_sync & isEnR(1) ) + + + io.addrw := Mux1H(Seq( + ~isPong_sync -> addrw_async(0), + isPong_sync -> addrw_async(1), + )) + + io.addrr := Mux1H(Seq( + ~isPong_sync -> addrr_async(0), + isPong_sync -> addrr_async(1), + )) + + io.dataw := Mux1H(Seq( + ~isPong_sync -> dataw_async(0), + isPong_sync -> dataw_async(1), + )) + + when( RegNext(io.isEnR, false.B) ){ + when( RegNext(~isPong_sync, false.B) ){ + datar_sync(0) := io.datar + } .otherwise{ + datar_sync(1) := io.datar + } + } + + when( ShiftRegister( qspi.csn, 2, false.B, true.B ) ){ + isPong_sync := false.B + } .elsewhen( io.isEnR | io.isEnW ){ + isPong_sync := ~isPong_sync + } + + +} + +class SyncQSpiInterface extends SyncSpiInterfaceBase +with SyncSpiAsync +with SyncSpiSync{ +} + + diff --git a/src/main/scala/backBoard/shin/SMUnit.scala b/src/main/scala/backBoard/shin/SMUnit.scala index f172d56..f5ce55b 100644 --- a/src/main/scala/backBoard/shin/SMUnit.scala +++ b/src/main/scala/backBoard/shin/SMUnit.scala @@ -1,110 +1,110 @@ -package BACK - -import chisel3._ -import chisel3.util._ - - -class SRAM2kWRIO extends Bundle { - val addrw = Input(UInt(11.W)) - val dataw = Input( UInt(8.W) ) - val enw = Input(Bool()) -} - -class SRAM2kRDIO extends Bundle { - val addrr = Input(UInt(11.W)) - val datar = Output( UInt(8.W) ) - val enr = Input(Bool()) -} - - -class SRAM2kIO extends Bundle { - val rd = new SRAM2kRDIO - val wr = new SRAM2kWRIO -} - -class SMUnitIO(depth: Int) extends Bundle { - - val sram_w = new SRAM2kWRIO - val sram_r = new SRAM2kRDIO - - val enq = Input(Bool()) - val deq = Input(Bool()) - - val sram = Flipped(Vec(depth, new SRAM2kIO)) - val cnt = Output(UInt(8.W)) - - val flush = Input(Bool()) - val isComf = Input(Bool()) - val isAbrt = Input(Bool()) -} - -abstract class SMUnitBase(depth: Int = 4) extends Module with RequireAsyncReset{ - val io: SMUnitIO = IO(new SMUnitIO(depth)) - - - val wPtr = RegInit(0.U((log2Ceil(depth)+1).W)) - val rPtr = RegInit(0.U((log2Ceil(depth)+1).W)) - val cPtr = RegInit(0.U((log2Ceil(depth)+1).W)) - - val isFull = (wPtr ^ rPtr) === (1.U << log2Ceil(depth)) - val isEmpty = ( cPtr === rPtr ) - - when(io.flush){ - wPtr := 0.U - } .elsewhen( io.enq & ~isFull ){ - wPtr := wPtr + 1.U - // assert( ~isFull) - } .elsewhen( io.isAbrt ){ - wPtr := cPtr - } - - when(io.flush){ - rPtr := 0.U - } .elsewhen( io.deq & ~isEmpty ){ - rPtr := rPtr + 1.U - // assert( ~isEmpty ) - } - - for( i <- 0 until depth ){ - io.sram(i).wr.addrw := 0.U - io.sram(i).wr.dataw := 0.U - io.sram(i).wr.enw := false.B - - io.sram(i).rd.addrr := 0.U - io.sram(i).rd.enr := false.B - } - - for( i <- 0 until depth ){ - when( (wPtr(log2Ceil(depth)-1, 0)) === i.U & ~isFull ){ - io.sram(i).wr <> io.sram_w - } - - when( (rPtr(log2Ceil(depth)-1, 0)) === i.U & ~isEmpty){ - io.sram(i).rd.addrr := io.sram_r.addrr - io.sram(i).rd.enr := io.sram_r.enr - } - } - - io.sram_r.datar := Mux1H( ( 0 until depth).map{ i => - ( (rPtr(log2Ceil(depth)-1, 0)) === i.U ) -> io.sram(i).rd.datar - }) - - io.cnt := cPtr - rPtr - - when( io.flush ){ - cPtr := 0.U - } .elsewhen( io.isComf ){ - cPtr := wPtr - } - - -} - -class SMUnit(depth: Int = 4) extends SMUnitBase(depth) { - - -} - - - - +package BACK + +import chisel3._ +import chisel3.util._ + + +class SRAM2kWRIO extends Bundle { + val addrw = Input(UInt(11.W)) + val dataw = Input( UInt(8.W) ) + val enw = Input(Bool()) +} + +class SRAM2kRDIO extends Bundle { + val addrr = Input(UInt(11.W)) + val datar = Output( UInt(8.W) ) + val enr = Input(Bool()) +} + + +class SRAM2kIO extends Bundle { + val rd = new SRAM2kRDIO + val wr = new SRAM2kWRIO +} + +class SMUnitIO(depth: Int) extends Bundle { + + val sram_w = new SRAM2kWRIO + val sram_r = new SRAM2kRDIO + + val enq = Input(Bool()) + val deq = Input(Bool()) + + val sram = Flipped(Vec(depth, new SRAM2kIO)) + val cnt = Output(UInt(8.W)) + + val flush = Input(Bool()) + val isComf = Input(Bool()) + val isAbrt = Input(Bool()) +} + +abstract class SMUnitBase(depth: Int = 4) extends Module with RequireAsyncReset{ + val io: SMUnitIO = IO(new SMUnitIO(depth)) + + + val wPtr = RegInit(0.U((log2Ceil(depth)+1).W)) + val rPtr = RegInit(0.U((log2Ceil(depth)+1).W)) + val cPtr = RegInit(0.U((log2Ceil(depth)+1).W)) + + val isFull = (wPtr ^ rPtr) === (1.U << log2Ceil(depth)) + val isEmpty = ( cPtr === rPtr ) + + when(io.flush){ + wPtr := 0.U + } .elsewhen( io.enq & ~isFull ){ + wPtr := wPtr + 1.U + // assert( ~isFull) + } .elsewhen( io.isAbrt ){ + wPtr := cPtr + } + + when(io.flush){ + rPtr := 0.U + } .elsewhen( io.deq & ~isEmpty ){ + rPtr := rPtr + 1.U + // assert( ~isEmpty ) + } + + for( i <- 0 until depth ){ + io.sram(i).wr.addrw := 0.U + io.sram(i).wr.dataw := 0.U + io.sram(i).wr.enw := false.B + + io.sram(i).rd.addrr := 0.U + io.sram(i).rd.enr := false.B + } + + for( i <- 0 until depth ){ + when( (wPtr(log2Ceil(depth)-1, 0)) === i.U & ~isFull ){ + io.sram(i).wr <> io.sram_w + } + + when( (rPtr(log2Ceil(depth)-1, 0)) === i.U & ~isEmpty){ + io.sram(i).rd.addrr := io.sram_r.addrr + io.sram(i).rd.enr := io.sram_r.enr + } + } + + io.sram_r.datar := Mux1H( ( 0 until depth).map{ i => + ( (rPtr(log2Ceil(depth)-1, 0)) === i.U ) -> io.sram(i).rd.datar + }) + + io.cnt := cPtr - rPtr + + when( io.flush ){ + cPtr := 0.U + } .elsewhen( io.isComf ){ + cPtr := wPtr + } + + +} + +class SMUnit(depth: Int = 4) extends SMUnitBase(depth) { + + +} + + + + diff --git a/src/main/scala/backBoard/shin/ShareSRAM.scala b/src/main/scala/backBoard/shin/ShareSRAM.scala index 10a4b9b..8a10b84 100644 --- a/src/main/scala/backBoard/shin/ShareSRAM.scala +++ b/src/main/scala/backBoard/shin/ShareSRAM.scala @@ -1,66 +1,66 @@ -package BACK - -import chisel3._ -import chisel3.util._ - -class ShareSRAM2k extends BlackBox with HasBlackBoxInline { - - class ShareSRAM2kIO extends Bundle{ - val dataw = Input( UInt(8.W) ) - val addrw = Input(UInt(15.W)) - val enw = Input(Bool()) - - val datar = Output( UInt(8.W) ) - val addrr = Input(UInt(15.W)) - val enr = Input(Bool()) - - val clockr = Input(Bool()) - val clockw = Input(Bool()) - - } - val io: ShareSRAM2kIO = IO(new ShareSRAM2kIO) - - setInline("ShareSRAM2k.v", - """ - - | module ShareSRAM2k( - | input [7:0] dataw, - | input [14:0] addrw, - | input enw, - | - | output [7:0] datar, - | input [14:0] addrr, - | input enr, - | - | input clockr, - | input clockw - | ); - | - | reg [7:0] ram[0:2047]; - | reg [7:0] data_r_reg; - | - | always @(posedge clockw) begin - | if(enw) begin - | ram[addrw] <= #1 dataw; - | end - | end - | - | always @(posedge clockr) begin - | if(enr) begin - | data_r_reg <= #1 ram[addrr]; - | end - | end - | - | assign datar = data_r_reg; - | - | initial begin - | for ( integer i = 0; i < 2048; i = i + 1 ) begin - | ram[i] = $random; - | end - | - | data_r_reg = $random; - | end - | - | endmodule - """.stripMargin) +package BACK + +import chisel3._ +import chisel3.util._ + +class ShareSRAM2k extends BlackBox with HasBlackBoxInline { + + class ShareSRAM2kIO extends Bundle{ + val dataw = Input( UInt(8.W) ) + val addrw = Input(UInt(15.W)) + val enw = Input(Bool()) + + val datar = Output( UInt(8.W) ) + val addrr = Input(UInt(15.W)) + val enr = Input(Bool()) + + val clockr = Input(Bool()) + val clockw = Input(Bool()) + + } + val io: ShareSRAM2kIO = IO(new ShareSRAM2kIO) + + setInline("ShareSRAM2k.v", + """ + + | module ShareSRAM2k( + | input [7:0] dataw, + | input [14:0] addrw, + | input enw, + | + | output [7:0] datar, + | input [14:0] addrr, + | input enr, + | + | input clockr, + | input clockw + | ); + | + | reg [7:0] ram[0:2047]; + | reg [7:0] data_r_reg; + | + | always @(posedge clockw) begin + | if(enw) begin + | ram[addrw] <= #1 dataw; + | end + | end + | + | always @(posedge clockr) begin + | if(enr) begin + | data_r_reg <= #1 ram[addrr]; + | end + | end + | + | assign datar = data_r_reg; + | + | initial begin + | for ( integer i = 0; i < 2048; i = i + 1 ) begin + | ram[i] = $random; + | end + | + | data_r_reg = $random; + | end + | + | endmodule + """.stripMargin) } \ No newline at end of file diff --git a/src/main/scala/backBoard/shin/ShinTop.scala b/src/main/scala/backBoard/shin/ShinTop.scala index b9b8409..fc6aa34 100644 --- a/src/main/scala/backBoard/shin/ShinTop.scala +++ b/src/main/scala/backBoard/shin/ShinTop.scala @@ -1,64 +1,64 @@ -package BACK - -import chisel3._ -import chisel3.util._ - -import chisel3.experimental.dataview._ - -class ShinTopIO extends TopBase_IO_Bundle{ - val multiCLK = Input(Vec(16, Bool())) - val multiCLKDiv4 = Input(Vec(4, Bool())) -} - - -class ShinTop extends Module with RequireAsyncReset{ - val io: ShinTopIO = IO(new ShinTopIO) - - val mstSlvSwitch = Module(new MstSlvSwitch) - - - - { - val downCDRInSampleA = Module(new CDRInMultiSample(clkNum = 16)) - val upCDRInSampleA = Module(new CDRInMultiSample(clkNum = 16)) - - downCDRInSampleA.multiCLK := io.multiCLK - upCDRInSampleA.multiCLK := io.multiCLK - - downCDRInSampleA.io <> mstSlvSwitch.io.downCDRSampleIn(0) - upCDRInSampleA.io <> mstSlvSwitch.io.upCDRSampleIn(0) - } - - { - val downCDRInSampleB = Module(new CDRInMultiSample(clkNum = 4)) - val upCDRInSampleB = Module(new CDRInMultiSample(clkNum = 4)) - - downCDRInSampleB.multiCLK := io.multiCLKDiv4 - upCDRInSampleB.multiCLK := io.multiCLKDiv4 - - downCDRInSampleB.io <> mstSlvSwitch.io.downCDRSampleIn(1) - upCDRInSampleB.io <> mstSlvSwitch.io.upCDRSampleIn(1) - } - - { - val downCDRInSampleC = Module(new CDRInOriSample) - val upCDRInSampleC = Module(new CDRInOriSample) - - downCDRInSampleC.multiCLK := io.multiCLK - upCDRInSampleC.multiCLK := io.multiCLK - - downCDRInSampleC.io <> mstSlvSwitch.io.downCDRSampleIn(2) - upCDRInSampleC.io <> mstSlvSwitch.io.upCDRSampleIn(2) - } - - - - io.viewAsSupertype(new TopBase_IO_Bundle) <> mstSlvSwitch.io.viewAsSupertype(new TopBase_IO_Bundle) - - - -} - - - - +package BACK + +import chisel3._ +import chisel3.util._ + +import chisel3.experimental.dataview._ + +class ShinTopIO extends TopBase_IO_Bundle{ + val multiCLK = Input(Vec(16, Bool())) + val multiCLKDiv4 = Input(Vec(4, Bool())) +} + + +class ShinTop extends Module with RequireAsyncReset{ + val io: ShinTopIO = IO(new ShinTopIO) + + val mstSlvSwitch = Module(new MstSlvSwitch) + + + + { + val downCDRInSampleA = Module(new CDRInMultiSample(clkNum = 16)) + val upCDRInSampleA = Module(new CDRInMultiSample(clkNum = 16)) + + downCDRInSampleA.multiCLK := io.multiCLK + upCDRInSampleA.multiCLK := io.multiCLK + + downCDRInSampleA.io <> mstSlvSwitch.io.downCDRSampleIn(0) + upCDRInSampleA.io <> mstSlvSwitch.io.upCDRSampleIn(0) + } + + { + val downCDRInSampleB = Module(new CDRInMultiSample(clkNum = 4)) + val upCDRInSampleB = Module(new CDRInMultiSample(clkNum = 4)) + + downCDRInSampleB.multiCLK := io.multiCLKDiv4 + upCDRInSampleB.multiCLK := io.multiCLKDiv4 + + downCDRInSampleB.io <> mstSlvSwitch.io.downCDRSampleIn(1) + upCDRInSampleB.io <> mstSlvSwitch.io.upCDRSampleIn(1) + } + + { + val downCDRInSampleC = Module(new CDRInOriSample) + val upCDRInSampleC = Module(new CDRInOriSample) + + downCDRInSampleC.multiCLK := io.multiCLK + upCDRInSampleC.multiCLK := io.multiCLK + + downCDRInSampleC.io <> mstSlvSwitch.io.downCDRSampleIn(2) + upCDRInSampleC.io <> mstSlvSwitch.io.upCDRSampleIn(2) + } + + + + io.viewAsSupertype(new TopBase_IO_Bundle) <> mstSlvSwitch.io.viewAsSupertype(new TopBase_IO_Bundle) + + + +} + + + + diff --git a/src/main/scala/backBoard/shin/SlaveParser.scala b/src/main/scala/backBoard/shin/SlaveParser.scala index a36f43a..c4824e4 100644 --- a/src/main/scala/backBoard/shin/SlaveParser.scala +++ b/src/main/scala/backBoard/shin/SlaveParser.scala @@ -1,1043 +1,1043 @@ -package BACK - -import chisel3._ -import chisel3.util._ - - -class FrameHeader extends Bundle{ - val frameLenAim = UInt(12.W) //帧长度目标 - val frameStyle = UInt(2.W) //包类型 - val frameInfo = UInt(16.W) //其它信息,如probe -} - -class SubMsgHeader extends Bundle{ - val devIndex = UInt(14.W) // 子报文中设备索引 - val style = UInt(2.W) // 子报文类型 - val address = UInt(16.W) //子报文地址 - val operator = UInt(4.W) //子报文命令类型 - val length = UInt(12.W) //子报文负载长度 - - - def isSeqIndex = style === 0.U - def isLgcIndex = style === 2.U -} - -class SubMsgTail extends Bundle{ - val workCnt = UInt(16.W) //子报文工作计数 -} - -class SlaveParserIO extends Bundle{ - val downIn = Flipped( Decoupled(new AXIS_Bundle(8)) ) - val downOut = Decoupled(new AXIS_Bundle(8)) - - val upIn = Flipped( Decoupled(new AXIS_Bundle(8)) ) - val upOut = Decoupled(new AXIS_Bundle(8)) - - val sram_w = Vec( 4, Flipped(new SRAM2kWRIO)) - val sram_r = Vec( 4, Flipped(new SRAM2kRDIO)) - - val dSMenq = Output( Vec(4, Bool()) ) - val uSMdeq = Output( Vec(4, Bool()) ) - - - - - val localDevIndex = Output(UInt(16.W)) - - //开放链路寄存器组给interface - val isDevOnRight = Output(UInt(2.W)) - val isDevOnRightModify = Output(Bool()) - val indexOfRightDev = Output(UInt(14.W)) - - - val mstDeltaTimeStamp = Output(UInt(32.W)) - val slvDeltaTime = Output(UInt(32.W)) - val deltaFinal = Output(UInt(64.W)) - - val isLoop = Output(Bool()) - - val cReg = Input(new CommonRegisterBundle) - val sReg = Input(new SlaveRegisterBundle) - - val lvds = new RegAccessInterfaceIO - - val intHWTrig = Output(Vec(2, Bool())) - val intHWClr = Input (Vec(2, Bool())) - - val downRecStat = Output(new Stat_IO_Bundle) - val upRecStat = Output(new Stat_IO_Bundle) -} - -abstract class SlaveParserBase extends Module with RequireAsyncReset{ - val io: SlaveParserIO = IO(new SlaveParserIO) - - val sReg = io.sReg - - - - val FRAME_STYLE_COMMON = 0.U - val FRAME_STYLE_PROBE = 1.U - - val SUBMSG_OPERATOR_UNIREAD = 0.U - val SUBMSG_OPERATOR_UNIWRITE = 1.U - val SUBMSG_OPERATOR_UNIRDWR = 2.U - val SUBMSG_OPERATOR_SYNCA = "ha".U - val SUBMSG_OPERATOR_INDEX = "hb".U - val SUBMSG_OPERATOR_SYNCC = "hc".U - val SUBMSG_OPERATOR_BOARDREAD = "hd".U - val SUBMSG_OPERATOR_BOARDWRITE = "he".U - val SUBMSG_OPERATOR_BOARDRDWR = "hf".U - - - val STATE_IDLE = 0.U //空闲 - val STATE_HEADER = 1.U //长度/ /保留2bits //包类型 - val STATE_SUBMSG_HEADER = 2.U //子报文设备索引 //子报文类型 - val STATE_PAYLOAD_DATA = 3.U //子报文数据 - val STATE_SUBMSG_TAIL = 4.U - val STATE_CRC = 5.U //CRC校验 - val STATE_ERROR = 6.U // - val STATE_WAIT = 7.U - - - - val downRecParser = Module(new SlaveRecParser) - val upRecParser = Module(new SlaveRecParser) - val downSendGen = Module(new SlaveSendGen) - val upSendGen = Module(new SlaveSendGen) - - val isReadyToProbe = RegInit(false.B) - val isAckProbe = RegInit(false.B) - val isLastDevice: Bool = RegInit(true.B) - - - io.isDevOnRight := Mux( isLastDevice, "b00".U, "b01".U ) - val isDevOnRightModify = RegInit(false.B); io.isDevOnRightModify := isDevOnRightModify - val indexOfRightDev = RegInit(0.U(14.W)); io.indexOfRightDev := indexOfRightDev - - val localDevIndex = RegInit(0.U(14.W)); io.localDevIndex := localDevIndex //当前设备索引 - - - - - - - - - //处理主报文 - - - downSendGen.io.frameReq.valid := downRecParser.io.frameReq.fire - assert( ~(downSendGen.io.frameReq.valid & ~downSendGen.io.frameReq.ready) ) - - { - downSendGen.io.frameReq.bits := downRecParser.io.frameReq.bits - //voerride - downSendGen.io.frameReq.bits.frameInfo := localDevIndex - } - - - val upFrameProbeInfo: FrameHeader = Wire(new FrameHeader) - upFrameProbeInfo.frameLenAim := 0.U //帧长度目标 - upFrameProbeInfo.frameStyle := FRAME_STYLE_PROBE //包类型 - upFrameProbeInfo.frameInfo := localDevIndex //其它信息,如probe - - upSendGen.io.frameReq.valid := - (upRecParser.io.frameReq.fire & upRecParser.io.frameReq.bits.frameStyle === FRAME_STYLE_COMMON) | - isAckProbe - - assert( ~(upSendGen.io.frameReq.valid & ~upSendGen.io.frameReq.ready) ) - - - assert( ~(upRecParser.io.frameReq.fire & isAckProbe), "Assert Failed, Check Softwave, Probe is Sent while transfering!\n" ) - - upSendGen.io.frameReq.bits := Mux1H(Seq( - upRecParser.io.frameReq.fire -> upRecParser.io.frameReq.bits, //上行转发 - isAckProbe -> upFrameProbeInfo, //上行探针 - )) - - - - - - - -//////////////////////////////////////// - - //子报文 - val isDownSubMsgHeadValid = for( _ <- 0 until 2 ) yield { RegInit(false.B) } - val isUpSubMsgHeadValid = for( _ <- 0 until 2 ) yield { RegInit(false.B) } - - val isDownSubMsgTailValid = for( _ <- 0 until 2 ) yield { RegInit(false.B) } - val isUpSubMsgTailValid = for( _ <- 0 until 2 ) yield { RegInit(false.B) } - - - - //接收子报文 - - val downSubMsgHeadInfo = for( _ <- 0 until 2 ) yield { RegInit(0.U.asTypeOf(new SubMsgTxInfo)) } //子报文头 - val upSubMsgHeadInfo = for( _ <- 0 until 2 ) yield { RegInit(0.U.asTypeOf(new SubMsgTxInfo)) } - val downSubMsgTailInfo = for( _ <- 0 until 2 ) yield { RegInit(0.U.asTypeOf(new SubMsgTail) ) } //子报文头 - val upSubMsgTailInfo = for( _ <- 0 until 2 ) yield { RegInit(0.U.asTypeOf(new SubMsgTail) ) } - - - val downRecFifo = for( _ <- 0 until 2 ) yield { Module(new Queue(UInt(8.W), 20)) } //子报文负载 - val upRecFifo = for( _ <- 0 until 2 ) yield { Module(new Queue(UInt(8.W), 20)) } - - val isDownRecPing = RegInit(false.B) - val isUpRecPing = RegInit(false.B) - - - - //下行接收 - when( downRecParser.io.subMsgHeadReq.fire ){ - when( isDownRecPing ){ - downSubMsgHeadInfo(0).devIndex := downRecParser.io.subMsgHeadReq.bits.devIndex - downSubMsgHeadInfo(0).style := downRecParser.io.subMsgHeadReq.bits.style - downSubMsgHeadInfo(0).address := downRecParser.io.subMsgHeadReq.bits.address - downSubMsgHeadInfo(0).operator := downRecParser.io.subMsgHeadReq.bits.operator - downSubMsgHeadInfo(0).length := downRecParser.io.subMsgHeadReq.bits.length - downSubMsgHeadInfo(0).source := 0.U - } .otherwise{ //pong - downSubMsgHeadInfo(1).devIndex := downRecParser.io.subMsgHeadReq.bits.devIndex - downSubMsgHeadInfo(1).style := downRecParser.io.subMsgHeadReq.bits.style - downSubMsgHeadInfo(1).address := downRecParser.io.subMsgHeadReq.bits.address - downSubMsgHeadInfo(1).operator := downRecParser.io.subMsgHeadReq.bits.operator - downSubMsgHeadInfo(1).length := downRecParser.io.subMsgHeadReq.bits.length - downSubMsgHeadInfo(1).source := 1.U - } - } - - when( downRecParser.io.subMsgTailReq.fire ){ - when( isDownRecPing ){ - downSubMsgTailInfo(0).workCnt := downRecParser.io.subMsgTailReq.bits.workCnt - } .otherwise{ //pong - downSubMsgTailInfo(1).workCnt := downRecParser.io.subMsgTailReq.bits.workCnt - } - } - - - - - when( isDownRecPing ){ //req fire 后 - downRecFifo(0).io.enq.valid := downRecParser.io.data.valid - downRecFifo(0).io.enq.bits := downRecParser.io.data.bits - downRecParser.io.data.ready := downRecFifo(0).io.enq.ready - - downRecFifo(1).io.enq.valid := false.B - downRecFifo(1).io.enq.bits := 0.U - } .otherwise{ - downRecFifo(0).io.enq.valid := false.B - downRecFifo(0).io.enq.bits := 0.U - - downRecFifo(1).io.enq.valid := downRecParser.io.data.valid - downRecFifo(1).io.enq.bits := downRecParser.io.data.bits - downRecParser.io.data.ready := downRecFifo(1).io.enq.ready - } - - - - - - //上行接收 - when( upRecParser.io.subMsgHeadReq.fire ){ - when( isUpRecPing ){ - upSubMsgHeadInfo(0).devIndex := upRecParser.io.subMsgHeadReq.bits.devIndex - upSubMsgHeadInfo(0).style := upRecParser.io.subMsgHeadReq.bits.style - upSubMsgHeadInfo(0).address := upRecParser.io.subMsgHeadReq.bits.address - upSubMsgHeadInfo(0).operator := upRecParser.io.subMsgHeadReq.bits.operator - upSubMsgHeadInfo(0).length := upRecParser.io.subMsgHeadReq.bits.length - upSubMsgHeadInfo(0).source := 0.U - } .otherwise{ - upSubMsgHeadInfo(1).devIndex := upRecParser.io.subMsgHeadReq.bits.devIndex - upSubMsgHeadInfo(1).style := upRecParser.io.subMsgHeadReq.bits.style - upSubMsgHeadInfo(1).address := upRecParser.io.subMsgHeadReq.bits.address - upSubMsgHeadInfo(1).operator := upRecParser.io.subMsgHeadReq.bits.operator - upSubMsgHeadInfo(1).length := upRecParser.io.subMsgHeadReq.bits.length - upSubMsgHeadInfo(1).source := 1.U - } - } - - when( upRecParser.io.subMsgTailReq.fire ){ - when( isUpRecPing ){ - upSubMsgTailInfo(0).workCnt := upRecParser.io.subMsgTailReq.bits.workCnt - } .otherwise{ - upSubMsgTailInfo(1).workCnt := upRecParser.io.subMsgTailReq.bits.workCnt - } - } - - - - - - - //子报文下行发送 - - val isDownSendPing = RegInit(false.B) - val isUpSendPing = RegInit(false.B) - - - - downSendGen.io.subMsgHeadReq.valid := - ( isDownSendPing & isDownSubMsgHeadValid(0) ) | (~isDownSendPing & isDownSubMsgHeadValid(1)) - - downSendGen.io.subMsgHeadReq.bits := Mux( isDownSendPing, downSubMsgHeadInfo(0), downSubMsgHeadInfo(1) ) - - downSendGen.io.subMsgTailReq.valid := - ( isDownSendPing & isDownSubMsgTailValid(0) ) | ( ~isDownSendPing & isDownSubMsgTailValid(1)) - - downSendGen.io.subMsgTailReq.bits := Mux( isDownSendPing, downSubMsgTailInfo(0), downSubMsgTailInfo(1) ) - - - - when( downSendGen.io.subMsgHeadReq.fire ){ //ready - when( isDownSendPing ){ - assert( isDownSubMsgHeadValid(0) ) - isDownSubMsgHeadValid(0) := false.B - } .otherwise{ - assert( isDownSubMsgHeadValid(1) ) - isDownSubMsgHeadValid(1) := false.B - } - } .elsewhen( downRecParser.io.subMsgHeadReq.fire ){ - when( isDownRecPing ){ - assert( ~isDownSubMsgHeadValid(0) ) - isDownSubMsgHeadValid(0) := true.B - } .otherwise{ - assert( ~isDownSubMsgHeadValid(1) ) - isDownSubMsgHeadValid(1) := true.B - } - } - - when( downSendGen.io.subMsgTailReq.fire ){ - when( isDownSendPing ){ - assert( isDownSubMsgTailValid(0) ) - isDownSubMsgTailValid(0) := false.B - } .otherwise{ - assert( isDownSubMsgTailValid(1) ) - isDownSubMsgTailValid(1) := false.B - } - } .elsewhen( downRecParser.io.subMsgTailReq.fire ){ - when( isDownRecPing ){ - assert( ~isDownSubMsgTailValid(0) ) - isDownSubMsgTailValid(0) := true.B - } .otherwise{ - assert( ~isDownSubMsgTailValid(1) ) - isDownSubMsgTailValid(1) := true.B - } - } - - when( downSendGen.io.subMsgTailReq.fire ){ //ready - isDownSendPing := ~isDownSendPing - } .elsewhen( downRecParser.io.subMsgTailReq.fire ){ - isDownRecPing := ~isDownRecPing - } - - downRecFifo(0).io.deq <> downSendGen.io.data(0) - downRecFifo(1).io.deq <> downSendGen.io.data(1) - - - //子报文上行发送 - - - upSendGen.io.subMsgHeadReq.valid := - ( isUpSendPing & isUpSubMsgHeadValid(0) ) | - ( ~isUpSendPing & isUpSubMsgHeadValid(1) ) - - upSendGen.io.subMsgHeadReq.bits := Mux( isUpSendPing, upSubMsgHeadInfo(0), upSubMsgHeadInfo(1) ) - - upSendGen.io.subMsgTailReq.valid := - ( isUpSendPing & isUpSubMsgTailValid(0) ) | - ( ~isUpSendPing & isUpSubMsgTailValid(1) ) - - upSendGen.io.subMsgTailReq.bits := Mux( isUpSendPing, upSubMsgTailInfo(0), upSubMsgTailInfo(1) ) - - when( upSendGen.io.subMsgHeadReq.fire ){ //ready - when( isUpSendPing ){ - assert( isUpSubMsgHeadValid(0) ) - isUpSubMsgHeadValid(0) := false.B - } .otherwise{ - assert( isUpSubMsgHeadValid(1) ) - isUpSubMsgHeadValid(1) := false.B - } - }.elsewhen( upRecParser.io.subMsgHeadReq.fire ){ - when( isUpRecPing ){ - assert( ~isUpSubMsgHeadValid(0) ) - isUpSubMsgHeadValid(0) := true.B - } .otherwise{ - assert( ~isUpSubMsgHeadValid(1) ) - isUpSubMsgHeadValid(1) := true.B - } - } - - when( upSendGen.io.subMsgTailReq.fire ){ - when( isUpSendPing ){ - assert( isUpSubMsgTailValid(0) ) - isUpSubMsgTailValid(0) := false.B - } .otherwise{ - assert( isUpSubMsgTailValid(1) ) - isUpSubMsgTailValid(1) := false.B - } - } .elsewhen( upRecParser.io.subMsgTailReq.fire ){ - when( isUpRecPing ){ - assert( ~isUpSubMsgTailValid(0) ) - isUpSubMsgTailValid(0) := true.B - } .otherwise{ - assert( ~isUpSubMsgTailValid(1) ) - isUpSubMsgTailValid(1) := true.B - } - } - - - when( upSendGen.io.subMsgTailReq.fire ){ //ready - isUpSendPing := ~isUpSendPing - }.elsewhen( upRecParser.io.subMsgTailReq.fire ){ - isUpRecPing := ~isUpRecPing - } - - upRecFifo(0).io.deq <> upSendGen.io.data(0) - upRecFifo(1).io.deq <> upSendGen.io.data(1) - -} - - - - - - - - - - - - - - - -trait SlaveParserIndex{ this: SlaveParserBase => - //下行接收 - when( downRecParser.io.subMsgTailReq.fire ){ - when( isDownRecPing & - downSubMsgHeadInfo(0).devIndex === 0.U & - downSubMsgHeadInfo(0).style === 0.U & - downSubMsgHeadInfo(0).operator === SUBMSG_OPERATOR_INDEX - ){ - localDevIndex := downRecParser.io.subMsgTailReq.bits.workCnt + 1.U - indexOfRightDev := Mux(isLastDevice, 0.U, downRecParser.io.subMsgTailReq.bits.workCnt + 2.U) - downSubMsgTailInfo(0).workCnt := downRecParser.io.subMsgTailReq.bits.workCnt + 1.U - } .elsewhen( ~isDownRecPing & - downSubMsgHeadInfo(1).devIndex === 0.U & - downSubMsgHeadInfo(1).style === 0.U & - downSubMsgHeadInfo(1).operator === SUBMSG_OPERATOR_INDEX - ){ //pong - localDevIndex := downRecParser.io.subMsgTailReq.bits.workCnt + 1.U - indexOfRightDev := Mux(isLastDevice, 0.U, downRecParser.io.subMsgTailReq.bits.workCnt + 2.U) - downSubMsgTailInfo(1).workCnt := downRecParser.io.subMsgTailReq.bits.workCnt + 1.U - } - } - -} - - - - - -trait SlaveParserRW{ this: SlaveParserBase => - - val isDownLgcWorked = RegInit(false.B) - val isUpLgcWorked = RegInit(false.B) - - //下行接收 - when( downRecParser.io.subMsgTailReq.fire ){ - when( isDownRecPing ){ - //override - when( - ( ( (downSubMsgHeadInfo(0).operator === SUBMSG_OPERATOR_UNIWRITE) | (downSubMsgHeadInfo(0).operator === SUBMSG_OPERATOR_UNIRDWR) ) & ( (downSubMsgHeadInfo(0).isSeqIndex & downSubMsgHeadInfo(0).devIndex === localDevIndex) || ( downSubMsgHeadInfo(0).isLgcIndex & isDownLgcWorked ) ) ) | - ( ( (downSubMsgHeadInfo(0).operator === SUBMSG_OPERATOR_BOARDWRITE) | (downSubMsgHeadInfo(0).operator === SUBMSG_OPERATOR_BOARDRDWR) ) ) - ) { //自身包//写操作或读写操作) - downSubMsgTailInfo(0).workCnt := downRecParser.io.subMsgTailReq.bits.workCnt + 1.U - } - - } .otherwise{ //pong - //override - when( - ( ( (downSubMsgHeadInfo(1).operator === SUBMSG_OPERATOR_UNIWRITE ) | (downSubMsgHeadInfo(1).operator === SUBMSG_OPERATOR_UNIRDWR ) ) & ( (downSubMsgHeadInfo(1).isSeqIndex & downSubMsgHeadInfo(1).devIndex === localDevIndex) || ( downSubMsgHeadInfo(1).isLgcIndex & isDownLgcWorked ) ) ) | - ( ( (downSubMsgHeadInfo(1).operator === SUBMSG_OPERATOR_BOARDWRITE) | (downSubMsgHeadInfo(1).operator === SUBMSG_OPERATOR_BOARDRDWR) ) ) - ) { //自身包//写操作或读写操作 ) - downSubMsgTailInfo(1).workCnt := downRecParser.io.subMsgTailReq.bits.workCnt + 1.U - } - } - } - - - - //写入 SM或寄存器空间 - - val addrw = RegInit(0.U(15.W)) - val logicAddrwNext = Wire( UInt(30.W) ) - val logicAddrw = RegNext(logicAddrwNext, 0.U(30.W)) - - val isWRReg = (addrw(14,11) === "b0000".U) - val isWRSM0 = (addrw(14,11) === "b0001".U) - val isWRSM2 = (addrw(14,11) === "b0011".U) - val isWRSM4 = (addrw(14,11) === "b0101".U) - val isWRSM6 = (addrw(14,11) === "b0111".U) - - val downTransLenCnt = RegInit(0.U) - - val isWrite = (downRecParser.io.stateCurr === STATE_PAYLOAD_DATA) & ( //req fire 后 已经反相 - ( isDownRecPing & ( (downSubMsgHeadInfo(0).operator === SUBMSG_OPERATOR_UNIWRITE) | (downSubMsgHeadInfo(0).operator === SUBMSG_OPERATOR_UNIRDWR ) ) & ( (downSubMsgHeadInfo(0).isSeqIndex & downSubMsgHeadInfo(0).devIndex === localDevIndex) || ( downSubMsgHeadInfo(0).isLgcIndex & downTransLenCnt =/= 0.U) ) ) | - ( ~isDownRecPing & ( (downSubMsgHeadInfo(1).operator === SUBMSG_OPERATOR_UNIWRITE) | (downSubMsgHeadInfo(1).operator === SUBMSG_OPERATOR_UNIRDWR ) ) & ( (downSubMsgHeadInfo(1).isSeqIndex & downSubMsgHeadInfo(1).devIndex === localDevIndex) || ( downSubMsgHeadInfo(1).isLgcIndex & downTransLenCnt =/= 0.U) ) ) | - ( isDownRecPing & ( (downSubMsgHeadInfo(0).operator === SUBMSG_OPERATOR_BOARDWRITE) | (downSubMsgHeadInfo(0).operator === SUBMSG_OPERATOR_BOARDRDWR) ) ) | - ( ~isDownRecPing & ( (downSubMsgHeadInfo(1).operator === SUBMSG_OPERATOR_BOARDWRITE) | (downSubMsgHeadInfo(1).operator === SUBMSG_OPERATOR_BOARDRDWR) ) ) - ) - - - val isDownLgcAddrwAcquireTrans = //是否触发地址转换 - (downTransLenCnt === 0.U) & ( (0 until 16).map{ i => - sReg.ebmmu(i).isEnable & (sReg.ebmmu(i).EBMMU_OP_WR || sReg.ebmmu(i).EBMMU_OP_RW) & (logicAddrwNext === sReg.ebmmu(i).lAddr) - }.reduce(_|_)) - - val acquireDownPhyAddrw = Mux1H( //选择一个ebmmu - (0 until 16).map{ i => - (sReg.ebmmu(i).isEnable & (sReg.ebmmu(i).EBMMU_OP_WR || sReg.ebmmu(i).EBMMU_OP_RW) & (logicAddrwNext === sReg.ebmmu(i).lAddr)) -> - sReg.ebmmu(i).pAddr - } - ) - - val acquireDownTransLen = Mux1H( //选择一个ebmmu - (0 until 16).map{ i => - (sReg.ebmmu(i).isEnable & (sReg.ebmmu(i).EBMMU_OP_WR || sReg.ebmmu(i).EBMMU_OP_RW) & (logicAddrwNext === sReg.ebmmu(i).lAddr)) -> - sReg.ebmmu(i).length - } - ) - - when( isDownLgcAddrwAcquireTrans ){ //装填计数器 - downTransLenCnt := acquireDownTransLen - } .elsewhen( downRecParser.io.data.fire & downTransLenCnt =/= 0.U){ - downTransLenCnt := downTransLenCnt - 1.U - } - - when( downRecParser.io.subMsgTailReq.fire ){ - isDownLgcWorked := false.B - } .elsewhen( isDownLgcAddrwAcquireTrans ){ - isDownLgcWorked := true.B - } - - //组合逻辑 - when( downRecParser.io.subMsgHeadReq.fire & ( - (downRecParser.io.subMsgHeadReq.bits.operator === SUBMSG_OPERATOR_UNIWRITE | downRecParser.io.subMsgHeadReq.bits.operator === SUBMSG_OPERATOR_UNIRDWR) & downRecParser.io.subMsgHeadReq.bits.isLgcIndex - )){//组合逻辑 - logicAddrwNext := Cat( downRecParser.io.subMsgHeadReq.bits.devIndex, downRecParser.io.subMsgHeadReq.bits.address ) - } .elsewhen( downRecParser.io.data.fire & ( - ( isDownRecPing & ( (downSubMsgHeadInfo(0).operator === SUBMSG_OPERATOR_UNIWRITE) | (downSubMsgHeadInfo(0).operator === SUBMSG_OPERATOR_UNIRDWR ) ) & downSubMsgHeadInfo(0).isLgcIndex ) | - ( ~isDownRecPing & ( (downSubMsgHeadInfo(1).operator === SUBMSG_OPERATOR_UNIWRITE) | (downSubMsgHeadInfo(1).operator === SUBMSG_OPERATOR_UNIRDWR ) ) & downSubMsgHeadInfo(1).isLgcIndex ) - )){//组合逻辑 - logicAddrwNext := logicAddrw + 1.U - } .otherwise{//组合逻辑 - logicAddrwNext := logicAddrw - } - - when( - ( (downRecParser.io.subMsgHeadReq.bits.operator === SUBMSG_OPERATOR_UNIWRITE | downRecParser.io.subMsgHeadReq.bits.operator === SUBMSG_OPERATOR_UNIRDWR) & downRecParser.io.subMsgHeadReq.bits.isSeqIndex & downRecParser.io.subMsgHeadReq.bits.devIndex === localDevIndex ) | - ( downRecParser.io.subMsgHeadReq.bits.operator === SUBMSG_OPERATOR_BOARDWRITE | downRecParser.io.subMsgHeadReq.bits.operator === SUBMSG_OPERATOR_BOARDRDWR ) - ){ //常规寻址 - when( downRecParser.io.subMsgHeadReq.fire ){ //子包头装填 - addrw := downRecParser.io.subMsgHeadReq.bits.address - } .elsewhen( isWrite & downRecParser.io.data.fire ){ - addrw := addrw + 1.U - } - } .elsewhen( isDownLgcAddrwAcquireTrans & ( - ( downRecParser.io.subMsgHeadReq.fire & (downRecParser.io.subMsgHeadReq.bits.operator === SUBMSG_OPERATOR_UNIWRITE | downRecParser.io.subMsgHeadReq.bits.operator === SUBMSG_OPERATOR_UNIRDWR) & downRecParser.io.subMsgHeadReq.bits.isLgcIndex ) | - ( isDownRecPing & ( (downSubMsgHeadInfo(0).operator === SUBMSG_OPERATOR_UNIWRITE) | (downSubMsgHeadInfo(0).operator === SUBMSG_OPERATOR_UNIRDWR ) ) & downSubMsgHeadInfo(0).isLgcIndex ) | - ( ~isDownRecPing & ( (downSubMsgHeadInfo(1).operator === SUBMSG_OPERATOR_UNIWRITE) | (downSubMsgHeadInfo(1).operator === SUBMSG_OPERATOR_UNIRDWR ) ) & downSubMsgHeadInfo(1).isLgcIndex ) - )){ - addrw := acquireDownPhyAddrw - } .elsewhen( - isWrite & downRecParser.io.data.fire & ( - ( isDownRecPing & ( (downSubMsgHeadInfo(0).operator === SUBMSG_OPERATOR_UNIWRITE) | (downSubMsgHeadInfo(0).operator === SUBMSG_OPERATOR_UNIRDWR ) ) & downSubMsgHeadInfo(0).isLgcIndex ) | - ( ~isDownRecPing & ( (downSubMsgHeadInfo(1).operator === SUBMSG_OPERATOR_UNIWRITE) | (downSubMsgHeadInfo(1).operator === SUBMSG_OPERATOR_UNIRDWR ) ) & downSubMsgHeadInfo(1).isLgcIndex ) - ) ){ - assert(~isDownLgcAddrwAcquireTrans) - addrw := Mux( downTransLenCnt === 0.U, 0.U, addrw + 1.U ) - } - - io.lvds.isEnW := isWrite & isWRReg & downRecParser.io.data.fire - io.lvds.dataw := downRecParser.io.data.bits - - io.sram_w(0).enw := isWrite & isWRSM0 & downRecParser.io.data.fire - io.sram_w(0).addrw := addrw(10,0) - io.sram_w(0).dataw := downRecParser.io.data.bits - - io.sram_w(1).enw := isWrite & isWRSM2 & downRecParser.io.data.fire - io.sram_w(1).addrw := addrw(10,0) - io.sram_w(1).dataw := downRecParser.io.data.bits - - io.sram_w(2).enw := isWrite & isWRSM4 & downRecParser.io.data.fire - io.sram_w(2).addrw := addrw(10,0) - io.sram_w(2).dataw := downRecParser.io.data.bits - - io.sram_w(3).enw := isWrite & isWRSM6 & downRecParser.io.data.fire - io.sram_w(3).addrw := addrw(10,0) - io.sram_w(3).dataw := downRecParser.io.data.bits - - - - - - //上行接收 - when( upRecParser.io.subMsgTailReq.fire ){ - when( isUpRecPing ){ - //override - when( - ( ( (upSubMsgHeadInfo(0).operator === SUBMSG_OPERATOR_UNIREAD ) | (upSubMsgHeadInfo(0).operator === SUBMSG_OPERATOR_UNIRDWR ) ) & ((upSubMsgHeadInfo(0).isSeqIndex & upSubMsgHeadInfo(0).devIndex === localDevIndex) || (upSubMsgHeadInfo(0).isLgcIndex & isUpLgcWorked =/= 0.U ) ) ) | - ( ( (upSubMsgHeadInfo(0).operator === SUBMSG_OPERATOR_BOARDREAD) | (upSubMsgHeadInfo(0).operator === SUBMSG_OPERATOR_BOARDRDWR) ) ) - ){ //自身包//读或读写 - upSubMsgTailInfo(0).workCnt := upRecParser.io.subMsgTailReq.bits.workCnt + 1.U - } - } .otherwise{ - //override - when( - ( ( (upSubMsgHeadInfo(1).operator === SUBMSG_OPERATOR_UNIREAD ) | (upSubMsgHeadInfo(1).operator === SUBMSG_OPERATOR_UNIRDWR ) ) & ((upSubMsgHeadInfo(1).isSeqIndex & upSubMsgHeadInfo(1).devIndex === localDevIndex) || (upSubMsgHeadInfo(1).isLgcIndex & isUpLgcWorked =/= 0.U ) ) ) | - ( ( (upSubMsgHeadInfo(1).operator === SUBMSG_OPERATOR_BOARDREAD) | (upSubMsgHeadInfo(1).operator === SUBMSG_OPERATOR_BOARDRDWR) ) ) - ){ //自身包//读或读写 ) - upSubMsgTailInfo(1).workCnt := upRecParser.io.subMsgTailReq.bits.workCnt + 1.U - } - } - } - - - - - - val upTransLenCnt = RegInit(0.U) - - - val addrr = RegInit(0.U(15.W)) - val logicAddrrNext = Wire( UInt(30.W) ) - val logicAddrr = RegNext(logicAddrrNext, 0.U(30.W)) - - - val isUpLgcAddrrAcquireTrans = //是否触发地址转换 - (upTransLenCnt === 0.U) & ( (0 until 16).map{ i => - sReg.ebmmu(i).isEnable & (sReg.ebmmu(i).EBMMU_OP_RD || sReg.ebmmu(i).EBMMU_OP_RW) & (logicAddrrNext === sReg.ebmmu(i).lAddr) - }.reduce(_|_)) - - val acquireUpPhyAddrr = Mux1H( //选择一个ebmmu - (0 until 16).map{ i => - (sReg.ebmmu(i).isEnable & (sReg.ebmmu(i).EBMMU_OP_RD || sReg.ebmmu(i).EBMMU_OP_RW) & (logicAddrrNext === sReg.ebmmu(i).lAddr)) -> - sReg.ebmmu(i).pAddr - } - ) - - val acquireUpTransLen = Mux1H( //选择一个ebmmu - (0 until 16).map{ i => - (sReg.ebmmu(i).isEnable & (sReg.ebmmu(i).EBMMU_OP_RD || sReg.ebmmu(i).EBMMU_OP_RW) & (logicAddrrNext === sReg.ebmmu(i).lAddr)) -> - sReg.ebmmu(i).length - } - ) - - when( isUpLgcAddrrAcquireTrans & ( - (upRecParser.io.subMsgHeadReq.fire & (upRecParser.io.subMsgHeadReq.bits.operator === SUBMSG_OPERATOR_UNIREAD | upRecParser.io.subMsgHeadReq.bits.operator === SUBMSG_OPERATOR_UNIRDWR) & upRecParser.io.subMsgHeadReq.bits.isLgcIndex) | - ( isUpRecPing & (upSubMsgHeadInfo(0).operator === SUBMSG_OPERATOR_UNIREAD | upSubMsgHeadInfo(0).operator === SUBMSG_OPERATOR_UNIRDWR ) & ( upSubMsgHeadInfo(0).isLgcIndex )) | - (~isUpRecPing & (upSubMsgHeadInfo(1).operator === SUBMSG_OPERATOR_UNIREAD | upSubMsgHeadInfo(1).operator === SUBMSG_OPERATOR_UNIRDWR ) & ( upSubMsgHeadInfo(1).isLgcIndex )) - )){ //装填计数器 - upTransLenCnt := acquireUpTransLen - } .elsewhen( upRecParser.io.data.fire & upTransLenCnt =/= 0.U ){ - upTransLenCnt := upTransLenCnt - 1.U - } - - when( upRecParser.io.subMsgTailReq.fire ){ - isUpLgcWorked := false.B - } .elsewhen( isUpLgcAddrrAcquireTrans ){ - isUpLgcWorked := true.B - } - - //组合逻辑 - when( upRecParser.io.subMsgHeadReq.fire & ( - (upRecParser.io.subMsgHeadReq.bits.operator === SUBMSG_OPERATOR_UNIREAD | upRecParser.io.subMsgHeadReq.bits.operator === SUBMSG_OPERATOR_UNIRDWR) & upRecParser.io.subMsgHeadReq.bits.isLgcIndex - )){//组合逻辑 - logicAddrrNext := Cat( upRecParser.io.subMsgHeadReq.bits.devIndex, upRecParser.io.subMsgHeadReq.bits.address ) - } .elsewhen( upRecParser.io.data.fire){ - when( - ( isUpRecPing & (upSubMsgHeadInfo(0).operator === SUBMSG_OPERATOR_UNIREAD | upSubMsgHeadInfo(0).operator === SUBMSG_OPERATOR_UNIRDWR ) & upSubMsgHeadInfo(0).isLgcIndex ) | - (~isUpRecPing & (upSubMsgHeadInfo(1).operator === SUBMSG_OPERATOR_UNIREAD | upSubMsgHeadInfo(1).operator === SUBMSG_OPERATOR_UNIRDWR ) & upSubMsgHeadInfo(1).isLgcIndex ) - ){//组合逻辑 - logicAddrrNext := logicAddrr + 1.U - } .otherwise{ - logicAddrrNext := 0.U - } - } .otherwise{//组合逻辑 - logicAddrrNext := logicAddrr - } - - - val isRDReg = addrr(14,11) === "b0000".U - val isRDSM1 = addrr(14,11) === "b0010".U - val isRDSM3 = addrr(14,11) === "b0100".U - val isRDSM5 = addrr(14,11) === "b0110".U - val isRDSM7 = addrr(14,11) === "b1000".U - - val isSeqRead = - ((upRecParser.io.stateCurr === STATE_PAYLOAD_DATA) & ( - ( isUpRecPing & (upSubMsgHeadInfo(0).operator === SUBMSG_OPERATOR_UNIREAD | upSubMsgHeadInfo(0).operator === SUBMSG_OPERATOR_UNIRDWR ) & ((upSubMsgHeadInfo(0).isSeqIndex & upSubMsgHeadInfo(0).devIndex === localDevIndex) )) | - (~isUpRecPing & (upSubMsgHeadInfo(1).operator === SUBMSG_OPERATOR_UNIREAD | upSubMsgHeadInfo(1).operator === SUBMSG_OPERATOR_UNIRDWR ) & ((upSubMsgHeadInfo(1).isSeqIndex & upSubMsgHeadInfo(1).devIndex === localDevIndex) )) | - ( isUpRecPing & (upSubMsgHeadInfo(0).operator === SUBMSG_OPERATOR_BOARDREAD | upSubMsgHeadInfo(0).operator === SUBMSG_OPERATOR_BOARDRDWR ) ) | - (~isUpRecPing & (upSubMsgHeadInfo(1).operator === SUBMSG_OPERATOR_BOARDREAD | upSubMsgHeadInfo(1).operator === SUBMSG_OPERATOR_BOARDRDWR ) ) - ) - ) & ( (RegNext(upRecParser.io.stateCurr, STATE_IDLE) =/= STATE_PAYLOAD_DATA) | upRecParser.io.data.fire ) - - val isLgcRead = - ((upRecParser.io.stateCurr === STATE_PAYLOAD_DATA) & ( - ( isUpRecPing & (upSubMsgHeadInfo(0).operator === SUBMSG_OPERATOR_UNIREAD | upSubMsgHeadInfo(0).operator === SUBMSG_OPERATOR_UNIRDWR ) & ( (upSubMsgHeadInfo(0).isLgcIndex & upTransLenCnt =/= 0.U ) )) | - (~isUpRecPing & (upSubMsgHeadInfo(1).operator === SUBMSG_OPERATOR_UNIREAD | upSubMsgHeadInfo(1).operator === SUBMSG_OPERATOR_UNIRDWR ) & ( (upSubMsgHeadInfo(1).isLgcIndex & upTransLenCnt =/= 0.U ) )) - ) - ) & ( RegNext(isUpLgcAddrrAcquireTrans, false.B) | upRecParser.io.data.fire ) - - val isLvdsEnR = isSeqRead | isLgcRead - - - - when( - ((upRecParser.io.subMsgHeadReq.bits.operator === SUBMSG_OPERATOR_UNIREAD | upRecParser.io.subMsgHeadReq.bits.operator === SUBMSG_OPERATOR_UNIRDWR ) & (upRecParser.io.subMsgHeadReq.bits.isSeqIndex & upRecParser.io.subMsgHeadReq.bits.devIndex === localDevIndex)) | - ( upRecParser.io.subMsgHeadReq.bits.operator === SUBMSG_OPERATOR_BOARDREAD | upRecParser.io.subMsgHeadReq.bits.operator === SUBMSG_OPERATOR_BOARDRDWR) - ){ - when( upRecParser.io.subMsgHeadReq.fire){ - addrr := upRecParser.io.subMsgHeadReq.bits.address - } .elsewhen(isLvdsEnR){ - addrr := addrr + 1.U - } - } .elsewhen( isUpLgcAddrrAcquireTrans & ( - (upRecParser.io.subMsgHeadReq.fire & (upRecParser.io.subMsgHeadReq.bits.operator === SUBMSG_OPERATOR_UNIREAD | upRecParser.io.subMsgHeadReq.bits.operator === SUBMSG_OPERATOR_UNIRDWR) & upRecParser.io.subMsgHeadReq.bits.isLgcIndex) | - ( isUpRecPing & (upSubMsgHeadInfo(0).operator === SUBMSG_OPERATOR_UNIREAD | upSubMsgHeadInfo(0).operator === SUBMSG_OPERATOR_UNIRDWR ) & ( upSubMsgHeadInfo(0).isLgcIndex )) | - (~isUpRecPing & (upSubMsgHeadInfo(1).operator === SUBMSG_OPERATOR_UNIREAD | upSubMsgHeadInfo(1).operator === SUBMSG_OPERATOR_UNIRDWR ) & ( upSubMsgHeadInfo(1).isLgcIndex )) - )){ - addrr := acquireUpPhyAddrr - } .elsewhen( isLvdsEnR & ( - ( isUpRecPing & (upSubMsgHeadInfo(0).operator === SUBMSG_OPERATOR_UNIREAD | upSubMsgHeadInfo(0).operator === SUBMSG_OPERATOR_UNIRDWR ) & ( upSubMsgHeadInfo(0).isLgcIndex )) | - (~isUpRecPing & (upSubMsgHeadInfo(1).operator === SUBMSG_OPERATOR_UNIREAD | upSubMsgHeadInfo(1).operator === SUBMSG_OPERATOR_UNIRDWR ) & ( upSubMsgHeadInfo(1).isLgcIndex )) - )){ - assert(~isUpLgcAddrrAcquireTrans) - addrr := Mux( upTransLenCnt === 0.U, 0.U, addrr + 1.U ) - } - - - - val upStreamData = Mux1H(Seq( - isRDReg -> io.lvds.datar, - isRDSM1 -> io.sram_r(0).datar, - isRDSM3 -> io.sram_r(1).datar, - isRDSM5 -> io.sram_r(2).datar, - isRDSM7 -> io.sram_r(3).datar, - )) - - - when( isUpRecPing ){ - upRecFifo(0).io.enq.valid := upRecParser.io.data.valid - upRecFifo(0).io.enq.bits := - Mux( - ( upSubMsgHeadInfo(0).operator === SUBMSG_OPERATOR_UNIREAD | upSubMsgHeadInfo(0).operator === SUBMSG_OPERATOR_UNIRDWR ) & ((upSubMsgHeadInfo(0).isSeqIndex & upSubMsgHeadInfo(0).devIndex === localDevIndex) | (upSubMsgHeadInfo(0).isLgcIndex & upTransLenCnt =/= 0.U)), upStreamData, - Mux( upSubMsgHeadInfo(0).operator === SUBMSG_OPERATOR_BOARDREAD | upSubMsgHeadInfo(0).operator === SUBMSG_OPERATOR_BOARDRDWR, upStreamData | upRecParser.io.data.bits, - upRecParser.io.data.bits ) - ) - upRecParser.io.data.ready := upRecFifo(0).io.enq.ready - - upRecFifo(1).io.enq.valid := false.B - upRecFifo(1).io.enq.bits := 0.U - } .otherwise{ - upRecFifo(0).io.enq.valid := false.B - upRecFifo(0).io.enq.bits := 0.U - - upRecFifo(1).io.enq.valid := upRecParser.io.data.valid - upRecFifo(1).io.enq.bits := - Mux( - ( upSubMsgHeadInfo(1).operator === SUBMSG_OPERATOR_UNIREAD | upSubMsgHeadInfo(1).operator === SUBMSG_OPERATOR_UNIRDWR ) & ((upSubMsgHeadInfo(1).isSeqIndex & upSubMsgHeadInfo(1).devIndex === localDevIndex) | (upSubMsgHeadInfo(1).isLgcIndex & upTransLenCnt =/= 0.U)), upStreamData, - Mux( upSubMsgHeadInfo(1).operator === SUBMSG_OPERATOR_BOARDREAD | upSubMsgHeadInfo(1).operator === SUBMSG_OPERATOR_BOARDRDWR, upStreamData | upRecParser.io.data.bits, - upRecParser.io.data.bits - ) - ) - upRecParser.io.data.ready := upRecFifo(1).io.enq.ready - - } - - - - - - - - io.lvds.addrr := addrr(10,0) - io.lvds.addrw := addrw(10,0) - - - // assert( ~(isRead & isWrite) ) - - - - io.lvds.isEnR := isRDReg & isLvdsEnR - io.sram_r(0).enr := isRDSM1 & isLvdsEnR - io.sram_r(1).enr := isRDSM3 & isLvdsEnR - io.sram_r(2).enr := isRDSM5 & isLvdsEnR - io.sram_r(3).enr := isRDSM7 & isLvdsEnR - - io.sram_r(0).addrr := addrr(10,0) - io.sram_r(1).addrr := addrr(10,0) - io.sram_r(2).addrr := addrr(10,0) - io.sram_r(3).addrr := addrr(10,0) - - - io.dSMenq(0) := io.sram_w(0).enw & isWRSM0 & (io.cReg.smTrigLen(0) - 1.U) === addrw(10,0) - io.uSMdeq(0) := isLvdsEnR & isRDSM1 & (io.cReg.smTrigLen(1) - 1.U + 1.U) === addrr(10,0) - io.dSMenq(1) := io.sram_w(1).enw & isWRSM2 & (io.cReg.smTrigLen(2) - 1.U) === addrw(10,0) - io.uSMdeq(1) := isLvdsEnR & isRDSM3 & (io.cReg.smTrigLen(3) - 1.U + 1.U) === addrr(10,0) - io.dSMenq(2) := io.sram_w(2).enw & isWRSM4 & (io.cReg.smTrigLen(4) - 1.U) === addrw(10,0) - io.uSMdeq(2) := isLvdsEnR & isRDSM5 & (io.cReg.smTrigLen(5) - 1.U + 1.U) === addrr(10,0) - io.dSMenq(3) := io.sram_w(3).enw & isWRSM6 & (io.cReg.smTrigLen(6) - 1.U) === addrw(10,0) - io.uSMdeq(3) := isLvdsEnR & isRDSM7 & (io.cReg.smTrigLen(7) - 1.U + 1.U) === addrr(10,0) - - -} - - -trait SlaveParserSync{ this: SlaveParserBase => - val addr64_op1 = WireDefault( 0.U(64.W) ) - val addr64_op2 = WireDefault( 0.U(64.W) ) - def subOp2(x:UInt) = ~x + 1.U - val addr64_res = addr64_op1 + addr64_op2 - - val addrConflict = WireDefault(VecInit(Seq.fill(5){false.B})) - dontTouch(addrConflict) - assert( PopCount(addrConflict) <= 1.U ) - - - //下行接收 - when( downRecParser.io.subMsgTailReq.fire ){ - when( isDownRecPing ){ - //override - when( - downSubMsgHeadInfo(0).operator === SUBMSG_OPERATOR_SYNCA || - downSubMsgHeadInfo(0).operator === SUBMSG_OPERATOR_SYNCC ) { //同步包 - downSubMsgTailInfo(0).workCnt := downRecParser.io.subMsgTailReq.bits.workCnt + 1.U - } - - } .otherwise{ //pong - //override - when( - downSubMsgHeadInfo(1).operator === SUBMSG_OPERATOR_SYNCA || - downSubMsgHeadInfo(1).operator === SUBMSG_OPERATOR_SYNCC ) { //同步包 ) - downSubMsgTailInfo(1).workCnt := downRecParser.io.subMsgTailReq.bits.workCnt + 1.U - } - } - } - - - - val downTimeStamp = RegInit(0.U(64.W)) //下行本地时间戳寄存器 - val upTimeStamp = RegInit(0.U(64.W)) //上行本地时间戳寄存器 - val mstTimeStamp = RegInit(0.U(64.W)) //主站时间戳 - val mstDeltaTimeStamp = RegInit(0.U(32.W)); io.mstDeltaTimeStamp := mstDeltaTimeStamp //主站时间戳差值 - val slvDeltaTimeStamp = RegInit(0.U(32.W)); io.slvDeltaTime := slvDeltaTimeStamp //从站时间戳差值 - - val mstSlvDeltaTimeStamp = RegInit(0.U(64.W)) //主发从接时间差(中间变量) - val deltaMstSlvDeltaTimeStamp = RegInit(0.U(64.W)) //主差从差时间差(中间变量) - val deltaFinal = RegInit(0.U(64.W)); io.deltaFinal := deltaFinal //当前时间戳与主站时间差 - val deltaFinalPre = RegInit(0.U(64.W)) //当前时间戳与主站时间差预记录 - - // recoTimeStamp = io.timeStamp + deltaFinal - // recoTimeStamp = io.timeStamp + mstSlvDeltaTimeStamp + deltaMstSlvDeltaTimeStamp - // recoTimeStamp = io.timeStamp + mstTimeStamp - downTimeStamp + (mstDeltaTimeStamp - slvDeltaTimeStamp ) >> 1 - // recoTimeStamp = io.timeStamp + mstTimeStamp - downTimeStamp + (mstDeltaTimeStamp - (upTimeStamp - downTimeStamp)) >> 1 - - - //更新下行本地时间戳寄存器 - when( downRecParser.io.frameReq.fire & downRecParser.io.frameReq.bits.frameStyle === FRAME_STYLE_COMMON ){ - downTimeStamp := io.cReg.timeStamp - } - - //更新上行本地时间戳寄存器 - when( upRecParser.io.frameReq.fire & upRecParser.io.frameReq.bits.frameStyle === FRAME_STYLE_COMMON ){ - upTimeStamp := io.cReg.timeStamp - - // slvDeltaTimeStamp := io.cReg.timeStamp - downTimeStamp - addr64_op1 := io.cReg.timeStamp //组合逻辑 - addr64_op2 := subOp2(downTimeStamp) //组合逻辑 - addrConflict(0) := true.B //组合逻辑 - slvDeltaTimeStamp := addr64_res //时序逻辑 - } - - //下行接收 - val isSync = (downRecParser.io.stateCurr === STATE_PAYLOAD_DATA) & ( //req fire 后 已经反相 - ( isDownRecPing & downSubMsgHeadInfo(0).devIndex === 0.U & downSubMsgHeadInfo(0).operator === SUBMSG_OPERATOR_SYNCA ) | - ( isDownRecPing & downSubMsgHeadInfo(0).devIndex === 0.U & downSubMsgHeadInfo(0).operator === SUBMSG_OPERATOR_SYNCC ) | - ( ~isDownRecPing & downSubMsgHeadInfo(1).devIndex === 0.U & downSubMsgHeadInfo(1).operator === SUBMSG_OPERATOR_SYNCA ) | - ( ~isDownRecPing & downSubMsgHeadInfo(1).devIndex === 0.U & downSubMsgHeadInfo(1).operator === SUBMSG_OPERATOR_SYNCC ) - ) - - val syncCnt = RegInit(0.U(4.W)) - - when( downRecParser.io.rec.fire ){ - when( isSync ){ - syncCnt := syncCnt + 1.U - } .otherwise{ - syncCnt := 0.U - } - } - - - when( isSync & downRecParser.io.rec.fire ){ - when( syncCnt === 0.U ){ - mstTimeStamp := Cat( mstTimeStamp(63, 8), downRecParser.io.data.bits ) - } .elsewhen( syncCnt === 1.U ){ - mstTimeStamp := Cat( mstTimeStamp(63,16), downRecParser.io.data.bits, mstTimeStamp(7,0) ) - } .elsewhen( syncCnt === 2.U ){ - mstTimeStamp := Cat( mstTimeStamp(63,24), downRecParser.io.data.bits, mstTimeStamp(15,0) ) - } .elsewhen( syncCnt === 3.U ){ - mstTimeStamp := Cat( mstTimeStamp(63,32), downRecParser.io.data.bits, mstTimeStamp(23,0) ) - } .elsewhen( syncCnt === 4.U ){ - mstTimeStamp := Cat( mstTimeStamp(63,40), downRecParser.io.data.bits, mstTimeStamp(31,0) ) - } .elsewhen( syncCnt === 5.U ){ - mstTimeStamp := Cat( mstTimeStamp(63,48), downRecParser.io.data.bits, mstTimeStamp(39,0) ) - } .elsewhen( syncCnt === 6.U ){ - mstTimeStamp := Cat( mstTimeStamp(63,56), downRecParser.io.data.bits, mstTimeStamp(47,0) ) - } .elsewhen( syncCnt === 7.U ){ - mstTimeStamp := Cat( downRecParser.io.data.bits, mstTimeStamp(55,0) ) - } .elsewhen( syncCnt === 8.U ){ - // mstSlvDeltaTimeStamp := mstTimeStamp - downTimeStamp - - addr64_op1 := mstTimeStamp //组合逻辑 - addr64_op2 := subOp2(downTimeStamp) //组合逻辑 - addrConflict(1) := true.B //组合逻辑 - mstSlvDeltaTimeStamp := addr64_res //时序逻辑 - - mstDeltaTimeStamp := Cat( mstDeltaTimeStamp(31, 8), downRecParser.io.data.bits ) - } .elsewhen( syncCnt === 9.U ){ - mstDeltaTimeStamp := Cat( mstDeltaTimeStamp(31,16), downRecParser.io.data.bits, mstDeltaTimeStamp(7,0) ) - } .elsewhen( syncCnt === 10.U ){ - mstDeltaTimeStamp := Cat( mstDeltaTimeStamp(31,24), downRecParser.io.data.bits, mstDeltaTimeStamp(15,0) ) - } .elsewhen( syncCnt === 11.U ){ - mstDeltaTimeStamp := Cat( downRecParser.io.data.bits, mstDeltaTimeStamp(23, 0) ) - } .otherwise{ - assert(false.B, "Wrong Sync SubMsg!\n") - } - } - - val shiftIsSync = ShiftRegisters(isSync, 3, false.B, true.B) - - when( shiftIsSync(0) & ~isSync ){ - // deltaMstSlvDeltaTimeStamp := (mstDeltaTimeStamp - slvDeltaTimeStamp) >>> 1 //(mstDeltaTimeStamp - slvDeltaTimeStamp) >> 1 - - addr64_op1 := Cat( Fill(32, mstDeltaTimeStamp(31)), mstDeltaTimeStamp) //组合逻辑 - addr64_op2 := subOp2( Cat( Fill(32, slvDeltaTimeStamp(31)), slvDeltaTimeStamp) ) //组合逻辑 - addrConflict(2) := true.B //组合逻辑 - deltaMstSlvDeltaTimeStamp := Cat(addr64_res(63),addr64_res(63,1)) //时序逻辑 - - } .elsewhen( shiftIsSync(1) & ~shiftIsSync(0) ){ - // deltaFinal := mstSlvDeltaTimeStamp + deltaMstSlvDeltaTimeStamp - addr64_op1 := mstSlvDeltaTimeStamp //组合逻辑 - addr64_op2 := deltaMstSlvDeltaTimeStamp //组合逻辑 - addrConflict(3) := true.B //组合逻辑 - deltaFinalPre := addr64_res //时序逻辑 - } .elsewhen( shiftIsSync(2) & ~shiftIsSync(1) ){ - when( - ( isDownRecPing & downSubMsgHeadInfo(0).devIndex === 0.U & downSubMsgHeadInfo(0).operator === SUBMSG_OPERATOR_SYNCC ) | - ( ~isDownRecPing & downSubMsgHeadInfo(1).devIndex === 0.U & downSubMsgHeadInfo(1).operator === SUBMSG_OPERATOR_SYNCC ) - ){ - deltaFinal := deltaFinalPre - } .elsewhen( - ( isDownRecPing & downSubMsgHeadInfo(0).devIndex === 0.U & downSubMsgHeadInfo(0).operator === SUBMSG_OPERATOR_SYNCA ) | - ( ~isDownRecPing & downSubMsgHeadInfo(1).devIndex === 0.U & downSubMsgHeadInfo(1).operator === SUBMSG_OPERATOR_SYNCA ) - ){ - addr64_op1 := deltaFinalPre //组合逻辑 - addr64_op2 := subOp2(deltaFinal) //组合逻辑 - addrConflict(4) := true.B //组合逻辑 - deltaFinal := MuxCase( deltaFinalPre, Seq( //时序逻辑 - ( addr64_res.asSInt < -10.S ) -> ( deltaFinal - 10.U ), - ( addr64_res.asSInt > 10.S ) -> ( deltaFinal + 10.U ), - ) ) - } - } - - -} - -trait SlaveParserProbe{ this: SlaveParserBase => - - val probeRecCnt = RegInit(0.U(9.W)) - val isWatchDogOverflow = probeRecCnt.andR - - when( downRecParser.io.frameReq.fire & downRecParser.io.frameReq.bits.frameStyle === FRAME_STYLE_PROBE ){ //下行来了一个嗅探包 - isReadyToProbe := true.B - when( downSendGen.io.stateCurr =/= STATE_IDLE ){ - printf("Error! downSendGen is busy while a Probe-Frame arrival!\n") - } - } .elsewhen( upRecParser.io.frameReq.fire & upRecParser.io.frameReq.bits.frameStyle === FRAME_STYLE_PROBE ){ //上行来了一个嗅探包 - isReadyToProbe := false.B - } .elsewhen( isWatchDogOverflow ){ - isReadyToProbe := false.B - } - - when( downRecParser.io.frameReq.fire & downRecParser.io.frameReq.bits.frameStyle === FRAME_STYLE_PROBE ){ //下行来了一个嗅探包 - isAckProbe := true.B - } .elsewhen( upSendGen.io.frameReq.fire & upSendGen.io.frameReq.bits.frameStyle === FRAME_STYLE_PROBE ){ //上行发送回复嗅探包 - isAckProbe := false.B - } - - when( upRecParser.io.frameReq.fire & upRecParser.io.frameReq.bits.frameStyle === FRAME_STYLE_PROBE ){ //上行来了一个嗅探包 - isLastDevice := false.B - } .elsewhen( isWatchDogOverflow ){ - isLastDevice := true.B - } - - - when( upRecParser.io.frameReq.fire & upRecParser.io.frameReq.bits.frameStyle === FRAME_STYLE_PROBE ){ //上行来了一个嗅探包 - probeRecCnt := 0.U - } .elsewhen( isWatchDogOverflow ){ - probeRecCnt := 0.U - } .elsewhen( isReadyToProbe ){ - probeRecCnt := probeRecCnt + 1.U - } - - - when( upRecParser.io.frameReq.fire & upRecParser.io.frameReq.bits.frameStyle === FRAME_STYLE_PROBE ){ //上行来了一个嗅探包 - indexOfRightDev := upRecParser.io.frameReq.bits.frameInfo - when( upRecParser.io.frameReq.bits.frameInfo =/= localDevIndex + 1.U ){ //索引不对 - isDevOnRightModify := true.B - } .otherwise{ - isDevOnRightModify := false.B - } - } - - - - - - - io.upOut <> Queue( upSendGen.io.send, 4, true, false ) - io.downIn <> downRecParser.io.rec - - io.downOut <> Queue( downSendGen.io.send, 4, true, false ) - io.upIn <> upRecParser.io.rec - - io.isLoop := isLastDevice & ~isReadyToProbe - -} - -class SlaveParser extends SlaveParserBase -with SlaveParserIndex -with SlaveParserRW -with SlaveParserSync -with SlaveParserProbe{ - io.intHWTrig(0) := downRecParser.io.isError - io.intHWTrig(1) := upRecParser.io.isError - - downRecParser.io.flush := RegNext(downRecParser.io.isError & io.intHWClr(0), false.B) - downSendGen.io.flush := RegNext(downRecParser.io.isError & io.intHWClr(0), false.B) - - upRecParser.io.flush := RegNext(upRecParser.io.isError & io.intHWClr(1), false.B) - upSendGen.io.flush := RegNext(upRecParser.io.isError & io.intHWClr(1), false.B) - - io.downRecStat := downRecParser.io.stat - io.upRecStat := upRecParser.io.stat -} - - - - +package BACK + +import chisel3._ +import chisel3.util._ + + +class FrameHeader extends Bundle{ + val frameLenAim = UInt(12.W) //帧长度目标 + val frameStyle = UInt(2.W) //包类型 + val frameInfo = UInt(16.W) //其它信息,如probe +} + +class SubMsgHeader extends Bundle{ + val devIndex = UInt(14.W) // 子报文中设备索引 + val style = UInt(2.W) // 子报文类型 + val address = UInt(16.W) //子报文地址 + val operator = UInt(4.W) //子报文命令类型 + val length = UInt(12.W) //子报文负载长度 + + + def isSeqIndex = style === 0.U + def isLgcIndex = style === 2.U +} + +class SubMsgTail extends Bundle{ + val workCnt = UInt(16.W) //子报文工作计数 +} + +class SlaveParserIO extends Bundle{ + val downIn = Flipped( Decoupled(new AXIS_Bundle(8)) ) + val downOut = Decoupled(new AXIS_Bundle(8)) + + val upIn = Flipped( Decoupled(new AXIS_Bundle(8)) ) + val upOut = Decoupled(new AXIS_Bundle(8)) + + val sram_w = Vec( 4, Flipped(new SRAM2kWRIO)) + val sram_r = Vec( 4, Flipped(new SRAM2kRDIO)) + + val dSMenq = Output( Vec(4, Bool()) ) + val uSMdeq = Output( Vec(4, Bool()) ) + + + + + val localDevIndex = Output(UInt(16.W)) + + //开放链路寄存器组给interface + val isDevOnRight = Output(UInt(2.W)) + val isDevOnRightModify = Output(Bool()) + val indexOfRightDev = Output(UInt(14.W)) + + + val mstDeltaTimeStamp = Output(UInt(32.W)) + val slvDeltaTime = Output(UInt(32.W)) + val deltaFinal = Output(UInt(64.W)) + + val isLoop = Output(Bool()) + + val cReg = Input(new CommonRegisterBundle) + val sReg = Input(new SlaveRegisterBundle) + + val lvds = new RegAccessInterfaceIO + + val intHWTrig = Output(Vec(2, Bool())) + val intHWClr = Input (Vec(2, Bool())) + + val downRecStat = Output(new Stat_IO_Bundle) + val upRecStat = Output(new Stat_IO_Bundle) +} + +abstract class SlaveParserBase extends Module with RequireAsyncReset{ + val io: SlaveParserIO = IO(new SlaveParserIO) + + val sReg = io.sReg + + + + val FRAME_STYLE_COMMON = 0.U + val FRAME_STYLE_PROBE = 1.U + + val SUBMSG_OPERATOR_UNIREAD = 0.U + val SUBMSG_OPERATOR_UNIWRITE = 1.U + val SUBMSG_OPERATOR_UNIRDWR = 2.U + val SUBMSG_OPERATOR_SYNCA = "ha".U + val SUBMSG_OPERATOR_INDEX = "hb".U + val SUBMSG_OPERATOR_SYNCC = "hc".U + val SUBMSG_OPERATOR_BOARDREAD = "hd".U + val SUBMSG_OPERATOR_BOARDWRITE = "he".U + val SUBMSG_OPERATOR_BOARDRDWR = "hf".U + + + val STATE_IDLE = 0.U //空闲 + val STATE_HEADER = 1.U //长度/ /保留2bits //包类型 + val STATE_SUBMSG_HEADER = 2.U //子报文设备索引 //子报文类型 + val STATE_PAYLOAD_DATA = 3.U //子报文数据 + val STATE_SUBMSG_TAIL = 4.U + val STATE_CRC = 5.U //CRC校验 + val STATE_ERROR = 6.U // + val STATE_WAIT = 7.U + + + + val downRecParser = Module(new SlaveRecParser) + val upRecParser = Module(new SlaveRecParser) + val downSendGen = Module(new SlaveSendGen) + val upSendGen = Module(new SlaveSendGen) + + val isReadyToProbe = RegInit(false.B) + val isAckProbe = RegInit(false.B) + val isLastDevice: Bool = RegInit(true.B) + + + io.isDevOnRight := Mux( isLastDevice, "b00".U, "b01".U ) + val isDevOnRightModify = RegInit(false.B); io.isDevOnRightModify := isDevOnRightModify + val indexOfRightDev = RegInit(0.U(14.W)); io.indexOfRightDev := indexOfRightDev + + val localDevIndex = RegInit(0.U(14.W)); io.localDevIndex := localDevIndex //当前设备索引 + + + + + + + + + //处理主报文 + + + downSendGen.io.frameReq.valid := downRecParser.io.frameReq.fire + assert( ~(downSendGen.io.frameReq.valid & ~downSendGen.io.frameReq.ready) ) + + { + downSendGen.io.frameReq.bits := downRecParser.io.frameReq.bits + //voerride + downSendGen.io.frameReq.bits.frameInfo := localDevIndex + } + + + val upFrameProbeInfo: FrameHeader = Wire(new FrameHeader) + upFrameProbeInfo.frameLenAim := 0.U //帧长度目标 + upFrameProbeInfo.frameStyle := FRAME_STYLE_PROBE //包类型 + upFrameProbeInfo.frameInfo := localDevIndex //其它信息,如probe + + upSendGen.io.frameReq.valid := + (upRecParser.io.frameReq.fire & upRecParser.io.frameReq.bits.frameStyle === FRAME_STYLE_COMMON) | + isAckProbe + + assert( ~(upSendGen.io.frameReq.valid & ~upSendGen.io.frameReq.ready) ) + + + assert( ~(upRecParser.io.frameReq.fire & isAckProbe), "Assert Failed, Check Softwave, Probe is Sent while transfering!\n" ) + + upSendGen.io.frameReq.bits := Mux1H(Seq( + upRecParser.io.frameReq.fire -> upRecParser.io.frameReq.bits, //上行转发 + isAckProbe -> upFrameProbeInfo, //上行探针 + )) + + + + + + + +//////////////////////////////////////// + + //子报文 + val isDownSubMsgHeadValid = for( _ <- 0 until 2 ) yield { RegInit(false.B) } + val isUpSubMsgHeadValid = for( _ <- 0 until 2 ) yield { RegInit(false.B) } + + val isDownSubMsgTailValid = for( _ <- 0 until 2 ) yield { RegInit(false.B) } + val isUpSubMsgTailValid = for( _ <- 0 until 2 ) yield { RegInit(false.B) } + + + + //接收子报文 + + val downSubMsgHeadInfo = for( _ <- 0 until 2 ) yield { RegInit(0.U.asTypeOf(new SubMsgTxInfo)) } //子报文头 + val upSubMsgHeadInfo = for( _ <- 0 until 2 ) yield { RegInit(0.U.asTypeOf(new SubMsgTxInfo)) } + val downSubMsgTailInfo = for( _ <- 0 until 2 ) yield { RegInit(0.U.asTypeOf(new SubMsgTail) ) } //子报文头 + val upSubMsgTailInfo = for( _ <- 0 until 2 ) yield { RegInit(0.U.asTypeOf(new SubMsgTail) ) } + + + val downRecFifo = for( _ <- 0 until 2 ) yield { Module(new Queue(UInt(8.W), 20)) } //子报文负载 + val upRecFifo = for( _ <- 0 until 2 ) yield { Module(new Queue(UInt(8.W), 20)) } + + val isDownRecPing = RegInit(false.B) + val isUpRecPing = RegInit(false.B) + + + + //下行接收 + when( downRecParser.io.subMsgHeadReq.fire ){ + when( isDownRecPing ){ + downSubMsgHeadInfo(0).devIndex := downRecParser.io.subMsgHeadReq.bits.devIndex + downSubMsgHeadInfo(0).style := downRecParser.io.subMsgHeadReq.bits.style + downSubMsgHeadInfo(0).address := downRecParser.io.subMsgHeadReq.bits.address + downSubMsgHeadInfo(0).operator := downRecParser.io.subMsgHeadReq.bits.operator + downSubMsgHeadInfo(0).length := downRecParser.io.subMsgHeadReq.bits.length + downSubMsgHeadInfo(0).source := 0.U + } .otherwise{ //pong + downSubMsgHeadInfo(1).devIndex := downRecParser.io.subMsgHeadReq.bits.devIndex + downSubMsgHeadInfo(1).style := downRecParser.io.subMsgHeadReq.bits.style + downSubMsgHeadInfo(1).address := downRecParser.io.subMsgHeadReq.bits.address + downSubMsgHeadInfo(1).operator := downRecParser.io.subMsgHeadReq.bits.operator + downSubMsgHeadInfo(1).length := downRecParser.io.subMsgHeadReq.bits.length + downSubMsgHeadInfo(1).source := 1.U + } + } + + when( downRecParser.io.subMsgTailReq.fire ){ + when( isDownRecPing ){ + downSubMsgTailInfo(0).workCnt := downRecParser.io.subMsgTailReq.bits.workCnt + } .otherwise{ //pong + downSubMsgTailInfo(1).workCnt := downRecParser.io.subMsgTailReq.bits.workCnt + } + } + + + + + when( isDownRecPing ){ //req fire 后 + downRecFifo(0).io.enq.valid := downRecParser.io.data.valid + downRecFifo(0).io.enq.bits := downRecParser.io.data.bits + downRecParser.io.data.ready := downRecFifo(0).io.enq.ready + + downRecFifo(1).io.enq.valid := false.B + downRecFifo(1).io.enq.bits := 0.U + } .otherwise{ + downRecFifo(0).io.enq.valid := false.B + downRecFifo(0).io.enq.bits := 0.U + + downRecFifo(1).io.enq.valid := downRecParser.io.data.valid + downRecFifo(1).io.enq.bits := downRecParser.io.data.bits + downRecParser.io.data.ready := downRecFifo(1).io.enq.ready + } + + + + + + //上行接收 + when( upRecParser.io.subMsgHeadReq.fire ){ + when( isUpRecPing ){ + upSubMsgHeadInfo(0).devIndex := upRecParser.io.subMsgHeadReq.bits.devIndex + upSubMsgHeadInfo(0).style := upRecParser.io.subMsgHeadReq.bits.style + upSubMsgHeadInfo(0).address := upRecParser.io.subMsgHeadReq.bits.address + upSubMsgHeadInfo(0).operator := upRecParser.io.subMsgHeadReq.bits.operator + upSubMsgHeadInfo(0).length := upRecParser.io.subMsgHeadReq.bits.length + upSubMsgHeadInfo(0).source := 0.U + } .otherwise{ + upSubMsgHeadInfo(1).devIndex := upRecParser.io.subMsgHeadReq.bits.devIndex + upSubMsgHeadInfo(1).style := upRecParser.io.subMsgHeadReq.bits.style + upSubMsgHeadInfo(1).address := upRecParser.io.subMsgHeadReq.bits.address + upSubMsgHeadInfo(1).operator := upRecParser.io.subMsgHeadReq.bits.operator + upSubMsgHeadInfo(1).length := upRecParser.io.subMsgHeadReq.bits.length + upSubMsgHeadInfo(1).source := 1.U + } + } + + when( upRecParser.io.subMsgTailReq.fire ){ + when( isUpRecPing ){ + upSubMsgTailInfo(0).workCnt := upRecParser.io.subMsgTailReq.bits.workCnt + } .otherwise{ + upSubMsgTailInfo(1).workCnt := upRecParser.io.subMsgTailReq.bits.workCnt + } + } + + + + + + + //子报文下行发送 + + val isDownSendPing = RegInit(false.B) + val isUpSendPing = RegInit(false.B) + + + + downSendGen.io.subMsgHeadReq.valid := + ( isDownSendPing & isDownSubMsgHeadValid(0) ) | (~isDownSendPing & isDownSubMsgHeadValid(1)) + + downSendGen.io.subMsgHeadReq.bits := Mux( isDownSendPing, downSubMsgHeadInfo(0), downSubMsgHeadInfo(1) ) + + downSendGen.io.subMsgTailReq.valid := + ( isDownSendPing & isDownSubMsgTailValid(0) ) | ( ~isDownSendPing & isDownSubMsgTailValid(1)) + + downSendGen.io.subMsgTailReq.bits := Mux( isDownSendPing, downSubMsgTailInfo(0), downSubMsgTailInfo(1) ) + + + + when( downSendGen.io.subMsgHeadReq.fire ){ //ready + when( isDownSendPing ){ + assert( isDownSubMsgHeadValid(0) ) + isDownSubMsgHeadValid(0) := false.B + } .otherwise{ + assert( isDownSubMsgHeadValid(1) ) + isDownSubMsgHeadValid(1) := false.B + } + } .elsewhen( downRecParser.io.subMsgHeadReq.fire ){ + when( isDownRecPing ){ + assert( ~isDownSubMsgHeadValid(0) ) + isDownSubMsgHeadValid(0) := true.B + } .otherwise{ + assert( ~isDownSubMsgHeadValid(1) ) + isDownSubMsgHeadValid(1) := true.B + } + } + + when( downSendGen.io.subMsgTailReq.fire ){ + when( isDownSendPing ){ + assert( isDownSubMsgTailValid(0) ) + isDownSubMsgTailValid(0) := false.B + } .otherwise{ + assert( isDownSubMsgTailValid(1) ) + isDownSubMsgTailValid(1) := false.B + } + } .elsewhen( downRecParser.io.subMsgTailReq.fire ){ + when( isDownRecPing ){ + assert( ~isDownSubMsgTailValid(0) ) + isDownSubMsgTailValid(0) := true.B + } .otherwise{ + assert( ~isDownSubMsgTailValid(1) ) + isDownSubMsgTailValid(1) := true.B + } + } + + when( downSendGen.io.subMsgTailReq.fire ){ //ready + isDownSendPing := ~isDownSendPing + } .elsewhen( downRecParser.io.subMsgTailReq.fire ){ + isDownRecPing := ~isDownRecPing + } + + downRecFifo(0).io.deq <> downSendGen.io.data(0) + downRecFifo(1).io.deq <> downSendGen.io.data(1) + + + //子报文上行发送 + + + upSendGen.io.subMsgHeadReq.valid := + ( isUpSendPing & isUpSubMsgHeadValid(0) ) | + ( ~isUpSendPing & isUpSubMsgHeadValid(1) ) + + upSendGen.io.subMsgHeadReq.bits := Mux( isUpSendPing, upSubMsgHeadInfo(0), upSubMsgHeadInfo(1) ) + + upSendGen.io.subMsgTailReq.valid := + ( isUpSendPing & isUpSubMsgTailValid(0) ) | + ( ~isUpSendPing & isUpSubMsgTailValid(1) ) + + upSendGen.io.subMsgTailReq.bits := Mux( isUpSendPing, upSubMsgTailInfo(0), upSubMsgTailInfo(1) ) + + when( upSendGen.io.subMsgHeadReq.fire ){ //ready + when( isUpSendPing ){ + assert( isUpSubMsgHeadValid(0) ) + isUpSubMsgHeadValid(0) := false.B + } .otherwise{ + assert( isUpSubMsgHeadValid(1) ) + isUpSubMsgHeadValid(1) := false.B + } + }.elsewhen( upRecParser.io.subMsgHeadReq.fire ){ + when( isUpRecPing ){ + assert( ~isUpSubMsgHeadValid(0) ) + isUpSubMsgHeadValid(0) := true.B + } .otherwise{ + assert( ~isUpSubMsgHeadValid(1) ) + isUpSubMsgHeadValid(1) := true.B + } + } + + when( upSendGen.io.subMsgTailReq.fire ){ + when( isUpSendPing ){ + assert( isUpSubMsgTailValid(0) ) + isUpSubMsgTailValid(0) := false.B + } .otherwise{ + assert( isUpSubMsgTailValid(1) ) + isUpSubMsgTailValid(1) := false.B + } + } .elsewhen( upRecParser.io.subMsgTailReq.fire ){ + when( isUpRecPing ){ + assert( ~isUpSubMsgTailValid(0) ) + isUpSubMsgTailValid(0) := true.B + } .otherwise{ + assert( ~isUpSubMsgTailValid(1) ) + isUpSubMsgTailValid(1) := true.B + } + } + + + when( upSendGen.io.subMsgTailReq.fire ){ //ready + isUpSendPing := ~isUpSendPing + }.elsewhen( upRecParser.io.subMsgTailReq.fire ){ + isUpRecPing := ~isUpRecPing + } + + upRecFifo(0).io.deq <> upSendGen.io.data(0) + upRecFifo(1).io.deq <> upSendGen.io.data(1) + +} + + + + + + + + + + + + + + + +trait SlaveParserIndex{ this: SlaveParserBase => + //下行接收 + when( downRecParser.io.subMsgTailReq.fire ){ + when( isDownRecPing & + downSubMsgHeadInfo(0).devIndex === 0.U & + downSubMsgHeadInfo(0).style === 0.U & + downSubMsgHeadInfo(0).operator === SUBMSG_OPERATOR_INDEX + ){ + localDevIndex := downRecParser.io.subMsgTailReq.bits.workCnt + 1.U + indexOfRightDev := Mux(isLastDevice, 0.U, downRecParser.io.subMsgTailReq.bits.workCnt + 2.U) + downSubMsgTailInfo(0).workCnt := downRecParser.io.subMsgTailReq.bits.workCnt + 1.U + } .elsewhen( ~isDownRecPing & + downSubMsgHeadInfo(1).devIndex === 0.U & + downSubMsgHeadInfo(1).style === 0.U & + downSubMsgHeadInfo(1).operator === SUBMSG_OPERATOR_INDEX + ){ //pong + localDevIndex := downRecParser.io.subMsgTailReq.bits.workCnt + 1.U + indexOfRightDev := Mux(isLastDevice, 0.U, downRecParser.io.subMsgTailReq.bits.workCnt + 2.U) + downSubMsgTailInfo(1).workCnt := downRecParser.io.subMsgTailReq.bits.workCnt + 1.U + } + } + +} + + + + + +trait SlaveParserRW{ this: SlaveParserBase => + + val isDownLgcWorked = RegInit(false.B) + val isUpLgcWorked = RegInit(false.B) + + //下行接收 + when( downRecParser.io.subMsgTailReq.fire ){ + when( isDownRecPing ){ + //override + when( + ( ( (downSubMsgHeadInfo(0).operator === SUBMSG_OPERATOR_UNIWRITE) | (downSubMsgHeadInfo(0).operator === SUBMSG_OPERATOR_UNIRDWR) ) & ( (downSubMsgHeadInfo(0).isSeqIndex & downSubMsgHeadInfo(0).devIndex === localDevIndex) || ( downSubMsgHeadInfo(0).isLgcIndex & isDownLgcWorked ) ) ) | + ( ( (downSubMsgHeadInfo(0).operator === SUBMSG_OPERATOR_BOARDWRITE) | (downSubMsgHeadInfo(0).operator === SUBMSG_OPERATOR_BOARDRDWR) ) ) + ) { //自身包//写操作或读写操作) + downSubMsgTailInfo(0).workCnt := downRecParser.io.subMsgTailReq.bits.workCnt + 1.U + } + + } .otherwise{ //pong + //override + when( + ( ( (downSubMsgHeadInfo(1).operator === SUBMSG_OPERATOR_UNIWRITE ) | (downSubMsgHeadInfo(1).operator === SUBMSG_OPERATOR_UNIRDWR ) ) & ( (downSubMsgHeadInfo(1).isSeqIndex & downSubMsgHeadInfo(1).devIndex === localDevIndex) || ( downSubMsgHeadInfo(1).isLgcIndex & isDownLgcWorked ) ) ) | + ( ( (downSubMsgHeadInfo(1).operator === SUBMSG_OPERATOR_BOARDWRITE) | (downSubMsgHeadInfo(1).operator === SUBMSG_OPERATOR_BOARDRDWR) ) ) + ) { //自身包//写操作或读写操作 ) + downSubMsgTailInfo(1).workCnt := downRecParser.io.subMsgTailReq.bits.workCnt + 1.U + } + } + } + + + + //写入 SM或寄存器空间 + + val addrw = RegInit(0.U(15.W)) + val logicAddrwNext = Wire( UInt(30.W) ) + val logicAddrw = RegNext(logicAddrwNext, 0.U(30.W)) + + val isWRReg = (addrw(14,11) === "b0000".U) + val isWRSM0 = (addrw(14,11) === "b0001".U) + val isWRSM2 = (addrw(14,11) === "b0011".U) + val isWRSM4 = (addrw(14,11) === "b0101".U) + val isWRSM6 = (addrw(14,11) === "b0111".U) + + val downTransLenCnt = RegInit(0.U) + + val isWrite = (downRecParser.io.stateCurr === STATE_PAYLOAD_DATA) & ( //req fire 后 已经反相 + ( isDownRecPing & ( (downSubMsgHeadInfo(0).operator === SUBMSG_OPERATOR_UNIWRITE) | (downSubMsgHeadInfo(0).operator === SUBMSG_OPERATOR_UNIRDWR ) ) & ( (downSubMsgHeadInfo(0).isSeqIndex & downSubMsgHeadInfo(0).devIndex === localDevIndex) || ( downSubMsgHeadInfo(0).isLgcIndex & downTransLenCnt =/= 0.U) ) ) | + ( ~isDownRecPing & ( (downSubMsgHeadInfo(1).operator === SUBMSG_OPERATOR_UNIWRITE) | (downSubMsgHeadInfo(1).operator === SUBMSG_OPERATOR_UNIRDWR ) ) & ( (downSubMsgHeadInfo(1).isSeqIndex & downSubMsgHeadInfo(1).devIndex === localDevIndex) || ( downSubMsgHeadInfo(1).isLgcIndex & downTransLenCnt =/= 0.U) ) ) | + ( isDownRecPing & ( (downSubMsgHeadInfo(0).operator === SUBMSG_OPERATOR_BOARDWRITE) | (downSubMsgHeadInfo(0).operator === SUBMSG_OPERATOR_BOARDRDWR) ) ) | + ( ~isDownRecPing & ( (downSubMsgHeadInfo(1).operator === SUBMSG_OPERATOR_BOARDWRITE) | (downSubMsgHeadInfo(1).operator === SUBMSG_OPERATOR_BOARDRDWR) ) ) + ) + + + val isDownLgcAddrwAcquireTrans = //是否触发地址转换 + (downTransLenCnt === 0.U) & ( (0 until 16).map{ i => + sReg.ebmmu(i).isEnable & (sReg.ebmmu(i).EBMMU_OP_WR || sReg.ebmmu(i).EBMMU_OP_RW) & (logicAddrwNext === sReg.ebmmu(i).lAddr) + }.reduce(_|_)) + + val acquireDownPhyAddrw = Mux1H( //选择一个ebmmu + (0 until 16).map{ i => + (sReg.ebmmu(i).isEnable & (sReg.ebmmu(i).EBMMU_OP_WR || sReg.ebmmu(i).EBMMU_OP_RW) & (logicAddrwNext === sReg.ebmmu(i).lAddr)) -> + sReg.ebmmu(i).pAddr + } + ) + + val acquireDownTransLen = Mux1H( //选择一个ebmmu + (0 until 16).map{ i => + (sReg.ebmmu(i).isEnable & (sReg.ebmmu(i).EBMMU_OP_WR || sReg.ebmmu(i).EBMMU_OP_RW) & (logicAddrwNext === sReg.ebmmu(i).lAddr)) -> + sReg.ebmmu(i).length + } + ) + + when( isDownLgcAddrwAcquireTrans ){ //装填计数器 + downTransLenCnt := acquireDownTransLen + } .elsewhen( downRecParser.io.data.fire & downTransLenCnt =/= 0.U){ + downTransLenCnt := downTransLenCnt - 1.U + } + + when( downRecParser.io.subMsgTailReq.fire ){ + isDownLgcWorked := false.B + } .elsewhen( isDownLgcAddrwAcquireTrans ){ + isDownLgcWorked := true.B + } + + //组合逻辑 + when( downRecParser.io.subMsgHeadReq.fire & ( + (downRecParser.io.subMsgHeadReq.bits.operator === SUBMSG_OPERATOR_UNIWRITE | downRecParser.io.subMsgHeadReq.bits.operator === SUBMSG_OPERATOR_UNIRDWR) & downRecParser.io.subMsgHeadReq.bits.isLgcIndex + )){//组合逻辑 + logicAddrwNext := Cat( downRecParser.io.subMsgHeadReq.bits.devIndex, downRecParser.io.subMsgHeadReq.bits.address ) + } .elsewhen( downRecParser.io.data.fire & ( + ( isDownRecPing & ( (downSubMsgHeadInfo(0).operator === SUBMSG_OPERATOR_UNIWRITE) | (downSubMsgHeadInfo(0).operator === SUBMSG_OPERATOR_UNIRDWR ) ) & downSubMsgHeadInfo(0).isLgcIndex ) | + ( ~isDownRecPing & ( (downSubMsgHeadInfo(1).operator === SUBMSG_OPERATOR_UNIWRITE) | (downSubMsgHeadInfo(1).operator === SUBMSG_OPERATOR_UNIRDWR ) ) & downSubMsgHeadInfo(1).isLgcIndex ) + )){//组合逻辑 + logicAddrwNext := logicAddrw + 1.U + } .otherwise{//组合逻辑 + logicAddrwNext := logicAddrw + } + + when( + ( (downRecParser.io.subMsgHeadReq.bits.operator === SUBMSG_OPERATOR_UNIWRITE | downRecParser.io.subMsgHeadReq.bits.operator === SUBMSG_OPERATOR_UNIRDWR) & downRecParser.io.subMsgHeadReq.bits.isSeqIndex & downRecParser.io.subMsgHeadReq.bits.devIndex === localDevIndex ) | + ( downRecParser.io.subMsgHeadReq.bits.operator === SUBMSG_OPERATOR_BOARDWRITE | downRecParser.io.subMsgHeadReq.bits.operator === SUBMSG_OPERATOR_BOARDRDWR ) + ){ //常规寻址 + when( downRecParser.io.subMsgHeadReq.fire ){ //子包头装填 + addrw := downRecParser.io.subMsgHeadReq.bits.address + } .elsewhen( isWrite & downRecParser.io.data.fire ){ + addrw := addrw + 1.U + } + } .elsewhen( isDownLgcAddrwAcquireTrans & ( + ( downRecParser.io.subMsgHeadReq.fire & (downRecParser.io.subMsgHeadReq.bits.operator === SUBMSG_OPERATOR_UNIWRITE | downRecParser.io.subMsgHeadReq.bits.operator === SUBMSG_OPERATOR_UNIRDWR) & downRecParser.io.subMsgHeadReq.bits.isLgcIndex ) | + ( isDownRecPing & ( (downSubMsgHeadInfo(0).operator === SUBMSG_OPERATOR_UNIWRITE) | (downSubMsgHeadInfo(0).operator === SUBMSG_OPERATOR_UNIRDWR ) ) & downSubMsgHeadInfo(0).isLgcIndex ) | + ( ~isDownRecPing & ( (downSubMsgHeadInfo(1).operator === SUBMSG_OPERATOR_UNIWRITE) | (downSubMsgHeadInfo(1).operator === SUBMSG_OPERATOR_UNIRDWR ) ) & downSubMsgHeadInfo(1).isLgcIndex ) + )){ + addrw := acquireDownPhyAddrw + } .elsewhen( + isWrite & downRecParser.io.data.fire & ( + ( isDownRecPing & ( (downSubMsgHeadInfo(0).operator === SUBMSG_OPERATOR_UNIWRITE) | (downSubMsgHeadInfo(0).operator === SUBMSG_OPERATOR_UNIRDWR ) ) & downSubMsgHeadInfo(0).isLgcIndex ) | + ( ~isDownRecPing & ( (downSubMsgHeadInfo(1).operator === SUBMSG_OPERATOR_UNIWRITE) | (downSubMsgHeadInfo(1).operator === SUBMSG_OPERATOR_UNIRDWR ) ) & downSubMsgHeadInfo(1).isLgcIndex ) + ) ){ + assert(~isDownLgcAddrwAcquireTrans) + addrw := Mux( downTransLenCnt === 0.U, 0.U, addrw + 1.U ) + } + + io.lvds.isEnW := isWrite & isWRReg & downRecParser.io.data.fire + io.lvds.dataw := downRecParser.io.data.bits + + io.sram_w(0).enw := isWrite & isWRSM0 & downRecParser.io.data.fire + io.sram_w(0).addrw := addrw(10,0) + io.sram_w(0).dataw := downRecParser.io.data.bits + + io.sram_w(1).enw := isWrite & isWRSM2 & downRecParser.io.data.fire + io.sram_w(1).addrw := addrw(10,0) + io.sram_w(1).dataw := downRecParser.io.data.bits + + io.sram_w(2).enw := isWrite & isWRSM4 & downRecParser.io.data.fire + io.sram_w(2).addrw := addrw(10,0) + io.sram_w(2).dataw := downRecParser.io.data.bits + + io.sram_w(3).enw := isWrite & isWRSM6 & downRecParser.io.data.fire + io.sram_w(3).addrw := addrw(10,0) + io.sram_w(3).dataw := downRecParser.io.data.bits + + + + + + //上行接收 + when( upRecParser.io.subMsgTailReq.fire ){ + when( isUpRecPing ){ + //override + when( + ( ( (upSubMsgHeadInfo(0).operator === SUBMSG_OPERATOR_UNIREAD ) | (upSubMsgHeadInfo(0).operator === SUBMSG_OPERATOR_UNIRDWR ) ) & ((upSubMsgHeadInfo(0).isSeqIndex & upSubMsgHeadInfo(0).devIndex === localDevIndex) || (upSubMsgHeadInfo(0).isLgcIndex & isUpLgcWorked =/= 0.U ) ) ) | + ( ( (upSubMsgHeadInfo(0).operator === SUBMSG_OPERATOR_BOARDREAD) | (upSubMsgHeadInfo(0).operator === SUBMSG_OPERATOR_BOARDRDWR) ) ) + ){ //自身包//读或读写 + upSubMsgTailInfo(0).workCnt := upRecParser.io.subMsgTailReq.bits.workCnt + 1.U + } + } .otherwise{ + //override + when( + ( ( (upSubMsgHeadInfo(1).operator === SUBMSG_OPERATOR_UNIREAD ) | (upSubMsgHeadInfo(1).operator === SUBMSG_OPERATOR_UNIRDWR ) ) & ((upSubMsgHeadInfo(1).isSeqIndex & upSubMsgHeadInfo(1).devIndex === localDevIndex) || (upSubMsgHeadInfo(1).isLgcIndex & isUpLgcWorked =/= 0.U ) ) ) | + ( ( (upSubMsgHeadInfo(1).operator === SUBMSG_OPERATOR_BOARDREAD) | (upSubMsgHeadInfo(1).operator === SUBMSG_OPERATOR_BOARDRDWR) ) ) + ){ //自身包//读或读写 ) + upSubMsgTailInfo(1).workCnt := upRecParser.io.subMsgTailReq.bits.workCnt + 1.U + } + } + } + + + + + + val upTransLenCnt = RegInit(0.U) + + + val addrr = RegInit(0.U(15.W)) + val logicAddrrNext = Wire( UInt(30.W) ) + val logicAddrr = RegNext(logicAddrrNext, 0.U(30.W)) + + + val isUpLgcAddrrAcquireTrans = //是否触发地址转换 + (upTransLenCnt === 0.U) & ( (0 until 16).map{ i => + sReg.ebmmu(i).isEnable & (sReg.ebmmu(i).EBMMU_OP_RD || sReg.ebmmu(i).EBMMU_OP_RW) & (logicAddrrNext === sReg.ebmmu(i).lAddr) + }.reduce(_|_)) + + val acquireUpPhyAddrr = Mux1H( //选择一个ebmmu + (0 until 16).map{ i => + (sReg.ebmmu(i).isEnable & (sReg.ebmmu(i).EBMMU_OP_RD || sReg.ebmmu(i).EBMMU_OP_RW) & (logicAddrrNext === sReg.ebmmu(i).lAddr)) -> + sReg.ebmmu(i).pAddr + } + ) + + val acquireUpTransLen = Mux1H( //选择一个ebmmu + (0 until 16).map{ i => + (sReg.ebmmu(i).isEnable & (sReg.ebmmu(i).EBMMU_OP_RD || sReg.ebmmu(i).EBMMU_OP_RW) & (logicAddrrNext === sReg.ebmmu(i).lAddr)) -> + sReg.ebmmu(i).length + } + ) + + when( isUpLgcAddrrAcquireTrans & ( + (upRecParser.io.subMsgHeadReq.fire & (upRecParser.io.subMsgHeadReq.bits.operator === SUBMSG_OPERATOR_UNIREAD | upRecParser.io.subMsgHeadReq.bits.operator === SUBMSG_OPERATOR_UNIRDWR) & upRecParser.io.subMsgHeadReq.bits.isLgcIndex) | + ( isUpRecPing & (upSubMsgHeadInfo(0).operator === SUBMSG_OPERATOR_UNIREAD | upSubMsgHeadInfo(0).operator === SUBMSG_OPERATOR_UNIRDWR ) & ( upSubMsgHeadInfo(0).isLgcIndex )) | + (~isUpRecPing & (upSubMsgHeadInfo(1).operator === SUBMSG_OPERATOR_UNIREAD | upSubMsgHeadInfo(1).operator === SUBMSG_OPERATOR_UNIRDWR ) & ( upSubMsgHeadInfo(1).isLgcIndex )) + )){ //装填计数器 + upTransLenCnt := acquireUpTransLen + } .elsewhen( upRecParser.io.data.fire & upTransLenCnt =/= 0.U ){ + upTransLenCnt := upTransLenCnt - 1.U + } + + when( upRecParser.io.subMsgTailReq.fire ){ + isUpLgcWorked := false.B + } .elsewhen( isUpLgcAddrrAcquireTrans ){ + isUpLgcWorked := true.B + } + + //组合逻辑 + when( upRecParser.io.subMsgHeadReq.fire & ( + (upRecParser.io.subMsgHeadReq.bits.operator === SUBMSG_OPERATOR_UNIREAD | upRecParser.io.subMsgHeadReq.bits.operator === SUBMSG_OPERATOR_UNIRDWR) & upRecParser.io.subMsgHeadReq.bits.isLgcIndex + )){//组合逻辑 + logicAddrrNext := Cat( upRecParser.io.subMsgHeadReq.bits.devIndex, upRecParser.io.subMsgHeadReq.bits.address ) + } .elsewhen( upRecParser.io.data.fire){ + when( + ( isUpRecPing & (upSubMsgHeadInfo(0).operator === SUBMSG_OPERATOR_UNIREAD | upSubMsgHeadInfo(0).operator === SUBMSG_OPERATOR_UNIRDWR ) & upSubMsgHeadInfo(0).isLgcIndex ) | + (~isUpRecPing & (upSubMsgHeadInfo(1).operator === SUBMSG_OPERATOR_UNIREAD | upSubMsgHeadInfo(1).operator === SUBMSG_OPERATOR_UNIRDWR ) & upSubMsgHeadInfo(1).isLgcIndex ) + ){//组合逻辑 + logicAddrrNext := logicAddrr + 1.U + } .otherwise{ + logicAddrrNext := 0.U + } + } .otherwise{//组合逻辑 + logicAddrrNext := logicAddrr + } + + + val isRDReg = addrr(14,11) === "b0000".U + val isRDSM1 = addrr(14,11) === "b0010".U + val isRDSM3 = addrr(14,11) === "b0100".U + val isRDSM5 = addrr(14,11) === "b0110".U + val isRDSM7 = addrr(14,11) === "b1000".U + + val isSeqRead = + ((upRecParser.io.stateCurr === STATE_PAYLOAD_DATA) & ( + ( isUpRecPing & (upSubMsgHeadInfo(0).operator === SUBMSG_OPERATOR_UNIREAD | upSubMsgHeadInfo(0).operator === SUBMSG_OPERATOR_UNIRDWR ) & ((upSubMsgHeadInfo(0).isSeqIndex & upSubMsgHeadInfo(0).devIndex === localDevIndex) )) | + (~isUpRecPing & (upSubMsgHeadInfo(1).operator === SUBMSG_OPERATOR_UNIREAD | upSubMsgHeadInfo(1).operator === SUBMSG_OPERATOR_UNIRDWR ) & ((upSubMsgHeadInfo(1).isSeqIndex & upSubMsgHeadInfo(1).devIndex === localDevIndex) )) | + ( isUpRecPing & (upSubMsgHeadInfo(0).operator === SUBMSG_OPERATOR_BOARDREAD | upSubMsgHeadInfo(0).operator === SUBMSG_OPERATOR_BOARDRDWR ) ) | + (~isUpRecPing & (upSubMsgHeadInfo(1).operator === SUBMSG_OPERATOR_BOARDREAD | upSubMsgHeadInfo(1).operator === SUBMSG_OPERATOR_BOARDRDWR ) ) + ) + ) & ( (RegNext(upRecParser.io.stateCurr, STATE_IDLE) =/= STATE_PAYLOAD_DATA) | upRecParser.io.data.fire ) + + val isLgcRead = + ((upRecParser.io.stateCurr === STATE_PAYLOAD_DATA) & ( + ( isUpRecPing & (upSubMsgHeadInfo(0).operator === SUBMSG_OPERATOR_UNIREAD | upSubMsgHeadInfo(0).operator === SUBMSG_OPERATOR_UNIRDWR ) & ( (upSubMsgHeadInfo(0).isLgcIndex & upTransLenCnt =/= 0.U ) )) | + (~isUpRecPing & (upSubMsgHeadInfo(1).operator === SUBMSG_OPERATOR_UNIREAD | upSubMsgHeadInfo(1).operator === SUBMSG_OPERATOR_UNIRDWR ) & ( (upSubMsgHeadInfo(1).isLgcIndex & upTransLenCnt =/= 0.U ) )) + ) + ) & ( RegNext(isUpLgcAddrrAcquireTrans, false.B) | upRecParser.io.data.fire ) + + val isLvdsEnR = isSeqRead | isLgcRead + + + + when( + ((upRecParser.io.subMsgHeadReq.bits.operator === SUBMSG_OPERATOR_UNIREAD | upRecParser.io.subMsgHeadReq.bits.operator === SUBMSG_OPERATOR_UNIRDWR ) & (upRecParser.io.subMsgHeadReq.bits.isSeqIndex & upRecParser.io.subMsgHeadReq.bits.devIndex === localDevIndex)) | + ( upRecParser.io.subMsgHeadReq.bits.operator === SUBMSG_OPERATOR_BOARDREAD | upRecParser.io.subMsgHeadReq.bits.operator === SUBMSG_OPERATOR_BOARDRDWR) + ){ + when( upRecParser.io.subMsgHeadReq.fire){ + addrr := upRecParser.io.subMsgHeadReq.bits.address + } .elsewhen(isLvdsEnR){ + addrr := addrr + 1.U + } + } .elsewhen( isUpLgcAddrrAcquireTrans & ( + (upRecParser.io.subMsgHeadReq.fire & (upRecParser.io.subMsgHeadReq.bits.operator === SUBMSG_OPERATOR_UNIREAD | upRecParser.io.subMsgHeadReq.bits.operator === SUBMSG_OPERATOR_UNIRDWR) & upRecParser.io.subMsgHeadReq.bits.isLgcIndex) | + ( isUpRecPing & (upSubMsgHeadInfo(0).operator === SUBMSG_OPERATOR_UNIREAD | upSubMsgHeadInfo(0).operator === SUBMSG_OPERATOR_UNIRDWR ) & ( upSubMsgHeadInfo(0).isLgcIndex )) | + (~isUpRecPing & (upSubMsgHeadInfo(1).operator === SUBMSG_OPERATOR_UNIREAD | upSubMsgHeadInfo(1).operator === SUBMSG_OPERATOR_UNIRDWR ) & ( upSubMsgHeadInfo(1).isLgcIndex )) + )){ + addrr := acquireUpPhyAddrr + } .elsewhen( isLvdsEnR & ( + ( isUpRecPing & (upSubMsgHeadInfo(0).operator === SUBMSG_OPERATOR_UNIREAD | upSubMsgHeadInfo(0).operator === SUBMSG_OPERATOR_UNIRDWR ) & ( upSubMsgHeadInfo(0).isLgcIndex )) | + (~isUpRecPing & (upSubMsgHeadInfo(1).operator === SUBMSG_OPERATOR_UNIREAD | upSubMsgHeadInfo(1).operator === SUBMSG_OPERATOR_UNIRDWR ) & ( upSubMsgHeadInfo(1).isLgcIndex )) + )){ + assert(~isUpLgcAddrrAcquireTrans) + addrr := Mux( upTransLenCnt === 0.U, 0.U, addrr + 1.U ) + } + + + + val upStreamData = Mux1H(Seq( + isRDReg -> io.lvds.datar, + isRDSM1 -> io.sram_r(0).datar, + isRDSM3 -> io.sram_r(1).datar, + isRDSM5 -> io.sram_r(2).datar, + isRDSM7 -> io.sram_r(3).datar, + )) + + + when( isUpRecPing ){ + upRecFifo(0).io.enq.valid := upRecParser.io.data.valid + upRecFifo(0).io.enq.bits := + Mux( + ( upSubMsgHeadInfo(0).operator === SUBMSG_OPERATOR_UNIREAD | upSubMsgHeadInfo(0).operator === SUBMSG_OPERATOR_UNIRDWR ) & ((upSubMsgHeadInfo(0).isSeqIndex & upSubMsgHeadInfo(0).devIndex === localDevIndex) | (upSubMsgHeadInfo(0).isLgcIndex & upTransLenCnt =/= 0.U)), upStreamData, + Mux( upSubMsgHeadInfo(0).operator === SUBMSG_OPERATOR_BOARDREAD | upSubMsgHeadInfo(0).operator === SUBMSG_OPERATOR_BOARDRDWR, upStreamData | upRecParser.io.data.bits, + upRecParser.io.data.bits ) + ) + upRecParser.io.data.ready := upRecFifo(0).io.enq.ready + + upRecFifo(1).io.enq.valid := false.B + upRecFifo(1).io.enq.bits := 0.U + } .otherwise{ + upRecFifo(0).io.enq.valid := false.B + upRecFifo(0).io.enq.bits := 0.U + + upRecFifo(1).io.enq.valid := upRecParser.io.data.valid + upRecFifo(1).io.enq.bits := + Mux( + ( upSubMsgHeadInfo(1).operator === SUBMSG_OPERATOR_UNIREAD | upSubMsgHeadInfo(1).operator === SUBMSG_OPERATOR_UNIRDWR ) & ((upSubMsgHeadInfo(1).isSeqIndex & upSubMsgHeadInfo(1).devIndex === localDevIndex) | (upSubMsgHeadInfo(1).isLgcIndex & upTransLenCnt =/= 0.U)), upStreamData, + Mux( upSubMsgHeadInfo(1).operator === SUBMSG_OPERATOR_BOARDREAD | upSubMsgHeadInfo(1).operator === SUBMSG_OPERATOR_BOARDRDWR, upStreamData | upRecParser.io.data.bits, + upRecParser.io.data.bits + ) + ) + upRecParser.io.data.ready := upRecFifo(1).io.enq.ready + + } + + + + + + + + io.lvds.addrr := addrr(10,0) + io.lvds.addrw := addrw(10,0) + + + // assert( ~(isRead & isWrite) ) + + + + io.lvds.isEnR := isRDReg & isLvdsEnR + io.sram_r(0).enr := isRDSM1 & isLvdsEnR + io.sram_r(1).enr := isRDSM3 & isLvdsEnR + io.sram_r(2).enr := isRDSM5 & isLvdsEnR + io.sram_r(3).enr := isRDSM7 & isLvdsEnR + + io.sram_r(0).addrr := addrr(10,0) + io.sram_r(1).addrr := addrr(10,0) + io.sram_r(2).addrr := addrr(10,0) + io.sram_r(3).addrr := addrr(10,0) + + + io.dSMenq(0) := io.sram_w(0).enw & isWRSM0 & (io.cReg.smTrigLen(0) - 1.U) === addrw(10,0) + io.uSMdeq(0) := isLvdsEnR & isRDSM1 & (io.cReg.smTrigLen(1) - 1.U + 1.U) === addrr(10,0) + io.dSMenq(1) := io.sram_w(1).enw & isWRSM2 & (io.cReg.smTrigLen(2) - 1.U) === addrw(10,0) + io.uSMdeq(1) := isLvdsEnR & isRDSM3 & (io.cReg.smTrigLen(3) - 1.U + 1.U) === addrr(10,0) + io.dSMenq(2) := io.sram_w(2).enw & isWRSM4 & (io.cReg.smTrigLen(4) - 1.U) === addrw(10,0) + io.uSMdeq(2) := isLvdsEnR & isRDSM5 & (io.cReg.smTrigLen(5) - 1.U + 1.U) === addrr(10,0) + io.dSMenq(3) := io.sram_w(3).enw & isWRSM6 & (io.cReg.smTrigLen(6) - 1.U) === addrw(10,0) + io.uSMdeq(3) := isLvdsEnR & isRDSM7 & (io.cReg.smTrigLen(7) - 1.U + 1.U) === addrr(10,0) + + +} + + +trait SlaveParserSync{ this: SlaveParserBase => + val addr64_op1 = WireDefault( 0.U(64.W) ) + val addr64_op2 = WireDefault( 0.U(64.W) ) + def subOp2(x:UInt) = ~x + 1.U + val addr64_res = addr64_op1 + addr64_op2 + + val addrConflict = WireDefault(VecInit(Seq.fill(5){false.B})) + dontTouch(addrConflict) + assert( PopCount(addrConflict) <= 1.U ) + + + //下行接收 + when( downRecParser.io.subMsgTailReq.fire ){ + when( isDownRecPing ){ + //override + when( + downSubMsgHeadInfo(0).operator === SUBMSG_OPERATOR_SYNCA || + downSubMsgHeadInfo(0).operator === SUBMSG_OPERATOR_SYNCC ) { //同步包 + downSubMsgTailInfo(0).workCnt := downRecParser.io.subMsgTailReq.bits.workCnt + 1.U + } + + } .otherwise{ //pong + //override + when( + downSubMsgHeadInfo(1).operator === SUBMSG_OPERATOR_SYNCA || + downSubMsgHeadInfo(1).operator === SUBMSG_OPERATOR_SYNCC ) { //同步包 ) + downSubMsgTailInfo(1).workCnt := downRecParser.io.subMsgTailReq.bits.workCnt + 1.U + } + } + } + + + + val downTimeStamp = RegInit(0.U(64.W)) //下行本地时间戳寄存器 + val upTimeStamp = RegInit(0.U(64.W)) //上行本地时间戳寄存器 + val mstTimeStamp = RegInit(0.U(64.W)) //主站时间戳 + val mstDeltaTimeStamp = RegInit(0.U(32.W)); io.mstDeltaTimeStamp := mstDeltaTimeStamp //主站时间戳差值 + val slvDeltaTimeStamp = RegInit(0.U(32.W)); io.slvDeltaTime := slvDeltaTimeStamp //从站时间戳差值 + + val mstSlvDeltaTimeStamp = RegInit(0.U(64.W)) //主发从接时间差(中间变量) + val deltaMstSlvDeltaTimeStamp = RegInit(0.U(64.W)) //主差从差时间差(中间变量) + val deltaFinal = RegInit(0.U(64.W)); io.deltaFinal := deltaFinal //当前时间戳与主站时间差 + val deltaFinalPre = RegInit(0.U(64.W)) //当前时间戳与主站时间差预记录 + + // recoTimeStamp = io.timeStamp + deltaFinal + // recoTimeStamp = io.timeStamp + mstSlvDeltaTimeStamp + deltaMstSlvDeltaTimeStamp + // recoTimeStamp = io.timeStamp + mstTimeStamp - downTimeStamp + (mstDeltaTimeStamp - slvDeltaTimeStamp ) >> 1 + // recoTimeStamp = io.timeStamp + mstTimeStamp - downTimeStamp + (mstDeltaTimeStamp - (upTimeStamp - downTimeStamp)) >> 1 + + + //更新下行本地时间戳寄存器 + when( downRecParser.io.frameReq.fire & downRecParser.io.frameReq.bits.frameStyle === FRAME_STYLE_COMMON ){ + downTimeStamp := io.cReg.timeStamp + } + + //更新上行本地时间戳寄存器 + when( upRecParser.io.frameReq.fire & upRecParser.io.frameReq.bits.frameStyle === FRAME_STYLE_COMMON ){ + upTimeStamp := io.cReg.timeStamp + + // slvDeltaTimeStamp := io.cReg.timeStamp - downTimeStamp + addr64_op1 := io.cReg.timeStamp //组合逻辑 + addr64_op2 := subOp2(downTimeStamp) //组合逻辑 + addrConflict(0) := true.B //组合逻辑 + slvDeltaTimeStamp := addr64_res //时序逻辑 + } + + //下行接收 + val isSync = (downRecParser.io.stateCurr === STATE_PAYLOAD_DATA) & ( //req fire 后 已经反相 + ( isDownRecPing & downSubMsgHeadInfo(0).devIndex === 0.U & downSubMsgHeadInfo(0).operator === SUBMSG_OPERATOR_SYNCA ) | + ( isDownRecPing & downSubMsgHeadInfo(0).devIndex === 0.U & downSubMsgHeadInfo(0).operator === SUBMSG_OPERATOR_SYNCC ) | + ( ~isDownRecPing & downSubMsgHeadInfo(1).devIndex === 0.U & downSubMsgHeadInfo(1).operator === SUBMSG_OPERATOR_SYNCA ) | + ( ~isDownRecPing & downSubMsgHeadInfo(1).devIndex === 0.U & downSubMsgHeadInfo(1).operator === SUBMSG_OPERATOR_SYNCC ) + ) + + val syncCnt = RegInit(0.U(4.W)) + + when( downRecParser.io.rec.fire ){ + when( isSync ){ + syncCnt := syncCnt + 1.U + } .otherwise{ + syncCnt := 0.U + } + } + + + when( isSync & downRecParser.io.rec.fire ){ + when( syncCnt === 0.U ){ + mstTimeStamp := Cat( mstTimeStamp(63, 8), downRecParser.io.data.bits ) + } .elsewhen( syncCnt === 1.U ){ + mstTimeStamp := Cat( mstTimeStamp(63,16), downRecParser.io.data.bits, mstTimeStamp(7,0) ) + } .elsewhen( syncCnt === 2.U ){ + mstTimeStamp := Cat( mstTimeStamp(63,24), downRecParser.io.data.bits, mstTimeStamp(15,0) ) + } .elsewhen( syncCnt === 3.U ){ + mstTimeStamp := Cat( mstTimeStamp(63,32), downRecParser.io.data.bits, mstTimeStamp(23,0) ) + } .elsewhen( syncCnt === 4.U ){ + mstTimeStamp := Cat( mstTimeStamp(63,40), downRecParser.io.data.bits, mstTimeStamp(31,0) ) + } .elsewhen( syncCnt === 5.U ){ + mstTimeStamp := Cat( mstTimeStamp(63,48), downRecParser.io.data.bits, mstTimeStamp(39,0) ) + } .elsewhen( syncCnt === 6.U ){ + mstTimeStamp := Cat( mstTimeStamp(63,56), downRecParser.io.data.bits, mstTimeStamp(47,0) ) + } .elsewhen( syncCnt === 7.U ){ + mstTimeStamp := Cat( downRecParser.io.data.bits, mstTimeStamp(55,0) ) + } .elsewhen( syncCnt === 8.U ){ + // mstSlvDeltaTimeStamp := mstTimeStamp - downTimeStamp + + addr64_op1 := mstTimeStamp //组合逻辑 + addr64_op2 := subOp2(downTimeStamp) //组合逻辑 + addrConflict(1) := true.B //组合逻辑 + mstSlvDeltaTimeStamp := addr64_res //时序逻辑 + + mstDeltaTimeStamp := Cat( mstDeltaTimeStamp(31, 8), downRecParser.io.data.bits ) + } .elsewhen( syncCnt === 9.U ){ + mstDeltaTimeStamp := Cat( mstDeltaTimeStamp(31,16), downRecParser.io.data.bits, mstDeltaTimeStamp(7,0) ) + } .elsewhen( syncCnt === 10.U ){ + mstDeltaTimeStamp := Cat( mstDeltaTimeStamp(31,24), downRecParser.io.data.bits, mstDeltaTimeStamp(15,0) ) + } .elsewhen( syncCnt === 11.U ){ + mstDeltaTimeStamp := Cat( downRecParser.io.data.bits, mstDeltaTimeStamp(23, 0) ) + } .otherwise{ + assert(false.B, "Wrong Sync SubMsg!\n") + } + } + + val shiftIsSync = ShiftRegisters(isSync, 3, false.B, true.B) + + when( shiftIsSync(0) & ~isSync ){ + // deltaMstSlvDeltaTimeStamp := (mstDeltaTimeStamp - slvDeltaTimeStamp) >>> 1 //(mstDeltaTimeStamp - slvDeltaTimeStamp) >> 1 + + addr64_op1 := Cat( Fill(32, mstDeltaTimeStamp(31)), mstDeltaTimeStamp) //组合逻辑 + addr64_op2 := subOp2( Cat( Fill(32, slvDeltaTimeStamp(31)), slvDeltaTimeStamp) ) //组合逻辑 + addrConflict(2) := true.B //组合逻辑 + deltaMstSlvDeltaTimeStamp := Cat(addr64_res(63),addr64_res(63,1)) //时序逻辑 + + } .elsewhen( shiftIsSync(1) & ~shiftIsSync(0) ){ + // deltaFinal := mstSlvDeltaTimeStamp + deltaMstSlvDeltaTimeStamp + addr64_op1 := mstSlvDeltaTimeStamp //组合逻辑 + addr64_op2 := deltaMstSlvDeltaTimeStamp //组合逻辑 + addrConflict(3) := true.B //组合逻辑 + deltaFinalPre := addr64_res //时序逻辑 + } .elsewhen( shiftIsSync(2) & ~shiftIsSync(1) ){ + when( + ( isDownRecPing & downSubMsgHeadInfo(0).devIndex === 0.U & downSubMsgHeadInfo(0).operator === SUBMSG_OPERATOR_SYNCC ) | + ( ~isDownRecPing & downSubMsgHeadInfo(1).devIndex === 0.U & downSubMsgHeadInfo(1).operator === SUBMSG_OPERATOR_SYNCC ) + ){ + deltaFinal := deltaFinalPre + } .elsewhen( + ( isDownRecPing & downSubMsgHeadInfo(0).devIndex === 0.U & downSubMsgHeadInfo(0).operator === SUBMSG_OPERATOR_SYNCA ) | + ( ~isDownRecPing & downSubMsgHeadInfo(1).devIndex === 0.U & downSubMsgHeadInfo(1).operator === SUBMSG_OPERATOR_SYNCA ) + ){ + addr64_op1 := deltaFinalPre //组合逻辑 + addr64_op2 := subOp2(deltaFinal) //组合逻辑 + addrConflict(4) := true.B //组合逻辑 + deltaFinal := MuxCase( deltaFinalPre, Seq( //时序逻辑 + ( addr64_res.asSInt < -10.S ) -> ( deltaFinal - 10.U ), + ( addr64_res.asSInt > 10.S ) -> ( deltaFinal + 10.U ), + ) ) + } + } + + +} + +trait SlaveParserProbe{ this: SlaveParserBase => + + val probeRecCnt = RegInit(0.U(9.W)) + val isWatchDogOverflow = probeRecCnt.andR + + when( downRecParser.io.frameReq.fire & downRecParser.io.frameReq.bits.frameStyle === FRAME_STYLE_PROBE ){ //下行来了一个嗅探包 + isReadyToProbe := true.B + when( downSendGen.io.stateCurr =/= STATE_IDLE ){ + printf("Error! downSendGen is busy while a Probe-Frame arrival!\n") + } + } .elsewhen( upRecParser.io.frameReq.fire & upRecParser.io.frameReq.bits.frameStyle === FRAME_STYLE_PROBE ){ //上行来了一个嗅探包 + isReadyToProbe := false.B + } .elsewhen( isWatchDogOverflow ){ + isReadyToProbe := false.B + } + + when( downRecParser.io.frameReq.fire & downRecParser.io.frameReq.bits.frameStyle === FRAME_STYLE_PROBE ){ //下行来了一个嗅探包 + isAckProbe := true.B + } .elsewhen( upSendGen.io.frameReq.fire & upSendGen.io.frameReq.bits.frameStyle === FRAME_STYLE_PROBE ){ //上行发送回复嗅探包 + isAckProbe := false.B + } + + when( upRecParser.io.frameReq.fire & upRecParser.io.frameReq.bits.frameStyle === FRAME_STYLE_PROBE ){ //上行来了一个嗅探包 + isLastDevice := false.B + } .elsewhen( isWatchDogOverflow ){ + isLastDevice := true.B + } + + + when( upRecParser.io.frameReq.fire & upRecParser.io.frameReq.bits.frameStyle === FRAME_STYLE_PROBE ){ //上行来了一个嗅探包 + probeRecCnt := 0.U + } .elsewhen( isWatchDogOverflow ){ + probeRecCnt := 0.U + } .elsewhen( isReadyToProbe ){ + probeRecCnt := probeRecCnt + 1.U + } + + + when( upRecParser.io.frameReq.fire & upRecParser.io.frameReq.bits.frameStyle === FRAME_STYLE_PROBE ){ //上行来了一个嗅探包 + indexOfRightDev := upRecParser.io.frameReq.bits.frameInfo + when( upRecParser.io.frameReq.bits.frameInfo =/= localDevIndex + 1.U ){ //索引不对 + isDevOnRightModify := true.B + } .otherwise{ + isDevOnRightModify := false.B + } + } + + + + + + + io.upOut <> Queue( upSendGen.io.send, 4, true, false ) + io.downIn <> downRecParser.io.rec + + io.downOut <> Queue( downSendGen.io.send, 4, true, false ) + io.upIn <> upRecParser.io.rec + + io.isLoop := isLastDevice & ~isReadyToProbe + +} + +class SlaveParser extends SlaveParserBase +with SlaveParserIndex +with SlaveParserRW +with SlaveParserSync +with SlaveParserProbe{ + io.intHWTrig(0) := downRecParser.io.isError + io.intHWTrig(1) := upRecParser.io.isError + + downRecParser.io.flush := RegNext(downRecParser.io.isError & io.intHWClr(0), false.B) + downSendGen.io.flush := RegNext(downRecParser.io.isError & io.intHWClr(0), false.B) + + upRecParser.io.flush := RegNext(upRecParser.io.isError & io.intHWClr(1), false.B) + upSendGen.io.flush := RegNext(upRecParser.io.isError & io.intHWClr(1), false.B) + + io.downRecStat := downRecParser.io.stat + io.upRecStat := upRecParser.io.stat +} + + + + diff --git a/src/main/scala/backBoard/shin/SlaveRecParser.scala b/src/main/scala/backBoard/shin/SlaveRecParser.scala index 0707e49..376f5e6 100644 --- a/src/main/scala/backBoard/shin/SlaveRecParser.scala +++ b/src/main/scala/backBoard/shin/SlaveRecParser.scala @@ -1,211 +1,211 @@ -package BACK - -import chisel3._ -import chisel3.util._ - - -class SlaveRecParserIO extends Bundle{ - val rec = Flipped( Decoupled(new AXIS_Bundle(8)) ) - - val data = Decoupled(UInt(8.W)) - - val stateNext = Output(UInt(4.W)) - val stateCurr = Output(UInt(4.W)) - - val frameReq = Valid( new FrameHeader ) - val subMsgHeadReq = Valid( new SubMsgHeader ) - val subMsgTailReq = Valid( new SubMsgTail ) - - val isError = Output(Bool()) - - val stat = Output(new Stat_IO_Bundle) - - val flush = Input(Bool()) -} - -class SlaveRecParser extends Module with RequireAsyncReset{ - val io: SlaveRecParserIO = IO(new SlaveRecParserIO) - - val crc = Module(new crc32_8) - - val STATE_IDLE = 0.U //空闲 - val STATE_HEADER = 1.U //长度/ /保留2bits //包类型 - val STATE_SUBMSG_HEADER = 2.U //子报文设备索引 //子报文类型 - val STATE_PAYLOAD_DATA = 3.U //子报文数据 - val STATE_SUBMSG_TAIL = 4.U - val STATE_CRC = 5.U //CRC校验 - val STATE_ERROR = 6.U // - - - val stateNext = Wire(UInt(4.W)); io.stateNext := stateNext - val stateCurr = RegNext(stateNext, STATE_IDLE); io.stateCurr := stateCurr - - io.isError := stateCurr === STATE_ERROR - io.rec.ready := stateCurr =/= STATE_IDLE - - crc.io.isEnable := io.rec.fire & ( - stateCurr === STATE_HEADER | - stateCurr === STATE_SUBMSG_HEADER | - stateCurr === STATE_PAYLOAD_DATA | - stateCurr === STATE_SUBMSG_TAIL - ) - - - crc.io.dataIn := io.rec.bits.tdata - - crc.io.flush := stateCurr === STATE_IDLE | io.flush - - val crcData = RegInit(0.U(32.W)) - val isCrcPass = crc.io.crc === Cat( crcData(23,0), io.rec.bits.tdata ) - - when( io.rec.fire & stateCurr === STATE_CRC ){ - crcData := Cat( crcData(23,0), io.rec.bits.tdata ) - } - - val FRAME_STYLE_COMMON = 0.U - val FRAME_STYLE_PROBE = 1.U - - val lengthCnt = RegInit(0.U(12.W)) //动态计数器 - val frameLenCnt = RegInit(0.U(12.W)) //帧长度计数 - - io.frameReq.valid := (stateCurr === STATE_HEADER) & (stateNext === STATE_SUBMSG_HEADER | stateNext === STATE_CRC) - val frameHeader = RegInit(0.U.asTypeOf(new FrameHeader)) - io.frameReq.bits.frameLenAim := frameHeader.frameLenAim - io.frameReq.bits.frameStyle := frameHeader.frameStyle - io.frameReq.bits.frameInfo := frameHeader.frameInfo | io.rec.bits.tdata - - io.subMsgHeadReq.valid := (stateCurr === STATE_SUBMSG_HEADER) & (stateNext === STATE_PAYLOAD_DATA) - io.subMsgTailReq.valid := (stateCurr === STATE_SUBMSG_TAIL) & (stateNext =/= STATE_SUBMSG_TAIL) - - val subMsgHeader = RegInit(0.U.asTypeOf(new SubMsgHeader)) - val subMsgTail = RegInit(0.U.asTypeOf(new SubMsgTail)) - - io.subMsgHeadReq.bits.devIndex := subMsgHeader.devIndex - io.subMsgHeadReq.bits.style := subMsgHeader.style - io.subMsgHeadReq.bits.address := subMsgHeader.address - io.subMsgHeadReq.bits.operator := subMsgHeader.operator - io.subMsgHeadReq.bits.length := subMsgHeader.length | io.rec.bits.tdata(7,0) - - io.subMsgTailReq.bits.workCnt := subMsgTail.workCnt | io.rec.bits.tdata(7,0) - - when( io.flush ){ - lengthCnt := 0.U - } .elsewhen( io.rec.fire ){ - when( stateCurr =/= stateNext ){ - lengthCnt := 0.U - } .otherwise{ - lengthCnt := lengthCnt + 1.U - } - } - - - when( io.rec.fire ){ - when( stateCurr === STATE_HEADER ){ - frameLenCnt := 0.U - } .elsewhen( - ( stateCurr === STATE_SUBMSG_HEADER ) || - ( stateCurr === STATE_PAYLOAD_DATA ) || - ( stateCurr === STATE_SUBMSG_TAIL ) - ){ - frameLenCnt := frameLenCnt + 1.U - } - } - - - io.data.valid := io.rec.fire & stateCurr === STATE_PAYLOAD_DATA - io.data.bits := io.rec.bits.tdata - - // assert( ~(io.data.valid & ~io.data.ready), "Assert Failed! Receive Data was rejected by fifo!" ) - val isDataRejErr = io.data.valid & ~io.data.ready - - when( (io.data.valid & ~io.data.ready) ){ - printf( "Error! Receive Data was rejected by fifo!\n") - } - - - when( io.rec.fire ){ - when( stateCurr === STATE_HEADER ){ - when( lengthCnt === 0.U ){ - frameHeader.frameLenAim := io.rec.bits.tdata << 4 - } .elsewhen( lengthCnt === 1.U ){ - frameHeader.frameLenAim := frameHeader.frameLenAim | io.rec.bits.tdata(7,4) - frameHeader.frameStyle := io.rec.bits.tdata(1,0) - } .elsewhen( lengthCnt === 2.U ){ - frameHeader.frameInfo := io.rec.bits.tdata << 8 - } .elsewhen( lengthCnt === 3.U ){ - frameHeader.frameInfo := frameHeader.frameInfo | io.rec.bits.tdata - } - } - - when( stateCurr === STATE_SUBMSG_HEADER ){ - when(lengthCnt === 0.U ){ - subMsgHeader.devIndex := io.rec.bits.tdata << 6 - } .elsewhen( lengthCnt === 1.U ){ - subMsgHeader.devIndex := subMsgHeader.devIndex | io.rec.bits.tdata(7,2) - subMsgHeader.style := io.rec.bits.tdata(1,0) - } .elsewhen( lengthCnt === 2.U ){ - subMsgHeader.address := io.rec.bits.tdata << 8 - } .elsewhen( lengthCnt === 3.U ){ - subMsgHeader.address := subMsgHeader.address | io.rec.bits.tdata - } .elsewhen( lengthCnt === 4.U ){ - subMsgHeader.operator := io.rec.bits.tdata(7,4) - subMsgHeader.length := io.rec.bits.tdata(3,0) << 8 - } .elsewhen( lengthCnt === 5.U ){ - subMsgHeader.length := subMsgHeader.length | io.rec.bits.tdata(7,0) - } - } - - when( stateCurr === STATE_SUBMSG_TAIL ){ - when(lengthCnt === 0.U ){ - subMsgTail.workCnt := io.rec.bits.tdata << 8 - } .elsewhen( lengthCnt === 1.U ){ - subMsgTail.workCnt := subMsgTail.workCnt | io.rec.bits.tdata(7,0) - } - } - } - - stateNext := - Mux( io.flush, STATE_IDLE, - Mux1H(Seq( - //必须使用上升沿触发,以避免前一帧长度超过预期 - ( stateCurr === STATE_IDLE ) -> Mux( ~RegNext(io.rec.valid, false.B) & io.rec.valid, STATE_HEADER, STATE_IDLE ), - ( stateCurr === STATE_HEADER ) -> Mux( io.rec.fire, Mux(io.rec.bits.tlast, STATE_ERROR, - Mux( lengthCnt === (4-1).U, - MuxCase( STATE_ERROR, Array( - ( frameHeader.frameStyle === FRAME_STYLE_COMMON ) -> STATE_SUBMSG_HEADER, - ( frameHeader.frameStyle === FRAME_STYLE_PROBE ) -> STATE_CRC, - )), STATE_HEADER - )), STATE_HEADER - ), - ( stateCurr === STATE_SUBMSG_HEADER ) -> Mux( io.rec.fire, Mux(io.rec.bits.tlast, STATE_ERROR, - Mux( lengthCnt === (6-1).U, STATE_PAYLOAD_DATA, STATE_SUBMSG_HEADER ) - ), STATE_SUBMSG_HEADER), - - ( stateCurr === STATE_PAYLOAD_DATA ) -> Mux( io.rec.fire, Mux(io.rec.bits.tlast | isDataRejErr, STATE_ERROR, - Mux( lengthCnt === ( subMsgHeader.length - 1.U), STATE_SUBMSG_TAIL, STATE_PAYLOAD_DATA ) - ), STATE_PAYLOAD_DATA), - - ( stateCurr === STATE_SUBMSG_TAIL ) -> Mux( io.rec.fire, Mux(io.rec.bits.tlast, STATE_ERROR, - Mux( lengthCnt === ( (2 - 1).U), - Mux( frameLenCnt === frameHeader.frameLenAim - 1.U, STATE_CRC, STATE_SUBMSG_HEADER - ),STATE_SUBMSG_TAIL ) - ), STATE_SUBMSG_TAIL), - - ( stateCurr === STATE_CRC ) -> Mux( io.rec.fire & io.rec.bits.tlast, - Mux( lengthCnt === (4 - 1).U & isCrcPass, STATE_IDLE, STATE_ERROR ), STATE_CRC - ), - ( stateCurr === STATE_ERROR ) -> STATE_ERROR, - )) - ) - - io.stat.isHeaderError := stateNext === STATE_ERROR & stateCurr === STATE_HEADER - io.stat.isSubHeaderError := stateNext === STATE_ERROR & stateCurr === STATE_SUBMSG_HEADER - io.stat.isPayloadError := stateNext === STATE_ERROR & stateCurr === STATE_PAYLOAD_DATA - io.stat.isSubTailError := stateNext === STATE_ERROR & stateCurr === STATE_SUBMSG_TAIL - io.stat.isCRCError := stateNext === STATE_ERROR & stateCurr === STATE_CRC - io.stat.isFinish := stateNext === STATE_IDLE & stateCurr === STATE_CRC - io.stat.isRecByteAck := io.rec.fire -} - - - +package BACK + +import chisel3._ +import chisel3.util._ + + +class SlaveRecParserIO extends Bundle{ + val rec = Flipped( Decoupled(new AXIS_Bundle(8)) ) + + val data = Decoupled(UInt(8.W)) + + val stateNext = Output(UInt(4.W)) + val stateCurr = Output(UInt(4.W)) + + val frameReq = Valid( new FrameHeader ) + val subMsgHeadReq = Valid( new SubMsgHeader ) + val subMsgTailReq = Valid( new SubMsgTail ) + + val isError = Output(Bool()) + + val stat = Output(new Stat_IO_Bundle) + + val flush = Input(Bool()) +} + +class SlaveRecParser extends Module with RequireAsyncReset{ + val io: SlaveRecParserIO = IO(new SlaveRecParserIO) + + val crc = Module(new crc32_8) + + val STATE_IDLE = 0.U //空闲 + val STATE_HEADER = 1.U //长度/ /保留2bits //包类型 + val STATE_SUBMSG_HEADER = 2.U //子报文设备索引 //子报文类型 + val STATE_PAYLOAD_DATA = 3.U //子报文数据 + val STATE_SUBMSG_TAIL = 4.U + val STATE_CRC = 5.U //CRC校验 + val STATE_ERROR = 6.U // + + + val stateNext = Wire(UInt(4.W)); io.stateNext := stateNext + val stateCurr = RegNext(stateNext, STATE_IDLE); io.stateCurr := stateCurr + + io.isError := stateCurr === STATE_ERROR + io.rec.ready := stateCurr =/= STATE_IDLE + + crc.io.isEnable := io.rec.fire & ( + stateCurr === STATE_HEADER | + stateCurr === STATE_SUBMSG_HEADER | + stateCurr === STATE_PAYLOAD_DATA | + stateCurr === STATE_SUBMSG_TAIL + ) + + + crc.io.dataIn := io.rec.bits.tdata + + crc.io.flush := stateCurr === STATE_IDLE | io.flush + + val crcData = RegInit(0.U(32.W)) + val isCrcPass = crc.io.crc === Cat( crcData(23,0), io.rec.bits.tdata ) + + when( io.rec.fire & stateCurr === STATE_CRC ){ + crcData := Cat( crcData(23,0), io.rec.bits.tdata ) + } + + val FRAME_STYLE_COMMON = 0.U + val FRAME_STYLE_PROBE = 1.U + + val lengthCnt = RegInit(0.U(12.W)) //动态计数器 + val frameLenCnt = RegInit(0.U(12.W)) //帧长度计数 + + io.frameReq.valid := (stateCurr === STATE_HEADER) & (stateNext === STATE_SUBMSG_HEADER | stateNext === STATE_CRC) + val frameHeader = RegInit(0.U.asTypeOf(new FrameHeader)) + io.frameReq.bits.frameLenAim := frameHeader.frameLenAim + io.frameReq.bits.frameStyle := frameHeader.frameStyle + io.frameReq.bits.frameInfo := frameHeader.frameInfo | io.rec.bits.tdata + + io.subMsgHeadReq.valid := (stateCurr === STATE_SUBMSG_HEADER) & (stateNext === STATE_PAYLOAD_DATA) + io.subMsgTailReq.valid := (stateCurr === STATE_SUBMSG_TAIL) & (stateNext =/= STATE_SUBMSG_TAIL) + + val subMsgHeader = RegInit(0.U.asTypeOf(new SubMsgHeader)) + val subMsgTail = RegInit(0.U.asTypeOf(new SubMsgTail)) + + io.subMsgHeadReq.bits.devIndex := subMsgHeader.devIndex + io.subMsgHeadReq.bits.style := subMsgHeader.style + io.subMsgHeadReq.bits.address := subMsgHeader.address + io.subMsgHeadReq.bits.operator := subMsgHeader.operator + io.subMsgHeadReq.bits.length := subMsgHeader.length | io.rec.bits.tdata(7,0) + + io.subMsgTailReq.bits.workCnt := subMsgTail.workCnt | io.rec.bits.tdata(7,0) + + when( io.flush ){ + lengthCnt := 0.U + } .elsewhen( io.rec.fire ){ + when( stateCurr =/= stateNext ){ + lengthCnt := 0.U + } .otherwise{ + lengthCnt := lengthCnt + 1.U + } + } + + + when( io.rec.fire ){ + when( stateCurr === STATE_HEADER ){ + frameLenCnt := 0.U + } .elsewhen( + ( stateCurr === STATE_SUBMSG_HEADER ) || + ( stateCurr === STATE_PAYLOAD_DATA ) || + ( stateCurr === STATE_SUBMSG_TAIL ) + ){ + frameLenCnt := frameLenCnt + 1.U + } + } + + + io.data.valid := io.rec.fire & stateCurr === STATE_PAYLOAD_DATA + io.data.bits := io.rec.bits.tdata + + // assert( ~(io.data.valid & ~io.data.ready), "Assert Failed! Receive Data was rejected by fifo!" ) + val isDataRejErr = io.data.valid & ~io.data.ready + + when( (io.data.valid & ~io.data.ready) ){ + printf( "Error! Receive Data was rejected by fifo!\n") + } + + + when( io.rec.fire ){ + when( stateCurr === STATE_HEADER ){ + when( lengthCnt === 0.U ){ + frameHeader.frameLenAim := io.rec.bits.tdata << 4 + } .elsewhen( lengthCnt === 1.U ){ + frameHeader.frameLenAim := frameHeader.frameLenAim | io.rec.bits.tdata(7,4) + frameHeader.frameStyle := io.rec.bits.tdata(1,0) + } .elsewhen( lengthCnt === 2.U ){ + frameHeader.frameInfo := io.rec.bits.tdata << 8 + } .elsewhen( lengthCnt === 3.U ){ + frameHeader.frameInfo := frameHeader.frameInfo | io.rec.bits.tdata + } + } + + when( stateCurr === STATE_SUBMSG_HEADER ){ + when(lengthCnt === 0.U ){ + subMsgHeader.devIndex := io.rec.bits.tdata << 6 + } .elsewhen( lengthCnt === 1.U ){ + subMsgHeader.devIndex := subMsgHeader.devIndex | io.rec.bits.tdata(7,2) + subMsgHeader.style := io.rec.bits.tdata(1,0) + } .elsewhen( lengthCnt === 2.U ){ + subMsgHeader.address := io.rec.bits.tdata << 8 + } .elsewhen( lengthCnt === 3.U ){ + subMsgHeader.address := subMsgHeader.address | io.rec.bits.tdata + } .elsewhen( lengthCnt === 4.U ){ + subMsgHeader.operator := io.rec.bits.tdata(7,4) + subMsgHeader.length := io.rec.bits.tdata(3,0) << 8 + } .elsewhen( lengthCnt === 5.U ){ + subMsgHeader.length := subMsgHeader.length | io.rec.bits.tdata(7,0) + } + } + + when( stateCurr === STATE_SUBMSG_TAIL ){ + when(lengthCnt === 0.U ){ + subMsgTail.workCnt := io.rec.bits.tdata << 8 + } .elsewhen( lengthCnt === 1.U ){ + subMsgTail.workCnt := subMsgTail.workCnt | io.rec.bits.tdata(7,0) + } + } + } + + stateNext := + Mux( io.flush, STATE_IDLE, + Mux1H(Seq( + //必须使用上升沿触发,以避免前一帧长度超过预期 + ( stateCurr === STATE_IDLE ) -> Mux( ~RegNext(io.rec.valid, false.B) & io.rec.valid, STATE_HEADER, STATE_IDLE ), + ( stateCurr === STATE_HEADER ) -> Mux( io.rec.fire, Mux(io.rec.bits.tlast, STATE_ERROR, + Mux( lengthCnt === (4-1).U, + MuxCase( STATE_ERROR, Array( + ( frameHeader.frameStyle === FRAME_STYLE_COMMON ) -> STATE_SUBMSG_HEADER, + ( frameHeader.frameStyle === FRAME_STYLE_PROBE ) -> STATE_CRC, + )), STATE_HEADER + )), STATE_HEADER + ), + ( stateCurr === STATE_SUBMSG_HEADER ) -> Mux( io.rec.fire, Mux(io.rec.bits.tlast, STATE_ERROR, + Mux( lengthCnt === (6-1).U, STATE_PAYLOAD_DATA, STATE_SUBMSG_HEADER ) + ), STATE_SUBMSG_HEADER), + + ( stateCurr === STATE_PAYLOAD_DATA ) -> Mux( io.rec.fire, Mux(io.rec.bits.tlast | isDataRejErr, STATE_ERROR, + Mux( lengthCnt === ( subMsgHeader.length - 1.U), STATE_SUBMSG_TAIL, STATE_PAYLOAD_DATA ) + ), STATE_PAYLOAD_DATA), + + ( stateCurr === STATE_SUBMSG_TAIL ) -> Mux( io.rec.fire, Mux(io.rec.bits.tlast, STATE_ERROR, + Mux( lengthCnt === ( (2 - 1).U), + Mux( frameLenCnt === frameHeader.frameLenAim - 1.U, STATE_CRC, STATE_SUBMSG_HEADER + ),STATE_SUBMSG_TAIL ) + ), STATE_SUBMSG_TAIL), + + ( stateCurr === STATE_CRC ) -> Mux( io.rec.fire & io.rec.bits.tlast, + Mux( lengthCnt === (4 - 1).U & isCrcPass, STATE_IDLE, STATE_ERROR ), STATE_CRC + ), + ( stateCurr === STATE_ERROR ) -> STATE_ERROR, + )) + ) + + io.stat.isHeaderError := stateNext === STATE_ERROR & stateCurr === STATE_HEADER + io.stat.isSubHeaderError := stateNext === STATE_ERROR & stateCurr === STATE_SUBMSG_HEADER + io.stat.isPayloadError := stateNext === STATE_ERROR & stateCurr === STATE_PAYLOAD_DATA + io.stat.isSubTailError := stateNext === STATE_ERROR & stateCurr === STATE_SUBMSG_TAIL + io.stat.isCRCError := stateNext === STATE_ERROR & stateCurr === STATE_CRC + io.stat.isFinish := stateNext === STATE_IDLE & stateCurr === STATE_CRC + io.stat.isRecByteAck := io.rec.fire +} + + + diff --git a/src/main/scala/backBoard/shin/SlaveSendGen.scala b/src/main/scala/backBoard/shin/SlaveSendGen.scala index 984abe7..ee36a3b 100644 --- a/src/main/scala/backBoard/shin/SlaveSendGen.scala +++ b/src/main/scala/backBoard/shin/SlaveSendGen.scala @@ -1,190 +1,190 @@ -package BACK - -import chisel3._ -import chisel3.util._ - - -class SubMsgTxInfo extends SubMsgHeader{ - val source = UInt(2.W) -} - - -class SlaveSendGenIO extends Bundle{ - val data = Vec(2, Flipped( Decoupled(UInt(8.W)) ) ) - - val frameReq = Flipped(Decoupled( new FrameHeader )) - val subMsgHeadReq = Flipped(Decoupled( new SubMsgTxInfo )) - val subMsgTailReq = Flipped(Decoupled( new SubMsgTail )) - - val send = Decoupled(new AXIS_Bundle(8)) - - val stateCurr = Output(UInt(3.W)) - - val flush = Input(Bool()) -} - - - - -class SlaveSendGen extends Module with RequireAsyncReset{ - val io: SlaveSendGenIO = IO(new SlaveSendGenIO) - - val crc = Module(new crc32_8) - - val FRAME_STYLE_COMMON = 0.U - val FRAME_STYLE_PROBE = 1.U - - val STATE_IDLE = 0.U //空闲 - val STATE_FRAME_HEADER = 1.U //长度/ /保留2bits //包类型 - val STATE_SUBMSG_HEADER = 2.U - val STATE_SUBMSG_DATA = 3.U - val STATE_SUBMSG_TAIL = 4.U - val STATE_CRC = 5.U //CRC校验 - val STATE_WAIT = 6.U - - - val stateNext = Wire(UInt(3.W)) - val stateCurr = RegNext(stateNext, STATE_IDLE); io.stateCurr := stateCurr - - crc.io.isEnable := io.send.fire & ( - stateCurr === STATE_FRAME_HEADER | - stateCurr === STATE_SUBMSG_HEADER | - stateCurr === STATE_SUBMSG_DATA | - stateCurr === STATE_SUBMSG_TAIL - ) - crc.io.flush := stateCurr === STATE_IDLE | io.flush - - val frameInfo = RegInit(0.U.asTypeOf(new FrameHeader)) - - val subMsgHeadInfo = RegInit(0.U.asTypeOf(new SubMsgTxInfo)) - val subMsgTailInfo = RegInit(0.U.asTypeOf(new SubMsgTail)) - - when( io.frameReq.fire ){ - frameInfo := io.frameReq.bits - } - - when( io.subMsgHeadReq.fire ){ - subMsgHeadInfo := io.subMsgHeadReq.bits - } - - when( io.subMsgTailReq.fire ){ - subMsgTailInfo := io.subMsgTailReq.bits - } - - val lengthCnt = RegInit(0.U(12.W)) - val frameLenCnt = RegInit(0.U(12.W)) - - when( io.send.fire ){ - when( stateCurr === STATE_FRAME_HEADER ){ - frameLenCnt := 0.U - } .elsewhen( stateCurr === STATE_SUBMSG_HEADER || stateCurr === STATE_SUBMSG_DATA || stateCurr === STATE_SUBMSG_TAIL ){ - frameLenCnt := frameLenCnt + 1.U - } - } - - when( stateCurr =/= stateNext ){ - lengthCnt := 0.U - } .elsewhen(io.send.fire){ - lengthCnt := lengthCnt + 1.U - } - - io.frameReq.ready := true.B - io.subMsgHeadReq.ready := stateCurr =/= STATE_SUBMSG_HEADER & stateNext === STATE_SUBMSG_HEADER - io.subMsgTailReq.ready := stateCurr =/= STATE_SUBMSG_TAIL & stateNext === STATE_SUBMSG_TAIL - assert( ~(io.subMsgTailReq.ready & ~io.subMsgTailReq.valid) ) - - - stateNext := - Mux( io.flush, STATE_IDLE, - Mux1H(Seq( - (stateCurr === STATE_IDLE) -> Mux( io.frameReq.fire, STATE_FRAME_HEADER, STATE_IDLE ), - (stateCurr === STATE_FRAME_HEADER) -> Mux( io.send.fire, Mux( lengthCnt === (4-1).U, Mux( - frameInfo.frameStyle === FRAME_STYLE_COMMON, - Mux(io.subMsgHeadReq.valid, STATE_SUBMSG_HEADER, STATE_WAIT), - STATE_CRC ), - STATE_FRAME_HEADER), STATE_FRAME_HEADER ), - (stateCurr === STATE_SUBMSG_HEADER) -> Mux( io.send.fire, Mux( lengthCnt === (6-1).U, STATE_SUBMSG_DATA, STATE_SUBMSG_HEADER), STATE_SUBMSG_HEADER), - - (stateCurr === STATE_SUBMSG_DATA) -> Mux( io.send.fire, - Mux( lengthCnt === subMsgHeadInfo.length-1.U, STATE_SUBMSG_TAIL, STATE_SUBMSG_DATA ), //已经发送完成该子报文 - STATE_SUBMSG_DATA ), - - (stateCurr === STATE_SUBMSG_TAIL) -> Mux( io.send.fire, - Mux( lengthCnt === (2-1).U, //已经发送完成该子报文尾 - Mux( frameLenCnt === frameInfo.frameLenAim -1.U, STATE_CRC, //主报文长度达到, 进CRC - Mux( io.subMsgHeadReq.valid, STATE_SUBMSG_HEADER, STATE_WAIT ) ), //主报文长度未到,进下一个子报文 - STATE_SUBMSG_TAIL - ), STATE_SUBMSG_TAIL ), - - (stateCurr === STATE_CRC) -> Mux( io.send.fire, Mux( lengthCnt === (4-1).U, STATE_IDLE, STATE_CRC ), STATE_CRC), - (stateCurr === STATE_WAIT) -> Mux( io.subMsgHeadReq.valid, STATE_SUBMSG_HEADER, STATE_WAIT), - )) - ) - - io.data(0).ready := io.send.fire & (stateCurr === STATE_SUBMSG_DATA) & (subMsgHeadInfo.source === 0.U) - io.data(1).ready := io.send.fire & (stateCurr === STATE_SUBMSG_DATA) & (subMsgHeadInfo.source === 1.U) - - assert( ~(io.data(0).ready & ~io.data(0).valid) ) - assert( ~(io.data(1).ready & ~io.data(1).valid) ) - - - io.send.valid := - (stateCurr === STATE_FRAME_HEADER) | - (stateCurr === STATE_SUBMSG_HEADER) | - (stateCurr === STATE_SUBMSG_DATA & ( (io.data(0).valid & subMsgHeadInfo.source === 0.U) | (io.data(1).valid & subMsgHeadInfo.source === 1.U) )) | - (stateCurr === STATE_SUBMSG_TAIL) | - (stateCurr === STATE_CRC) - - val tdata_frame_header = Mux1H(Seq( - (lengthCnt === 0.U) -> frameInfo.frameLenAim(11,4), - (lengthCnt === 1.U) -> Cat( frameInfo.frameLenAim(3,0), 0.U(2.W), frameInfo.frameStyle), - (lengthCnt === 2.U) -> frameInfo.frameInfo(15,8), - (lengthCnt === 3.U) -> frameInfo.frameInfo( 7,0), - )) - - val tdata_submsg_header = Mux1H(Seq( - (lengthCnt === 0.U) -> subMsgHeadInfo.devIndex(13,6), - (lengthCnt === 1.U) -> Cat( subMsgHeadInfo.devIndex(5,0), subMsgHeadInfo.style), - (lengthCnt === 2.U) -> subMsgHeadInfo.address(15,8), - (lengthCnt === 3.U) -> subMsgHeadInfo.address(7,0), - (lengthCnt === 4.U) -> Cat(subMsgHeadInfo.operator, subMsgHeadInfo.length(11,8)), - (lengthCnt === 5.U) -> subMsgHeadInfo.length(7,0), - )) - - val tdata_submsg_data = Mux1H(Seq( - (subMsgHeadInfo.source === 0.U) -> io.data(0).bits, - (subMsgHeadInfo.source === 1.U) -> io.data(1).bits, - )) - - val tdata_submsg_tail = Mux1H(Seq( - (lengthCnt === 0.U) -> subMsgTailInfo.workCnt(15,8), - (lengthCnt === 1.U) -> subMsgTailInfo.workCnt( 7,0), - )) - - crc.io.dataIn := Mux1H(Seq( - (stateCurr === STATE_FRAME_HEADER) -> tdata_frame_header, - (stateCurr === STATE_SUBMSG_HEADER) -> tdata_submsg_header, - (stateCurr === STATE_SUBMSG_DATA) -> tdata_submsg_data, - (stateCurr === STATE_SUBMSG_TAIL) -> tdata_submsg_tail, - )) - - - val tdata_crc = Mux1H(Seq( - (lengthCnt === 0.U) -> crc.io.crc(31,24), - (lengthCnt === 1.U) -> crc.io.crc(23,16), - (lengthCnt === 2.U) -> crc.io.crc(15, 8), - (lengthCnt === 3.U) -> crc.io.crc( 7, 0), - )) - - io.send.bits.tdata := Mux1H(Seq( - (stateCurr === STATE_FRAME_HEADER) -> tdata_frame_header, - (stateCurr === STATE_SUBMSG_HEADER) -> tdata_submsg_header, - (stateCurr === STATE_SUBMSG_DATA) -> tdata_submsg_data, - (stateCurr === STATE_SUBMSG_TAIL) -> tdata_submsg_tail, - (stateCurr === STATE_CRC) -> tdata_crc, - )) - - io.send.bits.tuser := false.B - io.send.bits.tlast := (stateCurr === STATE_CRC & stateNext === STATE_IDLE) - +package BACK + +import chisel3._ +import chisel3.util._ + + +class SubMsgTxInfo extends SubMsgHeader{ + val source = UInt(2.W) +} + + +class SlaveSendGenIO extends Bundle{ + val data = Vec(2, Flipped( Decoupled(UInt(8.W)) ) ) + + val frameReq = Flipped(Decoupled( new FrameHeader )) + val subMsgHeadReq = Flipped(Decoupled( new SubMsgTxInfo )) + val subMsgTailReq = Flipped(Decoupled( new SubMsgTail )) + + val send = Decoupled(new AXIS_Bundle(8)) + + val stateCurr = Output(UInt(3.W)) + + val flush = Input(Bool()) +} + + + + +class SlaveSendGen extends Module with RequireAsyncReset{ + val io: SlaveSendGenIO = IO(new SlaveSendGenIO) + + val crc = Module(new crc32_8) + + val FRAME_STYLE_COMMON = 0.U + val FRAME_STYLE_PROBE = 1.U + + val STATE_IDLE = 0.U //空闲 + val STATE_FRAME_HEADER = 1.U //长度/ /保留2bits //包类型 + val STATE_SUBMSG_HEADER = 2.U + val STATE_SUBMSG_DATA = 3.U + val STATE_SUBMSG_TAIL = 4.U + val STATE_CRC = 5.U //CRC校验 + val STATE_WAIT = 6.U + + + val stateNext = Wire(UInt(3.W)) + val stateCurr = RegNext(stateNext, STATE_IDLE); io.stateCurr := stateCurr + + crc.io.isEnable := io.send.fire & ( + stateCurr === STATE_FRAME_HEADER | + stateCurr === STATE_SUBMSG_HEADER | + stateCurr === STATE_SUBMSG_DATA | + stateCurr === STATE_SUBMSG_TAIL + ) + crc.io.flush := stateCurr === STATE_IDLE | io.flush + + val frameInfo = RegInit(0.U.asTypeOf(new FrameHeader)) + + val subMsgHeadInfo = RegInit(0.U.asTypeOf(new SubMsgTxInfo)) + val subMsgTailInfo = RegInit(0.U.asTypeOf(new SubMsgTail)) + + when( io.frameReq.fire ){ + frameInfo := io.frameReq.bits + } + + when( io.subMsgHeadReq.fire ){ + subMsgHeadInfo := io.subMsgHeadReq.bits + } + + when( io.subMsgTailReq.fire ){ + subMsgTailInfo := io.subMsgTailReq.bits + } + + val lengthCnt = RegInit(0.U(12.W)) + val frameLenCnt = RegInit(0.U(12.W)) + + when( io.send.fire ){ + when( stateCurr === STATE_FRAME_HEADER ){ + frameLenCnt := 0.U + } .elsewhen( stateCurr === STATE_SUBMSG_HEADER || stateCurr === STATE_SUBMSG_DATA || stateCurr === STATE_SUBMSG_TAIL ){ + frameLenCnt := frameLenCnt + 1.U + } + } + + when( stateCurr =/= stateNext ){ + lengthCnt := 0.U + } .elsewhen(io.send.fire){ + lengthCnt := lengthCnt + 1.U + } + + io.frameReq.ready := true.B + io.subMsgHeadReq.ready := stateCurr =/= STATE_SUBMSG_HEADER & stateNext === STATE_SUBMSG_HEADER + io.subMsgTailReq.ready := stateCurr =/= STATE_SUBMSG_TAIL & stateNext === STATE_SUBMSG_TAIL + assert( ~(io.subMsgTailReq.ready & ~io.subMsgTailReq.valid) ) + + + stateNext := + Mux( io.flush, STATE_IDLE, + Mux1H(Seq( + (stateCurr === STATE_IDLE) -> Mux( io.frameReq.fire, STATE_FRAME_HEADER, STATE_IDLE ), + (stateCurr === STATE_FRAME_HEADER) -> Mux( io.send.fire, Mux( lengthCnt === (4-1).U, Mux( + frameInfo.frameStyle === FRAME_STYLE_COMMON, + Mux(io.subMsgHeadReq.valid, STATE_SUBMSG_HEADER, STATE_WAIT), + STATE_CRC ), + STATE_FRAME_HEADER), STATE_FRAME_HEADER ), + (stateCurr === STATE_SUBMSG_HEADER) -> Mux( io.send.fire, Mux( lengthCnt === (6-1).U, STATE_SUBMSG_DATA, STATE_SUBMSG_HEADER), STATE_SUBMSG_HEADER), + + (stateCurr === STATE_SUBMSG_DATA) -> Mux( io.send.fire, + Mux( lengthCnt === subMsgHeadInfo.length-1.U, STATE_SUBMSG_TAIL, STATE_SUBMSG_DATA ), //已经发送完成该子报文 + STATE_SUBMSG_DATA ), + + (stateCurr === STATE_SUBMSG_TAIL) -> Mux( io.send.fire, + Mux( lengthCnt === (2-1).U, //已经发送完成该子报文尾 + Mux( frameLenCnt === frameInfo.frameLenAim -1.U, STATE_CRC, //主报文长度达到, 进CRC + Mux( io.subMsgHeadReq.valid, STATE_SUBMSG_HEADER, STATE_WAIT ) ), //主报文长度未到,进下一个子报文 + STATE_SUBMSG_TAIL + ), STATE_SUBMSG_TAIL ), + + (stateCurr === STATE_CRC) -> Mux( io.send.fire, Mux( lengthCnt === (4-1).U, STATE_IDLE, STATE_CRC ), STATE_CRC), + (stateCurr === STATE_WAIT) -> Mux( io.subMsgHeadReq.valid, STATE_SUBMSG_HEADER, STATE_WAIT), + )) + ) + + io.data(0).ready := io.send.fire & (stateCurr === STATE_SUBMSG_DATA) & (subMsgHeadInfo.source === 0.U) + io.data(1).ready := io.send.fire & (stateCurr === STATE_SUBMSG_DATA) & (subMsgHeadInfo.source === 1.U) + + assert( ~(io.data(0).ready & ~io.data(0).valid) ) + assert( ~(io.data(1).ready & ~io.data(1).valid) ) + + + io.send.valid := + (stateCurr === STATE_FRAME_HEADER) | + (stateCurr === STATE_SUBMSG_HEADER) | + (stateCurr === STATE_SUBMSG_DATA & ( (io.data(0).valid & subMsgHeadInfo.source === 0.U) | (io.data(1).valid & subMsgHeadInfo.source === 1.U) )) | + (stateCurr === STATE_SUBMSG_TAIL) | + (stateCurr === STATE_CRC) + + val tdata_frame_header = Mux1H(Seq( + (lengthCnt === 0.U) -> frameInfo.frameLenAim(11,4), + (lengthCnt === 1.U) -> Cat( frameInfo.frameLenAim(3,0), 0.U(2.W), frameInfo.frameStyle), + (lengthCnt === 2.U) -> frameInfo.frameInfo(15,8), + (lengthCnt === 3.U) -> frameInfo.frameInfo( 7,0), + )) + + val tdata_submsg_header = Mux1H(Seq( + (lengthCnt === 0.U) -> subMsgHeadInfo.devIndex(13,6), + (lengthCnt === 1.U) -> Cat( subMsgHeadInfo.devIndex(5,0), subMsgHeadInfo.style), + (lengthCnt === 2.U) -> subMsgHeadInfo.address(15,8), + (lengthCnt === 3.U) -> subMsgHeadInfo.address(7,0), + (lengthCnt === 4.U) -> Cat(subMsgHeadInfo.operator, subMsgHeadInfo.length(11,8)), + (lengthCnt === 5.U) -> subMsgHeadInfo.length(7,0), + )) + + val tdata_submsg_data = Mux1H(Seq( + (subMsgHeadInfo.source === 0.U) -> io.data(0).bits, + (subMsgHeadInfo.source === 1.U) -> io.data(1).bits, + )) + + val tdata_submsg_tail = Mux1H(Seq( + (lengthCnt === 0.U) -> subMsgTailInfo.workCnt(15,8), + (lengthCnt === 1.U) -> subMsgTailInfo.workCnt( 7,0), + )) + + crc.io.dataIn := Mux1H(Seq( + (stateCurr === STATE_FRAME_HEADER) -> tdata_frame_header, + (stateCurr === STATE_SUBMSG_HEADER) -> tdata_submsg_header, + (stateCurr === STATE_SUBMSG_DATA) -> tdata_submsg_data, + (stateCurr === STATE_SUBMSG_TAIL) -> tdata_submsg_tail, + )) + + + val tdata_crc = Mux1H(Seq( + (lengthCnt === 0.U) -> crc.io.crc(31,24), + (lengthCnt === 1.U) -> crc.io.crc(23,16), + (lengthCnt === 2.U) -> crc.io.crc(15, 8), + (lengthCnt === 3.U) -> crc.io.crc( 7, 0), + )) + + io.send.bits.tdata := Mux1H(Seq( + (stateCurr === STATE_FRAME_HEADER) -> tdata_frame_header, + (stateCurr === STATE_SUBMSG_HEADER) -> tdata_submsg_header, + (stateCurr === STATE_SUBMSG_DATA) -> tdata_submsg_data, + (stateCurr === STATE_SUBMSG_TAIL) -> tdata_submsg_tail, + (stateCurr === STATE_CRC) -> tdata_crc, + )) + + io.send.bits.tuser := false.B + io.send.bits.tlast := (stateCurr === STATE_CRC & stateNext === STATE_IDLE) + } \ No newline at end of file diff --git a/src/main/scala/backBoard/shin/SpiInterface.scala b/src/main/scala/backBoard/shin/SpiInterface.scala index 1edffa7..c867c82 100644 --- a/src/main/scala/backBoard/shin/SpiInterface.scala +++ b/src/main/scala/backBoard/shin/SpiInterface.scala @@ -1,239 +1,239 @@ -package BACK - -import chisel3._ -import chisel3.util._ - -class QSPIInterfaceIO extends Bundle{ - val sck = Input(Bool()) - val mosi = Input(UInt(4.W)) - val miso = Output(UInt(4.W)) - val isDirIn = Output(Bool()) - val csn = Input(Bool()) -} - - -class SSPIInterfaceIO extends Bundle{ - val sck = Input(Bool()) - val mosi = Input(Bool()) - val miso = Output(Bool()) - val csn = Input(Bool()) -} - -class RegAccessInterfaceIO extends Bundle{ - val addrw = Output(UInt(16.W)) - val addrr = Output(UInt(16.W)) - val dataw = Output( UInt(8.W) ) - val datar = Input( UInt(8.W) ) - val isEnW = Output(Bool()) - val isEnR = Output(Bool()) -} - -abstract class SpiInterfaceBase extends Module with RequireAsyncReset{ - val io = IO(new RegAccessInterfaceIO) - - val sck = Wire(Bool()) - val csn = Wire(Bool()) - - - //数据信号相对SCK的稳定应该由外部主机保证,因此认为SCK采样时刻,数据都是稳定正确的 - val shiftSCK = ShiftRegisters(sck, 3, false.B, true.B) - val shiftCSn = ShiftRegisters(csn, 3, true.B, true.B) - - - - val isSckPosedge = ~shiftSCK(2) & shiftSCK(1) - val isSckNegedge = shiftSCK(2) & ~shiftSCK(1) - val isSckPosedgeNext = ShiftRegisters(isSckPosedge, 2, false.B, true.B) - - val exRego = RegInit(0.U(8.W)) - val exRegi = RegInit(0.U(8.W)) - - val addrw = RegInit(0.U(16.W)) - val addrr = RegInit(0.U(16.W)) - val spiCmd = RegInit(0.U(1.W)) - - val isSpiWrite = spiCmd === 0.U - val isSpiRead = spiCmd === 1.U - - val bitSel = RegInit(0.U(3.W)) - val bitSelNext = RegNext(bitSel, 0.U(3.W)) - val byteSel = RegInit(0.U(12.W)) - val byteSelNext = RegNext(byteSel, 0.U(12.W)) - - io.isEnW := isSckPosedgeNext(0) & ~shiftCSn(2) & bitSelNext.andR & isSpiWrite & byteSelNext >= 3.U - - io.dataw := exRegi - io.addrr := addrr - io.addrw := addrw - - when( shiftCSn(2) & ~shiftCSn(1) ){ - byteSel := 0.U - } .elsewhen( isSckPosedge & ~shiftCSn(1) ){ - when( bitSel.andR ){ - byteSel := byteSel + 1.U - } - } - - -} - -class SSpiInterface extends SpiInterfaceBase{ - val spi = IO(new SSPIInterfaceIO) - val shiftMOSI = ShiftRegisters(spi.mosi, 3, false.B, true.B) - - sck := spi.sck - csn := spi.csn - - io.isEnR := - (isSckPosedge & ~shiftCSn(1) & bitSel === 0.U & shiftMOSI(1) === 1.U & byteSel === 2.U ) | - (isSckPosedge & ~shiftCSn(1) & bitSel === 0.U & isSpiRead & byteSel >= 3.U ) - - when( shiftCSn(2) & ~shiftCSn(1) || (~shiftCSn(2) & shiftCSn(1)) ){ //CS下跳或上跳 - spiCmd := 0.U - } .elsewhen( isSckPosedge & ~shiftCSn(1) & byteSel === 2.U & bitSel === 0.U ){ //CS为低,且SCK上跳的第0byte - spiCmd := shiftMOSI(1) - } - - - spi.miso := exRego.extract(7) - - when( shiftCSn(2) & ~shiftCSn(1) ){ - bitSel := 0.U - } .elsewhen( isSckPosedge & ~shiftCSn(1) ){ - bitSel := bitSel + 1.U - } - - //输入看SCK上升沿 - when( isSckPosedge & ~shiftCSn(1) ){ - when( bitSel === 0.U ){ - exRegi := Cat( 0.U, shiftMOSI(1) ) - }.otherwise{ - exRegi := Cat( exRegi(6,0), shiftMOSI(1) ) - } - } - - //输出在SCK上升沿准备数据 - when( shiftCSn(2) & ~shiftCSn(1) ){ //CS下跳 - exRego := 0.U //第一个byte 地址0 - } .elsewhen( isSckPosedge & ~shiftCSn(1) ){ - when( bitSel.andR ){ - when((byteSel === 0.U || byteSel === 1.U) ){ - exRego := 0.U //地址1,cmd - } .elsewhen( isSpiRead ){ - exRego := io.datar - } - }.otherwise{ - exRego := exRego << 1 - } - } - - when( shiftCSn(2) & ~shiftCSn(1) ){ //CS下跳 - addrr := 0.U - } .elsewhen(isSckPosedge & ~shiftCSn(1) & bitSel.andR & byteSel === 0.U){ //CS为低,且SCK上跳的第0byte - addrr := Cat( exRegi(6,0), shiftMOSI(1) ) - } .elsewhen(isSckPosedge & ~shiftCSn(1) & bitSel.andR & byteSel === 1.U) {//CS为低,且SCK上跳的第0byte - addrr := Cat(addrr(7,0), exRegi(6,0), shiftMOSI(1)) - } .otherwise{ // byteSel > 1.U - when( isSckPosedge & byteSel >= 2.U & bitSel === 0.U ){ - addrr := addrr + 1.U - } - } - - when( shiftCSn(2) & ~shiftCSn(1) ){ //CS下跳 - addrw := 0.U - } .elsewhen(isSckPosedge & ~shiftCSn(1) & bitSel.andR & byteSel === 0.U){ //CS为低,且SCK上跳的第0byte - addrw := Cat( exRegi(6,0), shiftMOSI(1) ) - } .elsewhen(isSckPosedge & ~shiftCSn(1) & bitSel.andR & byteSel === 1.U) {//CS为低,且SCK上跳的第0byte - addrw := Cat(addrw(7,0), exRegi(6,0), shiftMOSI(1) ) - } .otherwise{ // byteSel > 1.U - when( isSckPosedgeNext(0) & byteSelNext >= 3.U & bitSelNext.andR ){ - addrw := addrw + 1.U - } - } - -} - -class QSpiInterface(edge: Boolean) extends SpiInterfaceBase{ - val qspi = IO(new QSPIInterfaceIO) - val shiftMOSI = ShiftRegisters(qspi.mosi, 3, 0.U(4.W), true.B) - - sck := qspi.sck - csn := qspi.csn - qspi.miso := exRego(7, 4) - qspi.isDirIn := ~isSpiRead - - - io.isEnR := - (isSckPosedge & ~shiftCSn(1) & bitSel === 0.U & shiftMOSI(1) === "b1000".U & byteSel === 2.U ) | - (isSckPosedge & ~shiftCSn(1) & bitSel === 0.U & isSpiRead & byteSel >= 3.U) - - - - - when( (shiftCSn(2) & ~shiftCSn(1)) || (~shiftCSn(2) & shiftCSn(1)) ){ //CS下跳或上跳 - spiCmd := 0.U - } .elsewhen( isSckPosedge & ~shiftCSn(1) & byteSel === 2.U & bitSel === 0.U ){ //CS为低,且SCK上跳的第0byte - spiCmd := shiftMOSI(1).extract(3) - } - - when( shiftCSn(2) & ~shiftCSn(1) ){ - bitSel := 0.U - } .elsewhen( isSckPosedge & ~shiftCSn(1) ){ - bitSel := ~bitSel - } - - //输入看SCK上升沿 - when( isSckPosedge & ~shiftCSn(1) ){ - when( bitSel === 0.U ){ - exRegi := Cat( 0.U, shiftMOSI(1) ) - }.otherwise{ - exRegi := Cat( exRegi(3,0), shiftMOSI(1) ) - } - } - - //输出在SCK XX沿准备数据 - when( shiftCSn(2) & ~shiftCSn(1) ){ //CS下跳 - exRego := 0.U //第一个byte 地址0 - } .elsewhen( - (if( edge ) {isSckPosedge} else {isSckNegedge}) - & ~shiftCSn(1) - ){ - when( (if( edge ) { bitSel.andR } else { bitSel === 0.U }) ){ - when( byteSel === 0.U || byteSel === 1.U || ( if( edge ) { false.B } else { byteSel === 2.U } ) ){ - exRego := 0.U //地址1,cmd - } .elsewhen( isSpiRead ){ - exRego := io.datar - } - }.otherwise{ - exRego := exRego << 4 - } - } - - - when( shiftCSn(2) & ~shiftCSn(1) ){ //CS下跳 - addrr := 0.U - } .elsewhen(isSckPosedge & ~shiftCSn(1) & bitSel.andR & byteSel === 0.U){ //CS为低,且SCK上跳的第0byte - addrr := Cat( exRegi(3,0), shiftMOSI(1) ) - } .elsewhen(isSckPosedge & ~shiftCSn(1) & bitSel.andR & byteSel === 1.U) {//CS为低,且SCK上跳的第0byte - addrr := Cat(addrr(7,0), exRegi(3,0), shiftMOSI(1)) - } .otherwise{ // byteSel > 1.U - when( isSckPosedge & byteSel >= 2.U & bitSel === 0.U ){ - addrr := addrr + 1.U - } - } - - when( shiftCSn(2) & ~shiftCSn(1) ){ //CS下跳 - addrw := 0.U - } .elsewhen(isSckPosedge & ~shiftCSn(1) & bitSel.andR & byteSel === 0.U){ //CS为低,且SCK上跳的第0byte - addrw := Cat( exRegi(3,0), shiftMOSI(1) ) - } .elsewhen(isSckPosedge & ~shiftCSn(1) & bitSel.andR & byteSel === 1.U) {//CS为低,且SCK上跳的第0byte - addrw := Cat(addrw(7,0), exRegi(3,0), shiftMOSI(1) ) - } .otherwise{ // byteSel > 1.U - when( isSckPosedgeNext(0) & byteSelNext >= 3.U & bitSelNext.andR ){ - addrw := addrw + 1.U - } - } - -} - - +package BACK + +import chisel3._ +import chisel3.util._ + +class QSPIInterfaceIO extends Bundle{ + val sck = Input(Bool()) + val mosi = Input(UInt(4.W)) + val miso = Output(UInt(4.W)) + val isDirIn = Output(Bool()) + val csn = Input(Bool()) +} + + +class SSPIInterfaceIO extends Bundle{ + val sck = Input(Bool()) + val mosi = Input(Bool()) + val miso = Output(Bool()) + val csn = Input(Bool()) +} + +class RegAccessInterfaceIO extends Bundle{ + val addrw = Output(UInt(16.W)) + val addrr = Output(UInt(16.W)) + val dataw = Output( UInt(8.W) ) + val datar = Input( UInt(8.W) ) + val isEnW = Output(Bool()) + val isEnR = Output(Bool()) +} + +abstract class SpiInterfaceBase extends Module with RequireAsyncReset{ + val io = IO(new RegAccessInterfaceIO) + + val sck = Wire(Bool()) + val csn = Wire(Bool()) + + + //数据信号相对SCK的稳定应该由外部主机保证,因此认为SCK采样时刻,数据都是稳定正确的 + val shiftSCK = ShiftRegisters(sck, 3, false.B, true.B) + val shiftCSn = ShiftRegisters(csn, 3, true.B, true.B) + + + + val isSckPosedge = ~shiftSCK(2) & shiftSCK(1) + val isSckNegedge = shiftSCK(2) & ~shiftSCK(1) + val isSckPosedgeNext = ShiftRegisters(isSckPosedge, 2, false.B, true.B) + + val exRego = RegInit(0.U(8.W)) + val exRegi = RegInit(0.U(8.W)) + + val addrw = RegInit(0.U(16.W)) + val addrr = RegInit(0.U(16.W)) + val spiCmd = RegInit(0.U(1.W)) + + val isSpiWrite = spiCmd === 0.U + val isSpiRead = spiCmd === 1.U + + val bitSel = RegInit(0.U(3.W)) + val bitSelNext = RegNext(bitSel, 0.U(3.W)) + val byteSel = RegInit(0.U(12.W)) + val byteSelNext = RegNext(byteSel, 0.U(12.W)) + + io.isEnW := isSckPosedgeNext(0) & ~shiftCSn(2) & bitSelNext.andR & isSpiWrite & byteSelNext >= 3.U + + io.dataw := exRegi + io.addrr := addrr + io.addrw := addrw + + when( shiftCSn(2) & ~shiftCSn(1) ){ + byteSel := 0.U + } .elsewhen( isSckPosedge & ~shiftCSn(1) ){ + when( bitSel.andR ){ + byteSel := byteSel + 1.U + } + } + + +} + +class SSpiInterface extends SpiInterfaceBase{ + val spi = IO(new SSPIInterfaceIO) + val shiftMOSI = ShiftRegisters(spi.mosi, 3, false.B, true.B) + + sck := spi.sck + csn := spi.csn + + io.isEnR := + (isSckPosedge & ~shiftCSn(1) & bitSel === 0.U & shiftMOSI(1) === 1.U & byteSel === 2.U ) | + (isSckPosedge & ~shiftCSn(1) & bitSel === 0.U & isSpiRead & byteSel >= 3.U ) + + when( shiftCSn(2) & ~shiftCSn(1) || (~shiftCSn(2) & shiftCSn(1)) ){ //CS下跳或上跳 + spiCmd := 0.U + } .elsewhen( isSckPosedge & ~shiftCSn(1) & byteSel === 2.U & bitSel === 0.U ){ //CS为低,且SCK上跳的第0byte + spiCmd := shiftMOSI(1) + } + + + spi.miso := exRego.extract(7) + + when( shiftCSn(2) & ~shiftCSn(1) ){ + bitSel := 0.U + } .elsewhen( isSckPosedge & ~shiftCSn(1) ){ + bitSel := bitSel + 1.U + } + + //输入看SCK上升沿 + when( isSckPosedge & ~shiftCSn(1) ){ + when( bitSel === 0.U ){ + exRegi := Cat( 0.U, shiftMOSI(1) ) + }.otherwise{ + exRegi := Cat( exRegi(6,0), shiftMOSI(1) ) + } + } + + //输出在SCK上升沿准备数据 + when( shiftCSn(2) & ~shiftCSn(1) ){ //CS下跳 + exRego := 0.U //第一个byte 地址0 + } .elsewhen( isSckPosedge & ~shiftCSn(1) ){ + when( bitSel.andR ){ + when((byteSel === 0.U || byteSel === 1.U) ){ + exRego := 0.U //地址1,cmd + } .elsewhen( isSpiRead ){ + exRego := io.datar + } + }.otherwise{ + exRego := exRego << 1 + } + } + + when( shiftCSn(2) & ~shiftCSn(1) ){ //CS下跳 + addrr := 0.U + } .elsewhen(isSckPosedge & ~shiftCSn(1) & bitSel.andR & byteSel === 0.U){ //CS为低,且SCK上跳的第0byte + addrr := Cat( exRegi(6,0), shiftMOSI(1) ) + } .elsewhen(isSckPosedge & ~shiftCSn(1) & bitSel.andR & byteSel === 1.U) {//CS为低,且SCK上跳的第0byte + addrr := Cat(addrr(7,0), exRegi(6,0), shiftMOSI(1)) + } .otherwise{ // byteSel > 1.U + when( isSckPosedge & byteSel >= 2.U & bitSel === 0.U ){ + addrr := addrr + 1.U + } + } + + when( shiftCSn(2) & ~shiftCSn(1) ){ //CS下跳 + addrw := 0.U + } .elsewhen(isSckPosedge & ~shiftCSn(1) & bitSel.andR & byteSel === 0.U){ //CS为低,且SCK上跳的第0byte + addrw := Cat( exRegi(6,0), shiftMOSI(1) ) + } .elsewhen(isSckPosedge & ~shiftCSn(1) & bitSel.andR & byteSel === 1.U) {//CS为低,且SCK上跳的第0byte + addrw := Cat(addrw(7,0), exRegi(6,0), shiftMOSI(1) ) + } .otherwise{ // byteSel > 1.U + when( isSckPosedgeNext(0) & byteSelNext >= 3.U & bitSelNext.andR ){ + addrw := addrw + 1.U + } + } + +} + +class QSpiInterface(edge: Boolean) extends SpiInterfaceBase{ + val qspi = IO(new QSPIInterfaceIO) + val shiftMOSI = ShiftRegisters(qspi.mosi, 3, 0.U(4.W), true.B) + + sck := qspi.sck + csn := qspi.csn + qspi.miso := exRego(7, 4) + qspi.isDirIn := ~isSpiRead + + + io.isEnR := + (isSckPosedge & ~shiftCSn(1) & bitSel === 0.U & shiftMOSI(1) === "b1000".U & byteSel === 2.U ) | + (isSckPosedge & ~shiftCSn(1) & bitSel === 0.U & isSpiRead & byteSel >= 3.U) + + + + + when( (shiftCSn(2) & ~shiftCSn(1)) || (~shiftCSn(2) & shiftCSn(1)) ){ //CS下跳或上跳 + spiCmd := 0.U + } .elsewhen( isSckPosedge & ~shiftCSn(1) & byteSel === 2.U & bitSel === 0.U ){ //CS为低,且SCK上跳的第0byte + spiCmd := shiftMOSI(1).extract(3) + } + + when( shiftCSn(2) & ~shiftCSn(1) ){ + bitSel := 0.U + } .elsewhen( isSckPosedge & ~shiftCSn(1) ){ + bitSel := ~bitSel + } + + //输入看SCK上升沿 + when( isSckPosedge & ~shiftCSn(1) ){ + when( bitSel === 0.U ){ + exRegi := Cat( 0.U, shiftMOSI(1) ) + }.otherwise{ + exRegi := Cat( exRegi(3,0), shiftMOSI(1) ) + } + } + + //输出在SCK XX沿准备数据 + when( shiftCSn(2) & ~shiftCSn(1) ){ //CS下跳 + exRego := 0.U //第一个byte 地址0 + } .elsewhen( + (if( edge ) {isSckPosedge} else {isSckNegedge}) + & ~shiftCSn(1) + ){ + when( (if( edge ) { bitSel.andR } else { bitSel === 0.U }) ){ + when( byteSel === 0.U || byteSel === 1.U || ( if( edge ) { false.B } else { byteSel === 2.U } ) ){ + exRego := 0.U //地址1,cmd + } .elsewhen( isSpiRead ){ + exRego := io.datar + } + }.otherwise{ + exRego := exRego << 4 + } + } + + + when( shiftCSn(2) & ~shiftCSn(1) ){ //CS下跳 + addrr := 0.U + } .elsewhen(isSckPosedge & ~shiftCSn(1) & bitSel.andR & byteSel === 0.U){ //CS为低,且SCK上跳的第0byte + addrr := Cat( exRegi(3,0), shiftMOSI(1) ) + } .elsewhen(isSckPosedge & ~shiftCSn(1) & bitSel.andR & byteSel === 1.U) {//CS为低,且SCK上跳的第0byte + addrr := Cat(addrr(7,0), exRegi(3,0), shiftMOSI(1)) + } .otherwise{ // byteSel > 1.U + when( isSckPosedge & byteSel >= 2.U & bitSel === 0.U ){ + addrr := addrr + 1.U + } + } + + when( shiftCSn(2) & ~shiftCSn(1) ){ //CS下跳 + addrw := 0.U + } .elsewhen(isSckPosedge & ~shiftCSn(1) & bitSel.andR & byteSel === 0.U){ //CS为低,且SCK上跳的第0byte + addrw := Cat( exRegi(3,0), shiftMOSI(1) ) + } .elsewhen(isSckPosedge & ~shiftCSn(1) & bitSel.andR & byteSel === 1.U) {//CS为低,且SCK上跳的第0byte + addrw := Cat(addrw(7,0), exRegi(3,0), shiftMOSI(1) ) + } .otherwise{ // byteSel > 1.U + when( isSckPosedgeNext(0) & byteSelNext >= 3.U & bitSelNext.andR ){ + addrw := addrw + 1.U + } + } + +} + + diff --git a/src/main/scala/backBoard/shin/b4b5.scala b/src/main/scala/backBoard/shin/b4b5.scala index 6540bc3..4283cba 100644 --- a/src/main/scala/backBoard/shin/b4b5.scala +++ b/src/main/scala/backBoard/shin/b4b5.scala @@ -1,78 +1,78 @@ -package BACK - -import chisel3._ -import chisel3.util._ - - -object b4b5Encoder{ - def apply( enq: UInt ): UInt = { - Mux1H(Seq( - (enq === "b0000".U) -> "b11110".U(5.W), - (enq === "b0001".U) -> "b01001".U(5.W), - (enq === "b0010".U) -> "b10100".U(5.W), - (enq === "b0011".U) -> "b10101".U(5.W), - (enq === "b0100".U) -> "b01010".U(5.W), - (enq === "b0101".U) -> "b01011".U(5.W), - (enq === "b0110".U) -> "b01110".U(5.W), - (enq === "b0111".U) -> "b01111".U(5.W), - (enq === "b1000".U) -> "b10010".U(5.W), - (enq === "b1001".U) -> "b10011".U(5.W), - (enq === "b1010".U) -> "b10110".U(5.W), - (enq === "b1011".U) -> "b10111".U(5.W), - (enq === "b1100".U) -> "b11010".U(5.W), - (enq === "b1101".U) -> "b11011".U(5.W), - (enq === "b1110".U) -> "b11100".U(5.W), - (enq === "b1111".U) -> "b11101".U(5.W), - )) - } -} - -object b4b5Decoder{ - def apply( enq: UInt ): UInt = { - Mux1H(Seq( - (enq === "b11110".U) -> "b0000".U(4.W), - (enq === "b01001".U) -> "b0001".U(4.W), - (enq === "b10100".U) -> "b0010".U(4.W), - (enq === "b10101".U) -> "b0011".U(4.W), - (enq === "b01010".U) -> "b0100".U(4.W), - (enq === "b01011".U) -> "b0101".U(4.W), - (enq === "b01110".U) -> "b0110".U(4.W), - (enq === "b01111".U) -> "b0111".U(4.W), - (enq === "b10010".U) -> "b1000".U(4.W), - (enq === "b10011".U) -> "b1001".U(4.W), - (enq === "b10110".U) -> "b1010".U(4.W), - (enq === "b10111".U) -> "b1011".U(4.W), - (enq === "b11010".U) -> "b1100".U(4.W), - (enq === "b11011".U) -> "b1101".U(4.W), - (enq === "b11100".U) -> "b1110".U(4.W), - (enq === "b11101".U) -> "b1111".U(4.W), - )) - } -} - -object Dualb4b5Encoder{ - def apply( enq: UInt ): UInt = { - require( enq.getWidth == 8, "Require Failed @ Dualb4b5Encoder!" ) - Cat( b4b5Encoder(enq(7,4)), b4b5Encoder(enq(3,0)) ) - } -} - -object Dualb4b5Decoder{ - def apply( enq: UInt ): UInt = { - require( enq.getWidth == 10, "Require Failed @ Dualb4b5Decoder!" ) - Cat( b4b5Decoder(enq(9,5)), b4b5Decoder(enq(4,0)) ) - } -} - - -class b4b5DualEncode extends Module with RequireAsyncReset{ - val io = IO(new Encode_Bundle) - - io.dataOut := Dualb4b5Encoder(io.dataIn) -} - -class b4b5DualDecode extends Module with RequireAsyncReset{ - val io = IO(new Decode_Bundle) - - io.dataOut := Dualb4b5Decoder(io.dataIn) -} +package BACK + +import chisel3._ +import chisel3.util._ + + +object b4b5Encoder{ + def apply( enq: UInt ): UInt = { + Mux1H(Seq( + (enq === "b0000".U) -> "b11110".U(5.W), + (enq === "b0001".U) -> "b01001".U(5.W), + (enq === "b0010".U) -> "b10100".U(5.W), + (enq === "b0011".U) -> "b10101".U(5.W), + (enq === "b0100".U) -> "b01010".U(5.W), + (enq === "b0101".U) -> "b01011".U(5.W), + (enq === "b0110".U) -> "b01110".U(5.W), + (enq === "b0111".U) -> "b01111".U(5.W), + (enq === "b1000".U) -> "b10010".U(5.W), + (enq === "b1001".U) -> "b10011".U(5.W), + (enq === "b1010".U) -> "b10110".U(5.W), + (enq === "b1011".U) -> "b10111".U(5.W), + (enq === "b1100".U) -> "b11010".U(5.W), + (enq === "b1101".U) -> "b11011".U(5.W), + (enq === "b1110".U) -> "b11100".U(5.W), + (enq === "b1111".U) -> "b11101".U(5.W), + )) + } +} + +object b4b5Decoder{ + def apply( enq: UInt ): UInt = { + Mux1H(Seq( + (enq === "b11110".U) -> "b0000".U(4.W), + (enq === "b01001".U) -> "b0001".U(4.W), + (enq === "b10100".U) -> "b0010".U(4.W), + (enq === "b10101".U) -> "b0011".U(4.W), + (enq === "b01010".U) -> "b0100".U(4.W), + (enq === "b01011".U) -> "b0101".U(4.W), + (enq === "b01110".U) -> "b0110".U(4.W), + (enq === "b01111".U) -> "b0111".U(4.W), + (enq === "b10010".U) -> "b1000".U(4.W), + (enq === "b10011".U) -> "b1001".U(4.W), + (enq === "b10110".U) -> "b1010".U(4.W), + (enq === "b10111".U) -> "b1011".U(4.W), + (enq === "b11010".U) -> "b1100".U(4.W), + (enq === "b11011".U) -> "b1101".U(4.W), + (enq === "b11100".U) -> "b1110".U(4.W), + (enq === "b11101".U) -> "b1111".U(4.W), + )) + } +} + +object Dualb4b5Encoder{ + def apply( enq: UInt ): UInt = { + require( enq.getWidth == 8, "Require Failed @ Dualb4b5Encoder!" ) + Cat( b4b5Encoder(enq(7,4)), b4b5Encoder(enq(3,0)) ) + } +} + +object Dualb4b5Decoder{ + def apply( enq: UInt ): UInt = { + require( enq.getWidth == 10, "Require Failed @ Dualb4b5Decoder!" ) + Cat( b4b5Decoder(enq(9,5)), b4b5Decoder(enq(4,0)) ) + } +} + + +class b4b5DualEncode extends Module with RequireAsyncReset{ + val io = IO(new Encode_Bundle) + + io.dataOut := Dualb4b5Encoder(io.dataIn) +} + +class b4b5DualDecode extends Module with RequireAsyncReset{ + val io = IO(new Decode_Bundle) + + io.dataOut := Dualb4b5Decoder(io.dataIn) +} diff --git a/src/main/scala/backBoard/shin/b8b10.scala b/src/main/scala/backBoard/shin/b8b10.scala index 1e57fcd..7d451ae 100644 --- a/src/main/scala/backBoard/shin/b8b10.scala +++ b/src/main/scala/backBoard/shin/b8b10.scala @@ -1,192 +1,192 @@ -package BACK - -import chisel3._ -import chisel3.util._ - -class Encode_Bundle extends Bundle{ - val dataIn = Input(UInt(8.W)) - val isEnable = Input(Bool()) - val dataOut = Output(UInt(10.W)) -} - -class Decode_Bundle extends Bundle{ - val dataIn = Input(UInt(10.W)) - val dataOut = Output(UInt(8.W)) -} - -class b8b10Encode extends Module with RequireAsyncReset{ - val io = IO(new Encode_Bundle) - - val rdTest = IO(Output(Bool())) //测试使用 - dontTouch(rdTest) - val rd = RegInit(false.B); rdTest := rd - - - val b5b6LookUp = Mux1H(Seq( - (io.dataIn(4,0) === "b00000".U) -> Mux( ~rd, "b100111".U(6.W), "b011000".U(6.W) ), - (io.dataIn(4,0) === "b00001".U) -> Mux( ~rd, "b011101".U(6.W), "b100010".U(6.W) ), - (io.dataIn(4,0) === "b00010".U) -> Mux( ~rd, "b101101".U(6.W), "b010010".U(6.W) ), - (io.dataIn(4,0) === "b00011".U) -> "b110001".U(6.W), - (io.dataIn(4,0) === "b00100".U) -> Mux( ~rd, "b110101".U(6.W), "b001010".U(6.W) ), - (io.dataIn(4,0) === "b00101".U) -> "b101001".U(6.W), - (io.dataIn(4,0) === "b00110".U) -> "b011001".U(6.W), - (io.dataIn(4,0) === "b00111".U) -> Mux( ~rd, "b111000".U(6.W), "b000111".U(6.W) ), - (io.dataIn(4,0) === "b01000".U) -> Mux( ~rd, "b111001".U(6.W), "b000110".U(6.W) ), - (io.dataIn(4,0) === "b01001".U) -> "b100101".U(6.W), - (io.dataIn(4,0) === "b01010".U) -> "b010101".U(6.W), - (io.dataIn(4,0) === "b01011".U) -> "b110100".U(6.W), - (io.dataIn(4,0) === "b01100".U) -> "b001101".U(6.W), - (io.dataIn(4,0) === "b01101".U) -> "b101100".U(6.W), - (io.dataIn(4,0) === "b01110".U) -> "b011100".U(6.W), - (io.dataIn(4,0) === "b01111".U) -> Mux( ~rd, "b010111".U(6.W), "b101000".U(6.W) ), - (io.dataIn(4,0) === "b10000".U) -> Mux( ~rd, "b011011".U(6.W), "b100100".U(6.W) ), - (io.dataIn(4,0) === "b10001".U) -> "b100011".U(6.W), - (io.dataIn(4,0) === "b10010".U) -> "b010011".U(6.W), - (io.dataIn(4,0) === "b10011".U) -> "b110010".U(6.W), - (io.dataIn(4,0) === "b10100".U) -> "b001011".U(6.W), - (io.dataIn(4,0) === "b10101".U) -> "b101010".U(6.W), - (io.dataIn(4,0) === "b10110".U) -> "b011010".U(6.W), - (io.dataIn(4,0) === "b10111".U) -> Mux( ~rd, "b111010".U(6.W), "b000101".U(6.W) ), - (io.dataIn(4,0) === "b11000".U) -> Mux( ~rd, "b110011".U(6.W), "b001100".U(6.W) ), - (io.dataIn(4,0) === "b11001".U) -> "b100110".U(6.W), - (io.dataIn(4,0) === "b11010".U) -> "b010110".U(6.W), - (io.dataIn(4,0) === "b11011".U) -> Mux( ~rd, "b110110".U(6.W), "b001001".U(6.W) ), - (io.dataIn(4,0) === "b11100".U) -> "b001110".U(6.W), - (io.dataIn(4,0) === "b11101".U) -> Mux( ~rd, "b101110".U(6.W), "b010001".U(6.W) ), - (io.dataIn(4,0) === "b11110".U) -> Mux( ~rd, "b011110".U(6.W), "b100001".U(6.W) ), - (io.dataIn(4,0) === "b11111".U) -> Mux( ~rd, "b101011".U(6.W), "b010100".U(6.W) ) - )) - - - val b5b6RD = Mux1H(Seq( - (io.dataIn(4,0) === "b00000".U) -> ~rd, - (io.dataIn(4,0) === "b00001".U) -> ~rd, - (io.dataIn(4,0) === "b00010".U) -> ~rd, - (io.dataIn(4,0) === "b00011".U) -> rd, - (io.dataIn(4,0) === "b00100".U) -> ~rd, - (io.dataIn(4,0) === "b00101".U) -> rd, - (io.dataIn(4,0) === "b00110".U) -> rd, - (io.dataIn(4,0) === "b00111".U) -> rd, - (io.dataIn(4,0) === "b01000".U) -> ~rd, - (io.dataIn(4,0) === "b01001".U) -> rd, - (io.dataIn(4,0) === "b01010".U) -> rd, - (io.dataIn(4,0) === "b01011".U) -> rd, - (io.dataIn(4,0) === "b01100".U) -> rd, - (io.dataIn(4,0) === "b01101".U) -> rd, - (io.dataIn(4,0) === "b01110".U) -> rd, - (io.dataIn(4,0) === "b01111".U) -> ~rd, - (io.dataIn(4,0) === "b10000".U) -> ~rd, - (io.dataIn(4,0) === "b10001".U) -> rd, - (io.dataIn(4,0) === "b10010".U) -> rd, - (io.dataIn(4,0) === "b10011".U) -> rd, - (io.dataIn(4,0) === "b10100".U) -> rd, - (io.dataIn(4,0) === "b10101".U) -> rd, - (io.dataIn(4,0) === "b10110".U) -> rd, - (io.dataIn(4,0) === "b10111".U) -> ~rd, - (io.dataIn(4,0) === "b11000".U) -> ~rd, - (io.dataIn(4,0) === "b11001".U) -> rd, - (io.dataIn(4,0) === "b11010".U) -> rd, - (io.dataIn(4,0) === "b11011".U) -> ~rd, - (io.dataIn(4,0) === "b11100".U) -> rd, - (io.dataIn(4,0) === "b11101".U) -> ~rd, - (io.dataIn(4,0) === "b11110".U) -> ~rd, - (io.dataIn(4,0) === "b11111".U) -> ~rd, - )) - - val b3b4LookUp = Mux1H(Seq( - (io.dataIn(7,5) === "b000".U) -> Mux( ~b5b6RD, "b1011".U(4.W), "b0100".U(4.W) ), - (io.dataIn(7,5) === "b001".U) -> "b1001".U(4.W), - (io.dataIn(7,5) === "b010".U) -> "b0101".U(4.W), - (io.dataIn(7,5) === "b011".U) -> Mux( ~b5b6RD, "b1100".U(4.W), "b0011".U(4.W) ), - (io.dataIn(7,5) === "b100".U) -> Mux( ~b5b6RD, "b1101".U(4.W), "b0010".U(4.W) ), - (io.dataIn(7,5) === "b101".U) -> "b1010".U(4.W), - (io.dataIn(7,5) === "b110".U) -> "b0110".U(4.W), - (io.dataIn(7,5) === "b111".U) -> MuxCase( Mux( ~b5b6RD, "b1110".U(4.W), "b0001".U(4.W) ), Array( - ((io.dataIn(4,0) === 17.U || io.dataIn(4,0) === 18.U || io.dataIn(4,0) === 20.U) & ~b5b6RD) -> "b0111".U(4.W), // 17, 18, 20 are special cases - ((io.dataIn(4,0) === 11.U || io.dataIn(4,0) === 13.U || io.dataIn(4,0) === 14.U) & b5b6RD) -> "b1000".U(4.W), // 11, 13, 14 are special cases - )) - )) - - val b3b4RD = Mux1H(Seq( - (io.dataIn(7,5) === "b000".U) -> ~b5b6RD, - (io.dataIn(7,5) === "b001".U) -> b5b6RD, - (io.dataIn(7,5) === "b010".U) -> b5b6RD, - (io.dataIn(7,5) === "b011".U) -> b5b6RD, - (io.dataIn(7,5) === "b100".U) -> ~b5b6RD, - (io.dataIn(7,5) === "b101".U) -> b5b6RD, - (io.dataIn(7,5) === "b110".U) -> b5b6RD, - (io.dataIn(7,5) === "b111".U) -> ~b5b6RD, - )) - - io.dataOut := Cat(b5b6LookUp, b3b4LookUp) - - when (io.isEnable) { - rd := b3b4RD - assert( io.dataOut(4,0) =/= 0.U && io.dataOut(4,0) =/= 31.U, "Invalid 8b10b encoding Output!") - assert( io.dataOut(5,1) =/= 0.U && io.dataOut(5,1) =/= 31.U, "Invalid 8b10b encoding Output!") - assert( io.dataOut(6,2) =/= 0.U && io.dataOut(6,2) =/= 31.U, "Invalid 8b10b encoding Output!") - assert( io.dataOut(7,3) =/= 0.U && io.dataOut(7,3) =/= 31.U, "Invalid 8b10b encoding Output!") - assert( io.dataOut(8,4) =/= 0.U && io.dataOut(8,4) =/= 31.U, "Invalid 8b10b encoding Output!") - assert( io.dataOut(9,5) =/= 0.U && io.dataOut(9,5) =/= 31.U, "Invalid 8b10b encoding Output!") - - } - -} - - -class b8b10Decode extends Module with RequireAsyncReset{ - val io = IO(new Decode_Bundle) - - - val b5b6LookUp = Mux1H(Seq( - (io.dataIn(9,4) === "b100111".U(6.W) || io.dataIn(9,4) === "b011000".U(6.W) ) -> "b00000".U, - (io.dataIn(9,4) === "b011101".U(6.W) || io.dataIn(9,4) === "b100010".U(6.W) ) -> "b00001".U, - (io.dataIn(9,4) === "b101101".U(6.W) || io.dataIn(9,4) === "b010010".U(6.W) ) -> "b00010".U, - (io.dataIn(9,4) === "b110001".U(6.W)) -> "b00011".U, - (io.dataIn(9,4) === "b110101".U(6.W) || io.dataIn(9,4) === "b001010".U(6.W) ) -> "b00100".U, - (io.dataIn(9,4) === "b101001".U(6.W)) -> "b00101".U, - (io.dataIn(9,4) === "b011001".U(6.W)) -> "b00110".U, - (io.dataIn(9,4) === "b111000".U(6.W) || io.dataIn(9,4) === "b000111".U(6.W) ) -> "b00111".U, - (io.dataIn(9,4) === "b111001".U(6.W) || io.dataIn(9,4) === "b000110".U(6.W) ) -> "b01000".U, - (io.dataIn(9,4) === "b100101".U(6.W)) -> "b01001".U, - (io.dataIn(9,4) === "b010101".U(6.W)) -> "b01010".U, - (io.dataIn(9,4) === "b110100".U(6.W)) -> "b01011".U, - (io.dataIn(9,4) === "b001101".U(6.W)) -> "b01100".U, - (io.dataIn(9,4) === "b101100".U(6.W)) -> "b01101".U, - (io.dataIn(9,4) === "b011100".U(6.W)) -> "b01110".U, - (io.dataIn(9,4) === "b010111".U(6.W) || io.dataIn(9,4) === "b101000".U(6.W) ) -> "b01111".U, - (io.dataIn(9,4) === "b011011".U(6.W) || io.dataIn(9,4) === "b100100".U(6.W) ) -> "b10000".U, - (io.dataIn(9,4) === "b100011".U(6.W)) -> "b10001".U, - (io.dataIn(9,4) === "b010011".U(6.W)) -> "b10010".U, - (io.dataIn(9,4) === "b110010".U(6.W)) -> "b10011".U, - (io.dataIn(9,4) === "b001011".U(6.W)) -> "b10100".U, - (io.dataIn(9,4) === "b101010".U(6.W)) -> "b10101".U, - (io.dataIn(9,4) === "b011010".U(6.W)) -> "b10110".U, - (io.dataIn(9,4) === "b111010".U(6.W) || io.dataIn(9,4) === "b000101".U(6.W) ) -> "b10111".U, - (io.dataIn(9,4) === "b110011".U(6.W) || io.dataIn(9,4) === "b001100".U(6.W) ) -> "b11000".U, - (io.dataIn(9,4) === "b100110".U(6.W)) -> "b11001".U, - (io.dataIn(9,4) === "b010110".U(6.W)) -> "b11010".U, - (io.dataIn(9,4) === "b110110".U(6.W) || io.dataIn(9,4) === "b001001".U(6.W) ) -> "b11011".U, - (io.dataIn(9,4) === "b001110".U(6.W)) -> "b11100".U, - (io.dataIn(9,4) === "b101110".U(6.W) || io.dataIn(9,4) === "b010001".U(6.W) ) -> "b11101".U, - (io.dataIn(9,4) === "b011110".U(6.W) || io.dataIn(9,4) === "b100001".U(6.W) ) -> "b11110".U, - (io.dataIn(9,4) === "b101011".U(6.W) || io.dataIn(9,4) === "b010100".U(6.W) ) -> "b11111".U, - )) - - val b3b4LookUp = Mux1H(Seq( - (io.dataIn(3,0) === "b1011".U(4.W) || io.dataIn(3,0) === "b0100".U(4.W) ) -> "b000".U, - (io.dataIn(3,0) === "b1001".U(4.W)) -> "b001".U, - (io.dataIn(3,0) === "b0101".U(4.W)) -> "b010".U, - (io.dataIn(3,0) === "b1100".U(4.W) || io.dataIn(3,0) === "b0011".U(4.W) ) -> "b011".U, - (io.dataIn(3,0) === "b1101".U(4.W) || io.dataIn(3,0) === "b0010".U(4.W) ) -> "b100".U, - (io.dataIn(3,0) === "b1010".U(4.W)) -> "b101".U, - (io.dataIn(3,0) === "b0110".U(4.W)) -> "b110".U, - (io.dataIn(3,0) === "b1110".U(4.W) || - io.dataIn(3,0) === "b0001".U(4.W) || - io.dataIn(3,0) === "b0111".U(4.W) || - io.dataIn(3,0) === "b1000".U(4.W)) -> "b111".U, - )) - - io.dataOut := Cat(b3b4LookUp, b5b6LookUp) - -} +package BACK + +import chisel3._ +import chisel3.util._ + +class Encode_Bundle extends Bundle{ + val dataIn = Input(UInt(8.W)) + val isEnable = Input(Bool()) + val dataOut = Output(UInt(10.W)) +} + +class Decode_Bundle extends Bundle{ + val dataIn = Input(UInt(10.W)) + val dataOut = Output(UInt(8.W)) +} + +class b8b10Encode extends Module with RequireAsyncReset{ + val io = IO(new Encode_Bundle) + + val rdTest = IO(Output(Bool())) //测试使用 + dontTouch(rdTest) + val rd = RegInit(false.B); rdTest := rd + + + val b5b6LookUp = Mux1H(Seq( + (io.dataIn(4,0) === "b00000".U) -> Mux( ~rd, "b100111".U(6.W), "b011000".U(6.W) ), + (io.dataIn(4,0) === "b00001".U) -> Mux( ~rd, "b011101".U(6.W), "b100010".U(6.W) ), + (io.dataIn(4,0) === "b00010".U) -> Mux( ~rd, "b101101".U(6.W), "b010010".U(6.W) ), + (io.dataIn(4,0) === "b00011".U) -> "b110001".U(6.W), + (io.dataIn(4,0) === "b00100".U) -> Mux( ~rd, "b110101".U(6.W), "b001010".U(6.W) ), + (io.dataIn(4,0) === "b00101".U) -> "b101001".U(6.W), + (io.dataIn(4,0) === "b00110".U) -> "b011001".U(6.W), + (io.dataIn(4,0) === "b00111".U) -> Mux( ~rd, "b111000".U(6.W), "b000111".U(6.W) ), + (io.dataIn(4,0) === "b01000".U) -> Mux( ~rd, "b111001".U(6.W), "b000110".U(6.W) ), + (io.dataIn(4,0) === "b01001".U) -> "b100101".U(6.W), + (io.dataIn(4,0) === "b01010".U) -> "b010101".U(6.W), + (io.dataIn(4,0) === "b01011".U) -> "b110100".U(6.W), + (io.dataIn(4,0) === "b01100".U) -> "b001101".U(6.W), + (io.dataIn(4,0) === "b01101".U) -> "b101100".U(6.W), + (io.dataIn(4,0) === "b01110".U) -> "b011100".U(6.W), + (io.dataIn(4,0) === "b01111".U) -> Mux( ~rd, "b010111".U(6.W), "b101000".U(6.W) ), + (io.dataIn(4,0) === "b10000".U) -> Mux( ~rd, "b011011".U(6.W), "b100100".U(6.W) ), + (io.dataIn(4,0) === "b10001".U) -> "b100011".U(6.W), + (io.dataIn(4,0) === "b10010".U) -> "b010011".U(6.W), + (io.dataIn(4,0) === "b10011".U) -> "b110010".U(6.W), + (io.dataIn(4,0) === "b10100".U) -> "b001011".U(6.W), + (io.dataIn(4,0) === "b10101".U) -> "b101010".U(6.W), + (io.dataIn(4,0) === "b10110".U) -> "b011010".U(6.W), + (io.dataIn(4,0) === "b10111".U) -> Mux( ~rd, "b111010".U(6.W), "b000101".U(6.W) ), + (io.dataIn(4,0) === "b11000".U) -> Mux( ~rd, "b110011".U(6.W), "b001100".U(6.W) ), + (io.dataIn(4,0) === "b11001".U) -> "b100110".U(6.W), + (io.dataIn(4,0) === "b11010".U) -> "b010110".U(6.W), + (io.dataIn(4,0) === "b11011".U) -> Mux( ~rd, "b110110".U(6.W), "b001001".U(6.W) ), + (io.dataIn(4,0) === "b11100".U) -> "b001110".U(6.W), + (io.dataIn(4,0) === "b11101".U) -> Mux( ~rd, "b101110".U(6.W), "b010001".U(6.W) ), + (io.dataIn(4,0) === "b11110".U) -> Mux( ~rd, "b011110".U(6.W), "b100001".U(6.W) ), + (io.dataIn(4,0) === "b11111".U) -> Mux( ~rd, "b101011".U(6.W), "b010100".U(6.W) ) + )) + + + val b5b6RD = Mux1H(Seq( + (io.dataIn(4,0) === "b00000".U) -> ~rd, + (io.dataIn(4,0) === "b00001".U) -> ~rd, + (io.dataIn(4,0) === "b00010".U) -> ~rd, + (io.dataIn(4,0) === "b00011".U) -> rd, + (io.dataIn(4,0) === "b00100".U) -> ~rd, + (io.dataIn(4,0) === "b00101".U) -> rd, + (io.dataIn(4,0) === "b00110".U) -> rd, + (io.dataIn(4,0) === "b00111".U) -> rd, + (io.dataIn(4,0) === "b01000".U) -> ~rd, + (io.dataIn(4,0) === "b01001".U) -> rd, + (io.dataIn(4,0) === "b01010".U) -> rd, + (io.dataIn(4,0) === "b01011".U) -> rd, + (io.dataIn(4,0) === "b01100".U) -> rd, + (io.dataIn(4,0) === "b01101".U) -> rd, + (io.dataIn(4,0) === "b01110".U) -> rd, + (io.dataIn(4,0) === "b01111".U) -> ~rd, + (io.dataIn(4,0) === "b10000".U) -> ~rd, + (io.dataIn(4,0) === "b10001".U) -> rd, + (io.dataIn(4,0) === "b10010".U) -> rd, + (io.dataIn(4,0) === "b10011".U) -> rd, + (io.dataIn(4,0) === "b10100".U) -> rd, + (io.dataIn(4,0) === "b10101".U) -> rd, + (io.dataIn(4,0) === "b10110".U) -> rd, + (io.dataIn(4,0) === "b10111".U) -> ~rd, + (io.dataIn(4,0) === "b11000".U) -> ~rd, + (io.dataIn(4,0) === "b11001".U) -> rd, + (io.dataIn(4,0) === "b11010".U) -> rd, + (io.dataIn(4,0) === "b11011".U) -> ~rd, + (io.dataIn(4,0) === "b11100".U) -> rd, + (io.dataIn(4,0) === "b11101".U) -> ~rd, + (io.dataIn(4,0) === "b11110".U) -> ~rd, + (io.dataIn(4,0) === "b11111".U) -> ~rd, + )) + + val b3b4LookUp = Mux1H(Seq( + (io.dataIn(7,5) === "b000".U) -> Mux( ~b5b6RD, "b1011".U(4.W), "b0100".U(4.W) ), + (io.dataIn(7,5) === "b001".U) -> "b1001".U(4.W), + (io.dataIn(7,5) === "b010".U) -> "b0101".U(4.W), + (io.dataIn(7,5) === "b011".U) -> Mux( ~b5b6RD, "b1100".U(4.W), "b0011".U(4.W) ), + (io.dataIn(7,5) === "b100".U) -> Mux( ~b5b6RD, "b1101".U(4.W), "b0010".U(4.W) ), + (io.dataIn(7,5) === "b101".U) -> "b1010".U(4.W), + (io.dataIn(7,5) === "b110".U) -> "b0110".U(4.W), + (io.dataIn(7,5) === "b111".U) -> MuxCase( Mux( ~b5b6RD, "b1110".U(4.W), "b0001".U(4.W) ), Array( + ((io.dataIn(4,0) === 17.U || io.dataIn(4,0) === 18.U || io.dataIn(4,0) === 20.U) & ~b5b6RD) -> "b0111".U(4.W), // 17, 18, 20 are special cases + ((io.dataIn(4,0) === 11.U || io.dataIn(4,0) === 13.U || io.dataIn(4,0) === 14.U) & b5b6RD) -> "b1000".U(4.W), // 11, 13, 14 are special cases + )) + )) + + val b3b4RD = Mux1H(Seq( + (io.dataIn(7,5) === "b000".U) -> ~b5b6RD, + (io.dataIn(7,5) === "b001".U) -> b5b6RD, + (io.dataIn(7,5) === "b010".U) -> b5b6RD, + (io.dataIn(7,5) === "b011".U) -> b5b6RD, + (io.dataIn(7,5) === "b100".U) -> ~b5b6RD, + (io.dataIn(7,5) === "b101".U) -> b5b6RD, + (io.dataIn(7,5) === "b110".U) -> b5b6RD, + (io.dataIn(7,5) === "b111".U) -> ~b5b6RD, + )) + + io.dataOut := Cat(b5b6LookUp, b3b4LookUp) + + when (io.isEnable) { + rd := b3b4RD + assert( io.dataOut(4,0) =/= 0.U && io.dataOut(4,0) =/= 31.U, "Invalid 8b10b encoding Output!") + assert( io.dataOut(5,1) =/= 0.U && io.dataOut(5,1) =/= 31.U, "Invalid 8b10b encoding Output!") + assert( io.dataOut(6,2) =/= 0.U && io.dataOut(6,2) =/= 31.U, "Invalid 8b10b encoding Output!") + assert( io.dataOut(7,3) =/= 0.U && io.dataOut(7,3) =/= 31.U, "Invalid 8b10b encoding Output!") + assert( io.dataOut(8,4) =/= 0.U && io.dataOut(8,4) =/= 31.U, "Invalid 8b10b encoding Output!") + assert( io.dataOut(9,5) =/= 0.U && io.dataOut(9,5) =/= 31.U, "Invalid 8b10b encoding Output!") + + } + +} + + +class b8b10Decode extends Module with RequireAsyncReset{ + val io = IO(new Decode_Bundle) + + + val b5b6LookUp = Mux1H(Seq( + (io.dataIn(9,4) === "b100111".U(6.W) || io.dataIn(9,4) === "b011000".U(6.W) ) -> "b00000".U, + (io.dataIn(9,4) === "b011101".U(6.W) || io.dataIn(9,4) === "b100010".U(6.W) ) -> "b00001".U, + (io.dataIn(9,4) === "b101101".U(6.W) || io.dataIn(9,4) === "b010010".U(6.W) ) -> "b00010".U, + (io.dataIn(9,4) === "b110001".U(6.W)) -> "b00011".U, + (io.dataIn(9,4) === "b110101".U(6.W) || io.dataIn(9,4) === "b001010".U(6.W) ) -> "b00100".U, + (io.dataIn(9,4) === "b101001".U(6.W)) -> "b00101".U, + (io.dataIn(9,4) === "b011001".U(6.W)) -> "b00110".U, + (io.dataIn(9,4) === "b111000".U(6.W) || io.dataIn(9,4) === "b000111".U(6.W) ) -> "b00111".U, + (io.dataIn(9,4) === "b111001".U(6.W) || io.dataIn(9,4) === "b000110".U(6.W) ) -> "b01000".U, + (io.dataIn(9,4) === "b100101".U(6.W)) -> "b01001".U, + (io.dataIn(9,4) === "b010101".U(6.W)) -> "b01010".U, + (io.dataIn(9,4) === "b110100".U(6.W)) -> "b01011".U, + (io.dataIn(9,4) === "b001101".U(6.W)) -> "b01100".U, + (io.dataIn(9,4) === "b101100".U(6.W)) -> "b01101".U, + (io.dataIn(9,4) === "b011100".U(6.W)) -> "b01110".U, + (io.dataIn(9,4) === "b010111".U(6.W) || io.dataIn(9,4) === "b101000".U(6.W) ) -> "b01111".U, + (io.dataIn(9,4) === "b011011".U(6.W) || io.dataIn(9,4) === "b100100".U(6.W) ) -> "b10000".U, + (io.dataIn(9,4) === "b100011".U(6.W)) -> "b10001".U, + (io.dataIn(9,4) === "b010011".U(6.W)) -> "b10010".U, + (io.dataIn(9,4) === "b110010".U(6.W)) -> "b10011".U, + (io.dataIn(9,4) === "b001011".U(6.W)) -> "b10100".U, + (io.dataIn(9,4) === "b101010".U(6.W)) -> "b10101".U, + (io.dataIn(9,4) === "b011010".U(6.W)) -> "b10110".U, + (io.dataIn(9,4) === "b111010".U(6.W) || io.dataIn(9,4) === "b000101".U(6.W) ) -> "b10111".U, + (io.dataIn(9,4) === "b110011".U(6.W) || io.dataIn(9,4) === "b001100".U(6.W) ) -> "b11000".U, + (io.dataIn(9,4) === "b100110".U(6.W)) -> "b11001".U, + (io.dataIn(9,4) === "b010110".U(6.W)) -> "b11010".U, + (io.dataIn(9,4) === "b110110".U(6.W) || io.dataIn(9,4) === "b001001".U(6.W) ) -> "b11011".U, + (io.dataIn(9,4) === "b001110".U(6.W)) -> "b11100".U, + (io.dataIn(9,4) === "b101110".U(6.W) || io.dataIn(9,4) === "b010001".U(6.W) ) -> "b11101".U, + (io.dataIn(9,4) === "b011110".U(6.W) || io.dataIn(9,4) === "b100001".U(6.W) ) -> "b11110".U, + (io.dataIn(9,4) === "b101011".U(6.W) || io.dataIn(9,4) === "b010100".U(6.W) ) -> "b11111".U, + )) + + val b3b4LookUp = Mux1H(Seq( + (io.dataIn(3,0) === "b1011".U(4.W) || io.dataIn(3,0) === "b0100".U(4.W) ) -> "b000".U, + (io.dataIn(3,0) === "b1001".U(4.W)) -> "b001".U, + (io.dataIn(3,0) === "b0101".U(4.W)) -> "b010".U, + (io.dataIn(3,0) === "b1100".U(4.W) || io.dataIn(3,0) === "b0011".U(4.W) ) -> "b011".U, + (io.dataIn(3,0) === "b1101".U(4.W) || io.dataIn(3,0) === "b0010".U(4.W) ) -> "b100".U, + (io.dataIn(3,0) === "b1010".U(4.W)) -> "b101".U, + (io.dataIn(3,0) === "b0110".U(4.W)) -> "b110".U, + (io.dataIn(3,0) === "b1110".U(4.W) || + io.dataIn(3,0) === "b0001".U(4.W) || + io.dataIn(3,0) === "b0111".U(4.W) || + io.dataIn(3,0) === "b1000".U(4.W)) -> "b111".U, + )) + + io.dataOut := Cat(b3b4LookUp, b5b6LookUp) + +} diff --git a/src/main/scala/backBoard/shin/crc32.scala b/src/main/scala/backBoard/shin/crc32.scala index 82916a4..1f60b99 100644 --- a/src/main/scala/backBoard/shin/crc32.scala +++ b/src/main/scala/backBoard/shin/crc32.scala @@ -1,87 +1,87 @@ -package BACK - -import chisel3._ -import chisel3.util._ - - -//----------------------------------------------------------------------------- -// Copyright (C) 2009 OutputLogic.com -// This source file may be used and distributed without restriction -// provided that this copyright statement is not removed from the file -// and that any derivative work contains the original copyright notice -// and the associated disclaimer. -// -// THIS SOURCE FILE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS -// OR IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED -// WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. -//----------------------------------------------------------------------------- -// CRC module for data[7:0] , crc[31:0]=1+x^1+x^2+x^4+x^5+x^7+x^8+x^10+x^11+x^12+x^16+x^22+x^23+x^26+x^32; -//----------------------------------------------------------------------------- - - -class crc32_8() extends Module with RequireAsyncReset{ - class crc32IO_Bundle extends Bundle{ - val isEnable = Input(Bool()) - val dataIn = Input(UInt(8.W)) - - val crc = Output(UInt(32.W)) - val flush = Input(Bool()) - } - - val io = IO( new crc32IO_Bundle ) - - // val LFSR_POLY = "h4c11db7".U - - val lfsr_c = for( i <- 0 until 32 ) yield Wire(Bool()) - val lfsr_q = for( i <- 0 until 32 ) yield RegInit( true.B ) - - for( i <- 0 until 32 ){ - when( io.flush ){ - lfsr_q(i) := true.B - } .elsewhen( io.isEnable ){ - lfsr_q(i) := lfsr_c(i) - } - } - - io.crc := Cat( lfsr_q ) - - val dataIn = Wire(UInt(8.W)) - dataIn := Cat(io.dataIn.asBools) - - - lfsr_c( 0) := lfsr_q(24) ^ lfsr_q(30) ^ dataIn(0) ^ dataIn(6) - lfsr_c( 1) := lfsr_q(24) ^ lfsr_q(25) ^ lfsr_q(30) ^ lfsr_q(31) ^ dataIn(0) ^ dataIn(1) ^ dataIn(6) ^ dataIn(7) - lfsr_c( 2) := lfsr_q(24) ^ lfsr_q(25) ^ lfsr_q(26) ^ lfsr_q(30) ^ lfsr_q(31) ^ dataIn(0) ^ dataIn(1) ^ dataIn(2) ^ dataIn(6) ^ dataIn(7) - lfsr_c( 3) := lfsr_q(25) ^ lfsr_q(26) ^ lfsr_q(27) ^ lfsr_q(31) ^ dataIn(1) ^ dataIn(2) ^ dataIn(3) ^ dataIn(7) - lfsr_c( 4) := lfsr_q(24) ^ lfsr_q(26) ^ lfsr_q(27) ^ lfsr_q(28) ^ lfsr_q(30) ^ dataIn(0) ^ dataIn(2) ^ dataIn(3) ^ dataIn(4) ^ dataIn(6) - lfsr_c( 5) := lfsr_q(24) ^ lfsr_q(25) ^ lfsr_q(27) ^ lfsr_q(28) ^ lfsr_q(29) ^ lfsr_q(30) ^ lfsr_q(31) ^ dataIn(0) ^ dataIn(1) ^ dataIn(3) ^ dataIn(4) ^ dataIn(5) ^ dataIn(6) ^ dataIn(7) - lfsr_c( 6) := lfsr_q(25) ^ lfsr_q(26) ^ lfsr_q(28) ^ lfsr_q(29) ^ lfsr_q(30) ^ lfsr_q(31) ^ dataIn(1) ^ dataIn(2) ^ dataIn(4) ^ dataIn(5) ^ dataIn(6) ^ dataIn(7) - lfsr_c( 7) := lfsr_q(24) ^ lfsr_q(26) ^ lfsr_q(27) ^ lfsr_q(29) ^ lfsr_q(31) ^ dataIn(0) ^ dataIn(2) ^ dataIn(3) ^ dataIn(5) ^ dataIn(7) - lfsr_c( 8) := lfsr_q( 0) ^ lfsr_q(24) ^ lfsr_q(25) ^ lfsr_q(27) ^ lfsr_q(28) ^ dataIn(0) ^ dataIn(1) ^ dataIn(3) ^ dataIn(4) - lfsr_c( 9) := lfsr_q( 1) ^ lfsr_q(25) ^ lfsr_q(26) ^ lfsr_q(28) ^ lfsr_q(29) ^ dataIn(1) ^ dataIn(2) ^ dataIn(4) ^ dataIn(5) - lfsr_c(10) := lfsr_q( 2) ^ lfsr_q(24) ^ lfsr_q(26) ^ lfsr_q(27) ^ lfsr_q(29) ^ dataIn(0) ^ dataIn(2) ^ dataIn(3) ^ dataIn(5) - lfsr_c(11) := lfsr_q( 3) ^ lfsr_q(24) ^ lfsr_q(25) ^ lfsr_q(27) ^ lfsr_q(28) ^ dataIn(0) ^ dataIn(1) ^ dataIn(3) ^ dataIn(4) - lfsr_c(12) := lfsr_q( 4) ^ lfsr_q(24) ^ lfsr_q(25) ^ lfsr_q(26) ^ lfsr_q(28) ^ lfsr_q(29) ^ lfsr_q(30) ^ dataIn(0) ^ dataIn(1) ^ dataIn(2) ^ dataIn(4) ^ dataIn(5) ^ dataIn(6) - lfsr_c(13) := lfsr_q( 5) ^ lfsr_q(25) ^ lfsr_q(26) ^ lfsr_q(27) ^ lfsr_q(29) ^ lfsr_q(30) ^ lfsr_q(31) ^ dataIn(1) ^ dataIn(2) ^ dataIn(3) ^ dataIn(5) ^ dataIn(6) ^ dataIn(7) - lfsr_c(14) := lfsr_q( 6) ^ lfsr_q(26) ^ lfsr_q(27) ^ lfsr_q(28) ^ lfsr_q(30) ^ lfsr_q(31) ^ dataIn(2) ^ dataIn(3) ^ dataIn(4) ^ dataIn(6) ^ dataIn(7) - lfsr_c(15) := lfsr_q( 7) ^ lfsr_q(27) ^ lfsr_q(28) ^ lfsr_q(29) ^ lfsr_q(31) ^ dataIn(3) ^ dataIn(4) ^ dataIn(5) ^ dataIn(7) - lfsr_c(16) := lfsr_q( 8) ^ lfsr_q(24) ^ lfsr_q(28) ^ lfsr_q(29) ^ dataIn(0) ^ dataIn(4) ^ dataIn(5) - lfsr_c(17) := lfsr_q( 9) ^ lfsr_q(25) ^ lfsr_q(29) ^ lfsr_q(30) ^ dataIn(1) ^ dataIn(5) ^ dataIn(6) - lfsr_c(18) := lfsr_q(10) ^ lfsr_q(26) ^ lfsr_q(30) ^ lfsr_q(31) ^ dataIn(2) ^ dataIn(6) ^ dataIn(7) - lfsr_c(19) := lfsr_q(11) ^ lfsr_q(27) ^ lfsr_q(31) ^ dataIn(3) ^ dataIn(7) - lfsr_c(20) := lfsr_q(12) ^ lfsr_q(28) ^ dataIn(4) - lfsr_c(21) := lfsr_q(13) ^ lfsr_q(29) ^ dataIn(5) - lfsr_c(22) := lfsr_q(14) ^ lfsr_q(24) ^ dataIn(0) - lfsr_c(23) := lfsr_q(15) ^ lfsr_q(24) ^ lfsr_q(25) ^ lfsr_q(30) ^ dataIn(0) ^ dataIn(1) ^ dataIn(6) - lfsr_c(24) := lfsr_q(16) ^ lfsr_q(25) ^ lfsr_q(26) ^ lfsr_q(31) ^ dataIn(1) ^ dataIn(2) ^ dataIn(7) - lfsr_c(25) := lfsr_q(17) ^ lfsr_q(26) ^ lfsr_q(27) ^ dataIn(2) ^ dataIn(3) - lfsr_c(26) := lfsr_q(18) ^ lfsr_q(24) ^ lfsr_q(27) ^ lfsr_q(28) ^ lfsr_q(30) ^ dataIn(0) ^ dataIn(3) ^ dataIn(4) ^ dataIn(6) - lfsr_c(27) := lfsr_q(19) ^ lfsr_q(25) ^ lfsr_q(28) ^ lfsr_q(29) ^ lfsr_q(31) ^ dataIn(1) ^ dataIn(4) ^ dataIn(5) ^ dataIn(7) - lfsr_c(28) := lfsr_q(20) ^ lfsr_q(26) ^ lfsr_q(29) ^ lfsr_q(30) ^ dataIn(2) ^ dataIn(5) ^ dataIn(6) - lfsr_c(29) := lfsr_q(21) ^ lfsr_q(27) ^ lfsr_q(30) ^ lfsr_q(31) ^ dataIn(3) ^ dataIn(6) ^ dataIn(7) - lfsr_c(30) := lfsr_q(22) ^ lfsr_q(28) ^ lfsr_q(31) ^ dataIn(4) ^ dataIn(7) - lfsr_c(31) := lfsr_q(23) ^ lfsr_q(29) ^ dataIn(5) - - - -} +package BACK + +import chisel3._ +import chisel3.util._ + + +//----------------------------------------------------------------------------- +// Copyright (C) 2009 OutputLogic.com +// This source file may be used and distributed without restriction +// provided that this copyright statement is not removed from the file +// and that any derivative work contains the original copyright notice +// and the associated disclaimer. +// +// THIS SOURCE FILE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS +// OR IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED +// WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. +//----------------------------------------------------------------------------- +// CRC module for data[7:0] , crc[31:0]=1+x^1+x^2+x^4+x^5+x^7+x^8+x^10+x^11+x^12+x^16+x^22+x^23+x^26+x^32; +//----------------------------------------------------------------------------- + + +class crc32_8() extends Module with RequireAsyncReset{ + class crc32IO_Bundle extends Bundle{ + val isEnable = Input(Bool()) + val dataIn = Input(UInt(8.W)) + + val crc = Output(UInt(32.W)) + val flush = Input(Bool()) + } + + val io = IO( new crc32IO_Bundle ) + + // val LFSR_POLY = "h4c11db7".U + + val lfsr_c = for( i <- 0 until 32 ) yield Wire(Bool()) + val lfsr_q = for( i <- 0 until 32 ) yield RegInit( true.B ) + + for( i <- 0 until 32 ){ + when( io.flush ){ + lfsr_q(i) := true.B + } .elsewhen( io.isEnable ){ + lfsr_q(i) := lfsr_c(i) + } + } + + io.crc := Cat( lfsr_q ) + + val dataIn = Wire(UInt(8.W)) + dataIn := Cat(io.dataIn.asBools) + + + lfsr_c( 0) := lfsr_q(24) ^ lfsr_q(30) ^ dataIn(0) ^ dataIn(6) + lfsr_c( 1) := lfsr_q(24) ^ lfsr_q(25) ^ lfsr_q(30) ^ lfsr_q(31) ^ dataIn(0) ^ dataIn(1) ^ dataIn(6) ^ dataIn(7) + lfsr_c( 2) := lfsr_q(24) ^ lfsr_q(25) ^ lfsr_q(26) ^ lfsr_q(30) ^ lfsr_q(31) ^ dataIn(0) ^ dataIn(1) ^ dataIn(2) ^ dataIn(6) ^ dataIn(7) + lfsr_c( 3) := lfsr_q(25) ^ lfsr_q(26) ^ lfsr_q(27) ^ lfsr_q(31) ^ dataIn(1) ^ dataIn(2) ^ dataIn(3) ^ dataIn(7) + lfsr_c( 4) := lfsr_q(24) ^ lfsr_q(26) ^ lfsr_q(27) ^ lfsr_q(28) ^ lfsr_q(30) ^ dataIn(0) ^ dataIn(2) ^ dataIn(3) ^ dataIn(4) ^ dataIn(6) + lfsr_c( 5) := lfsr_q(24) ^ lfsr_q(25) ^ lfsr_q(27) ^ lfsr_q(28) ^ lfsr_q(29) ^ lfsr_q(30) ^ lfsr_q(31) ^ dataIn(0) ^ dataIn(1) ^ dataIn(3) ^ dataIn(4) ^ dataIn(5) ^ dataIn(6) ^ dataIn(7) + lfsr_c( 6) := lfsr_q(25) ^ lfsr_q(26) ^ lfsr_q(28) ^ lfsr_q(29) ^ lfsr_q(30) ^ lfsr_q(31) ^ dataIn(1) ^ dataIn(2) ^ dataIn(4) ^ dataIn(5) ^ dataIn(6) ^ dataIn(7) + lfsr_c( 7) := lfsr_q(24) ^ lfsr_q(26) ^ lfsr_q(27) ^ lfsr_q(29) ^ lfsr_q(31) ^ dataIn(0) ^ dataIn(2) ^ dataIn(3) ^ dataIn(5) ^ dataIn(7) + lfsr_c( 8) := lfsr_q( 0) ^ lfsr_q(24) ^ lfsr_q(25) ^ lfsr_q(27) ^ lfsr_q(28) ^ dataIn(0) ^ dataIn(1) ^ dataIn(3) ^ dataIn(4) + lfsr_c( 9) := lfsr_q( 1) ^ lfsr_q(25) ^ lfsr_q(26) ^ lfsr_q(28) ^ lfsr_q(29) ^ dataIn(1) ^ dataIn(2) ^ dataIn(4) ^ dataIn(5) + lfsr_c(10) := lfsr_q( 2) ^ lfsr_q(24) ^ lfsr_q(26) ^ lfsr_q(27) ^ lfsr_q(29) ^ dataIn(0) ^ dataIn(2) ^ dataIn(3) ^ dataIn(5) + lfsr_c(11) := lfsr_q( 3) ^ lfsr_q(24) ^ lfsr_q(25) ^ lfsr_q(27) ^ lfsr_q(28) ^ dataIn(0) ^ dataIn(1) ^ dataIn(3) ^ dataIn(4) + lfsr_c(12) := lfsr_q( 4) ^ lfsr_q(24) ^ lfsr_q(25) ^ lfsr_q(26) ^ lfsr_q(28) ^ lfsr_q(29) ^ lfsr_q(30) ^ dataIn(0) ^ dataIn(1) ^ dataIn(2) ^ dataIn(4) ^ dataIn(5) ^ dataIn(6) + lfsr_c(13) := lfsr_q( 5) ^ lfsr_q(25) ^ lfsr_q(26) ^ lfsr_q(27) ^ lfsr_q(29) ^ lfsr_q(30) ^ lfsr_q(31) ^ dataIn(1) ^ dataIn(2) ^ dataIn(3) ^ dataIn(5) ^ dataIn(6) ^ dataIn(7) + lfsr_c(14) := lfsr_q( 6) ^ lfsr_q(26) ^ lfsr_q(27) ^ lfsr_q(28) ^ lfsr_q(30) ^ lfsr_q(31) ^ dataIn(2) ^ dataIn(3) ^ dataIn(4) ^ dataIn(6) ^ dataIn(7) + lfsr_c(15) := lfsr_q( 7) ^ lfsr_q(27) ^ lfsr_q(28) ^ lfsr_q(29) ^ lfsr_q(31) ^ dataIn(3) ^ dataIn(4) ^ dataIn(5) ^ dataIn(7) + lfsr_c(16) := lfsr_q( 8) ^ lfsr_q(24) ^ lfsr_q(28) ^ lfsr_q(29) ^ dataIn(0) ^ dataIn(4) ^ dataIn(5) + lfsr_c(17) := lfsr_q( 9) ^ lfsr_q(25) ^ lfsr_q(29) ^ lfsr_q(30) ^ dataIn(1) ^ dataIn(5) ^ dataIn(6) + lfsr_c(18) := lfsr_q(10) ^ lfsr_q(26) ^ lfsr_q(30) ^ lfsr_q(31) ^ dataIn(2) ^ dataIn(6) ^ dataIn(7) + lfsr_c(19) := lfsr_q(11) ^ lfsr_q(27) ^ lfsr_q(31) ^ dataIn(3) ^ dataIn(7) + lfsr_c(20) := lfsr_q(12) ^ lfsr_q(28) ^ dataIn(4) + lfsr_c(21) := lfsr_q(13) ^ lfsr_q(29) ^ dataIn(5) + lfsr_c(22) := lfsr_q(14) ^ lfsr_q(24) ^ dataIn(0) + lfsr_c(23) := lfsr_q(15) ^ lfsr_q(24) ^ lfsr_q(25) ^ lfsr_q(30) ^ dataIn(0) ^ dataIn(1) ^ dataIn(6) + lfsr_c(24) := lfsr_q(16) ^ lfsr_q(25) ^ lfsr_q(26) ^ lfsr_q(31) ^ dataIn(1) ^ dataIn(2) ^ dataIn(7) + lfsr_c(25) := lfsr_q(17) ^ lfsr_q(26) ^ lfsr_q(27) ^ dataIn(2) ^ dataIn(3) + lfsr_c(26) := lfsr_q(18) ^ lfsr_q(24) ^ lfsr_q(27) ^ lfsr_q(28) ^ lfsr_q(30) ^ dataIn(0) ^ dataIn(3) ^ dataIn(4) ^ dataIn(6) + lfsr_c(27) := lfsr_q(19) ^ lfsr_q(25) ^ lfsr_q(28) ^ lfsr_q(29) ^ lfsr_q(31) ^ dataIn(1) ^ dataIn(4) ^ dataIn(5) ^ dataIn(7) + lfsr_c(28) := lfsr_q(20) ^ lfsr_q(26) ^ lfsr_q(29) ^ lfsr_q(30) ^ dataIn(2) ^ dataIn(5) ^ dataIn(6) + lfsr_c(29) := lfsr_q(21) ^ lfsr_q(27) ^ lfsr_q(30) ^ lfsr_q(31) ^ dataIn(3) ^ dataIn(6) ^ dataIn(7) + lfsr_c(30) := lfsr_q(22) ^ lfsr_q(28) ^ lfsr_q(31) ^ dataIn(4) ^ dataIn(7) + lfsr_c(31) := lfsr_q(23) ^ lfsr_q(29) ^ dataIn(5) + + + +} diff --git a/src/main/scala/util/DDFlipFlop.scala b/src/main/scala/util/DDFlipFlop.scala index dcf48e1..2e3ba49 100644 --- a/src/main/scala/util/DDFlipFlop.scala +++ b/src/main/scala/util/DDFlipFlop.scala @@ -1,83 +1,83 @@ -package BACK - -import chisel3._ -import chisel3.util._ - -class FDRegInit[T<:Data](init: T, pclk: Clock, nclk: Clock, reset: AsyncReset, mode: Boolean){ - private val pReg = withClockAndReset(pclk, reset) { RegInit( init ) } - private val nReg = withClockAndReset(nclk, reset) { RegInit( 0.U.asTypeOf(init) ) } - - val value: T = - if( !mode ){ pReg } - else { (pReg.asUInt ^ nReg.asUInt).asTypeOf(init) } - - - private val next = WireDefault(value) - - def :=(d:T): Unit = { next := d } - - if( !mode ){ pReg := next } else { pReg := (nReg.asUInt ^ next.asUInt).asTypeOf(init) } - nReg := (pReg.asUInt ^ next.asUInt).asTypeOf(init) - - def apply(): T = value - -} - -object FDRegInit{ - def apply[T<:Data](init: T, pclk: Clock, nclk: Clock, reset: AsyncReset, mode: Boolean): FDRegInit[T] = { - new FDRegInit(init, pclk, nclk, reset, mode) - } - -} - - -class FDRegNext[T<:Data](d: T, init: T, pclk: Clock, nclk: Clock, reset: AsyncReset, mode: Boolean ){ - private val pReg = withClockAndReset(pclk, reset) { RegInit( init ) } - private val nReg = withClockAndReset(nclk, reset) { RegInit( 0.U.asTypeOf(init) ) } - - if( !mode ) { pReg := d } else { pReg := (d.asUInt ^ nReg.asUInt).asTypeOf(init) } - nReg := (d.asUInt ^ pReg.asUInt).asTypeOf(init) - - val value: T = - if( !mode ){ pReg } - else { (pReg.asUInt ^ nReg.asUInt).asTypeOf(init) } - - def apply(): T = value -} - - -object FDRegNext{ - def apply[T<:Data]( d: T, init: T, pclk: Clock, nclk: Clock, reset: AsyncReset, mode: Boolean ): T = { - new FDRegNext(d, init, pclk, nclk, reset, mode ).apply() - } -} - -class FDShiftRegisters[T<:Data]( in: T, n: Int, init: T, en: Bool, pclk: Clock, nclk: Clock, reset: AsyncReset, mode: Boolean ){ - private val pRegs = withClockAndReset(pclk, reset) { RegInit(VecInit(Seq.fill(n)( init ))) } - private val nRegs = withClockAndReset(nclk, reset) { RegInit(VecInit(Seq.fill(n)( 0.U.asTypeOf(init)))) } - - // 移位逻辑:首位采样输入,其他依次移位 - if( !mode ){ pRegs(0) := in } else { pRegs(0) := (in.asUInt ^ nRegs(0).asUInt).asTypeOf(init) } - for(i <- 1 until n) { - if( !mode ){ pRegs(i) := pRegs(i-1) } - else { pRegs(i) := (pRegs(i-1).asUInt ^ nRegs(i).asUInt).asTypeOf(init)} - } - - nRegs(0) := (in.asUInt ^ pRegs(0).asUInt).asTypeOf(init) - for(i <- 1 until n) { - nRegs(i) := (nRegs(i-1).asUInt ^ pRegs(i).asUInt).asTypeOf(init) - } - - // 输出为 pRegs 与 nRegs 异或 - def apply(): Seq[T] = - if( !mode ){ pRegs } - else (pRegs zip nRegs).map{ case (a, b) => (a.asUInt ^ b.asUInt).asTypeOf(init) } -} - - -object FDShiftRegisters{ - def apply[T<:Data]( in: T, n: Int, init: T, en: Bool, pclk: Clock, nclk: Clock, reset: AsyncReset, mode: Boolean ): Seq[T] = { - new FDShiftRegisters( in, n, init, en, pclk, nclk, reset, mode ).apply() - } -} - +package BACK + +import chisel3._ +import chisel3.util._ + +class FDRegInit[T<:Data](init: T, pclk: Clock, nclk: Clock, reset: AsyncReset, mode: Boolean){ + private val pReg = withClockAndReset(pclk, reset) { RegInit( init ) } + private val nReg = withClockAndReset(nclk, reset) { RegInit( 0.U.asTypeOf(init) ) } + + val value: T = + if( !mode ){ pReg } + else { (pReg.asUInt ^ nReg.asUInt).asTypeOf(init) } + + + private val next = WireDefault(value) + + def :=(d:T): Unit = { next := d } + + if( !mode ){ pReg := next } else { pReg := (nReg.asUInt ^ next.asUInt).asTypeOf(init) } + nReg := (pReg.asUInt ^ next.asUInt).asTypeOf(init) + + def apply(): T = value + +} + +object FDRegInit{ + def apply[T<:Data](init: T, pclk: Clock, nclk: Clock, reset: AsyncReset, mode: Boolean): FDRegInit[T] = { + new FDRegInit(init, pclk, nclk, reset, mode) + } + +} + + +class FDRegNext[T<:Data](d: T, init: T, pclk: Clock, nclk: Clock, reset: AsyncReset, mode: Boolean ){ + private val pReg = withClockAndReset(pclk, reset) { RegInit( init ) } + private val nReg = withClockAndReset(nclk, reset) { RegInit( 0.U.asTypeOf(init) ) } + + if( !mode ) { pReg := d } else { pReg := (d.asUInt ^ nReg.asUInt).asTypeOf(init) } + nReg := (d.asUInt ^ pReg.asUInt).asTypeOf(init) + + val value: T = + if( !mode ){ pReg } + else { (pReg.asUInt ^ nReg.asUInt).asTypeOf(init) } + + def apply(): T = value +} + + +object FDRegNext{ + def apply[T<:Data]( d: T, init: T, pclk: Clock, nclk: Clock, reset: AsyncReset, mode: Boolean ): T = { + new FDRegNext(d, init, pclk, nclk, reset, mode ).apply() + } +} + +class FDShiftRegisters[T<:Data]( in: T, n: Int, init: T, en: Bool, pclk: Clock, nclk: Clock, reset: AsyncReset, mode: Boolean ){ + private val pRegs = withClockAndReset(pclk, reset) { RegInit(VecInit(Seq.fill(n)( init ))) } + private val nRegs = withClockAndReset(nclk, reset) { RegInit(VecInit(Seq.fill(n)( 0.U.asTypeOf(init)))) } + + // 移位逻辑:首位采样输入,其他依次移位 + if( !mode ){ pRegs(0) := in } else { pRegs(0) := (in.asUInt ^ nRegs(0).asUInt).asTypeOf(init) } + for(i <- 1 until n) { + if( !mode ){ pRegs(i) := pRegs(i-1) } + else { pRegs(i) := (pRegs(i-1).asUInt ^ nRegs(i).asUInt).asTypeOf(init)} + } + + nRegs(0) := (in.asUInt ^ pRegs(0).asUInt).asTypeOf(init) + for(i <- 1 until n) { + nRegs(i) := (nRegs(i-1).asUInt ^ pRegs(i).asUInt).asTypeOf(init) + } + + // 输出为 pRegs 与 nRegs 异或 + def apply(): Seq[T] = + if( !mode ){ pRegs } + else (pRegs zip nRegs).map{ case (a, b) => (a.asUInt ^ b.asUInt).asTypeOf(init) } +} + + +object FDShiftRegisters{ + def apply[T<:Data]( in: T, n: Int, init: T, en: Bool, pclk: Clock, nclk: Clock, reset: AsyncReset, mode: Boolean ): Seq[T] = { + new FDShiftRegisters( in, n, init, en, pclk, nclk, reset, mode ).apply() + } +} + diff --git a/src/test/scala/SimCDR.scala b/src/test/scala/SimCDR.scala index a66f4ec..b16a684 100644 --- a/src/test/scala/SimCDR.scala +++ b/src/test/scala/SimCDR.scala @@ -1,170 +1,170 @@ -package BACK - -import chisel3._ -import chisel3.util._ - - - -class SimCDR extends Module with RequireAsyncReset{ - val io = IO(new Bundle{ - val data = Input( UInt(8.W) ) - - val multiCLK = Input(Vec(16, Bool())) - - val flush = Input(Bool()) - - val isSuccess = Output(Bool()) - val isFailed = Output(Bool()) - }) - - - - - val cdrInAxis = Module(new CDRInAxis) - val cdrInSample = Module(new CDRInMultiSample(clkNum = 4)) - - val cdrOut = Module(new CDROut) - - val dataCnt = RegInit(0.U(12.W)) - val payloadLen = RegInit(("hFFF".U)(12.W)) - - val b4b5Encoder = Module(new b4b5DualEncode) - val b4b5Decoder = Module(new b4b5DualDecode) - - val b8b10Encoder = Module(new b8b10Encode) - val b8b10Decoder = Module(new b8b10Decode) - - val wPtr = RegInit(0.U(12.W)) - val rPtr = withClockAndReset( io.multiCLK(0).asClock, reset ) { RegInit(0.U(12.W)) } - - val asyncFifo = Module(new ShareSRAM2k) - - when( cdrOut.io.axis.fire & dataCnt === 0.U ){ - payloadLen := Cat( io.data, 0.U(4.W) ) - } .elsewhen( cdrOut.io.axis.fire & dataCnt === 1.U ){ - payloadLen := Cat( payloadLen(11,4), io.data(7,4) ) + 4.U + 4.U - } - - when( cdrOut.io.axis.fire ){ - when( dataCnt >= payloadLen - 1.U ){ - dataCnt := 0.U - } .otherwise{ - dataCnt := dataCnt + 1.U - } - } - - - cdrOut.io.flush := io.flush - - cdrInAxis.clock := io.multiCLK(0).asClock - cdrInSample.clock := io.multiCLK(0).asClock - cdrInAxis.io.flush := io.flush - - // cdrInSample.multiCLK := io.multiCLK - cdrInSample.multiCLK(0) := io.multiCLK(0) - cdrInSample.multiCLK(1) := io.multiCLK(4) - cdrInSample.multiCLK(2) := io.multiCLK(8) - cdrInSample.multiCLK(3) := io.multiCLK(12) - cdrInAxis.io.syncSerDat := cdrInSample.io.syncSerDat - - - cdrInSample.io.serDat := cdrOut.io.serDat - - - - val isTxEnd = cdrOut.io.axis.fire & cdrOut.io.axis.bits.tlast - - cdrOut.io.axis.valid := ~io.flush & ShiftRegisters( ~isTxEnd, 32 ).reduce(_&_) - cdrOut.io.axis.bits.tdata := io.data - cdrOut.io.axis.bits.tuser := false.B - cdrOut.io.axis.bits.tlast := dataCnt === (payloadLen - 1.U) - - - - - cdrInAxis.io.axis.ready := true.B - - io.isFailed := cdrInAxis.io.axis.fire & (asyncFifo.io.datar =/= cdrInAxis.io.axis.bits.tdata) - io.isSuccess := cdrInAxis.io.axis.fire & cdrInAxis.io.axis.bits.tlast - - - - - val isUsing8b10b = true.B - - - when( isUsing8b10b ){ - b8b10Encoder.io <> cdrOut.io.encode - b8b10Decoder.io <> cdrInAxis.io.decode - - b4b5Encoder.io.isEnable := false.B - b4b5Encoder.io.dataIn := 0.U - b4b5Decoder.io.dataIn := 0.U - } .otherwise{ - b4b5Encoder.io <> cdrOut.io.encode - b4b5Decoder.io <> cdrInAxis.io.decode - - b8b10Encoder.io.isEnable := false.B - b8b10Encoder.io.dataIn := 0.U - b8b10Decoder.io.dataIn := 0.U - } - - - - - - - - asyncFifo.io.clockw := clock.asBool - asyncFifo.io.dataw := io.data - asyncFifo.io.addrw := wPtr(10,0) - asyncFifo.io.enw := cdrOut.io.axis.fire - - asyncFifo.io.clockr := io.multiCLK(0) - asyncFifo.io.addrr := rPtr(10,0) - asyncFifo.io.enr := true.B - - when( cdrOut.io.axis.fire ){ - wPtr := wPtr + 1.U - } - - when( cdrInAxis.io.axis.fire ){ - rPtr := rPtr + 1.U - } - - val isFull = (wPtr ^ rPtr) === (1.U << log2Ceil(2048)) - assert(~isFull) - - - - - val coverData = RegInit(VecInit(Seq.fill(512){false.B})) - when( cdrOut.io.axis.fire ){ - for( i <- 0 until 256 ){ - when( io.data === i.U ){ - when( b8b10Encoder.rdTest ){ - coverData(i) := true.B - } .otherwise{ - coverData(256+i) := true.B - } - } - } - } - - // val coverData = RegInit(VecInit(Seq.fill(256){false.B})) - // when( cdrOut.io.axis.fire ){ - // for( i <- 0 until 256 ){ - // when( io.data === i.U ){ - // coverData(i) := true.B - // } - // } - // } - - val coverage = PopCount(coverData.asUInt) - when( io.isSuccess ){ - printf( cf"Coverage: ${coverage}\n") - } - -} - - +package BACK + +import chisel3._ +import chisel3.util._ + + + +class SimCDR extends Module with RequireAsyncReset{ + val io = IO(new Bundle{ + val data = Input( UInt(8.W) ) + + val multiCLK = Input(Vec(16, Bool())) + + val flush = Input(Bool()) + + val isSuccess = Output(Bool()) + val isFailed = Output(Bool()) + }) + + + + + val cdrInAxis = Module(new CDRInAxis) + val cdrInSample = Module(new CDRInMultiSample(clkNum = 4)) + + val cdrOut = Module(new CDROut) + + val dataCnt = RegInit(0.U(12.W)) + val payloadLen = RegInit(("hFFF".U)(12.W)) + + val b4b5Encoder = Module(new b4b5DualEncode) + val b4b5Decoder = Module(new b4b5DualDecode) + + val b8b10Encoder = Module(new b8b10Encode) + val b8b10Decoder = Module(new b8b10Decode) + + val wPtr = RegInit(0.U(12.W)) + val rPtr = withClockAndReset( io.multiCLK(0).asClock, reset ) { RegInit(0.U(12.W)) } + + val asyncFifo = Module(new ShareSRAM2k) + + when( cdrOut.io.axis.fire & dataCnt === 0.U ){ + payloadLen := Cat( io.data, 0.U(4.W) ) + } .elsewhen( cdrOut.io.axis.fire & dataCnt === 1.U ){ + payloadLen := Cat( payloadLen(11,4), io.data(7,4) ) + 4.U + 4.U + } + + when( cdrOut.io.axis.fire ){ + when( dataCnt >= payloadLen - 1.U ){ + dataCnt := 0.U + } .otherwise{ + dataCnt := dataCnt + 1.U + } + } + + + cdrOut.io.flush := io.flush + + cdrInAxis.clock := io.multiCLK(0).asClock + cdrInSample.clock := io.multiCLK(0).asClock + cdrInAxis.io.flush := io.flush + + // cdrInSample.multiCLK := io.multiCLK + cdrInSample.multiCLK(0) := io.multiCLK(0) + cdrInSample.multiCLK(1) := io.multiCLK(4) + cdrInSample.multiCLK(2) := io.multiCLK(8) + cdrInSample.multiCLK(3) := io.multiCLK(12) + cdrInAxis.io.syncSerDat := cdrInSample.io.syncSerDat + + + cdrInSample.io.serDat := cdrOut.io.serDat + + + + val isTxEnd = cdrOut.io.axis.fire & cdrOut.io.axis.bits.tlast + + cdrOut.io.axis.valid := ~io.flush & ShiftRegisters( ~isTxEnd, 32 ).reduce(_&_) + cdrOut.io.axis.bits.tdata := io.data + cdrOut.io.axis.bits.tuser := false.B + cdrOut.io.axis.bits.tlast := dataCnt === (payloadLen - 1.U) + + + + + cdrInAxis.io.axis.ready := true.B + + io.isFailed := cdrInAxis.io.axis.fire & (asyncFifo.io.datar =/= cdrInAxis.io.axis.bits.tdata) + io.isSuccess := cdrInAxis.io.axis.fire & cdrInAxis.io.axis.bits.tlast + + + + + val isUsing8b10b = true.B + + + when( isUsing8b10b ){ + b8b10Encoder.io <> cdrOut.io.encode + b8b10Decoder.io <> cdrInAxis.io.decode + + b4b5Encoder.io.isEnable := false.B + b4b5Encoder.io.dataIn := 0.U + b4b5Decoder.io.dataIn := 0.U + } .otherwise{ + b4b5Encoder.io <> cdrOut.io.encode + b4b5Decoder.io <> cdrInAxis.io.decode + + b8b10Encoder.io.isEnable := false.B + b8b10Encoder.io.dataIn := 0.U + b8b10Decoder.io.dataIn := 0.U + } + + + + + + + + asyncFifo.io.clockw := clock.asBool + asyncFifo.io.dataw := io.data + asyncFifo.io.addrw := wPtr(10,0) + asyncFifo.io.enw := cdrOut.io.axis.fire + + asyncFifo.io.clockr := io.multiCLK(0) + asyncFifo.io.addrr := rPtr(10,0) + asyncFifo.io.enr := true.B + + when( cdrOut.io.axis.fire ){ + wPtr := wPtr + 1.U + } + + when( cdrInAxis.io.axis.fire ){ + rPtr := rPtr + 1.U + } + + val isFull = (wPtr ^ rPtr) === (1.U << log2Ceil(2048)) + assert(~isFull) + + + + + val coverData = RegInit(VecInit(Seq.fill(512){false.B})) + when( cdrOut.io.axis.fire ){ + for( i <- 0 until 256 ){ + when( io.data === i.U ){ + when( b8b10Encoder.rdTest ){ + coverData(i) := true.B + } .otherwise{ + coverData(256+i) := true.B + } + } + } + } + + // val coverData = RegInit(VecInit(Seq.fill(256){false.B})) + // when( cdrOut.io.axis.fire ){ + // for( i <- 0 until 256 ){ + // when( io.data === i.U ){ + // coverData(i) := true.B + // } + // } + // } + + val coverage = PopCount(coverData.asUInt) + when( io.isSuccess ){ + printf( cf"Coverage: ${coverage}\n") + } + +} + + diff --git a/src/test/scala/test.scala b/src/test/scala/test.scala index f20ef2a..e083bf1 100644 --- a/src/test/scala/test.scala +++ b/src/test/scala/test.scala @@ -1,23 +1,23 @@ -package test - - -import BACK._ - - -import chisel3._ -import chisel3.stage._ - - - - - -object testShinModule extends App { - (new chisel3.stage.ChiselStage).execute( Array("--target-dir", "generated/shin/", "-e", "verilog" ) ++ args, Seq( - ChiselGeneratorAnnotation(() => { new ShinTop }), - )) - - (new chisel3.stage.ChiselStage).execute( Array("--target-dir", "generated/SimCDR/", "-e", "verilog" ) ++ args, Seq( - ChiselGeneratorAnnotation(() => { new SimCDR }), - )) -} - +package test + + +import BACK._ + + +import chisel3._ +import chisel3.stage._ + + + + + +object testShinModule extends App { + (new chisel3.stage.ChiselStage).execute( Array("--target-dir", "generated/shin/", "-e", "verilog" ) ++ args, Seq( + ChiselGeneratorAnnotation(() => { new ShinTop }), + )) + + (new chisel3.stage.ChiselStage).execute( Array("--target-dir", "generated/SimCDR/", "-e", "verilog" ) ++ args, Seq( + ChiselGeneratorAnnotation(() => { new SimCDR }), + )) +} + diff --git a/tb/shinTest/Makefile_vcs b/tb/shinTest/Makefile_vcs index 716d928..aae0f7e 100644 --- a/tb/shinTest/Makefile_vcs +++ b/tb/shinTest/Makefile_vcs @@ -1,83 +1,83 @@ -.PHONY:com sim clean - -OUTPUT = shin_test -CPU_COUNT := $(shell nproc) -SPI_TYPE ?= -spi 0 -TRANS_CODE ?= -DEVCLK ?= --dev1 0 90 --dev2 0 -88 -CDR_TYPE ?= -cdr 0 - -VCS = vcs -sverilog +v2k -timescale=1ns/1ps \ - -full64 \ - -o ${OUTPUT} \ - -l compile.log \ - -debug_access+none \ - +define+VCS_COMPILE \ - -fastpartcomp=j${CPU_COUNT} \ - -SIM = ./${OUTPUT} -l run.log - -testShin_vcs: - python3 ./shinTest/gen_pkt.py ${SPI_TYPE} ${TRANS_CODE} - mkdir -p generated/log - rm -rf generated/log/* - @echo "Available CPUs: ${CPU_COUNT}" - ${VCS} -f ./shinTest_vcs.f 1>vcs_compile.log 2>&1 - ${SIM} - python3 ./shinTest/check_testcase.py - -testShinClk_vcs: - python3 ./shinTest/gen_pkt_clk.py ${DEVCLK} ${SPI_TYPE} ${TRANS_CODE} ${CDR_TYPE} - mkdir -p generated/log - rm -rf generated/log/* - ${VCS} -f ./shinTestClk_vcs.f 1>vcs_compile.log 2>&1 - ${SIM} - python3 ./shinTest/check_testcase.py - - -testShinMany_vcs: - python3 ./shinTest/gen_pkt_many_dev.py - mkdir -p generated/log - rm -rf generated/log/* - @echo "Available CPUs: ${CPU_COUNT}" - ${VCS} -f ./shinTest_vcs.f - ${SIM} - python3 ./shinTest/check_testcase.py - -sim: - ${SIM} - -testShin: - ./shinTest/gen_pkt.py ${SPI_TYPE} ${TRANS_CODE} - mkdir -p generated/log - rm -rf generated/log/* - iverilog -Wall \ - -o ./generated/shinTest.iverilog \ - -y ./generated/shin \ - -I ./generated/shin \ - -D RANDOMIZE_REG_INIT \ - ./shinTest/ShinTopSpiTb.v - vvp -N ./generated/shinTest.iverilog -lxt2 -fst || true - ./shinTest/check_testcase.py - -testShinClk: - ./shinTest/gen_pkt_clk.py ${DEVCLK} ${SPI_TYPE} ${TRANS_CODE} ${CDR_TYPE} - mkdir -p generated/log - rm -rf generated/log/* - iverilog -Wall \ - -o ./generated/shinTest_clk.iverilog \ - -y ./generated/shin \ - -I ./generated/shin \ - -D RANDOMIZE_REG_INIT \ - ./shinTest/ShinTopSpiTb_clk.v - vvp -N ./generated/shinTest_clk.iverilog -lxt2 -fst|| true - ./shinTest/check_testcase.py - -fstShin: - gtkwave ./generated/wave.fst 1>/dev/null 2>&1 & - -fstShinClk: - gtkwave ./generated/wave_clk.fst 1>/dev/null 2>&1 & - -clean: - rm -rf ./generated/log/* ./generated/shin/*.vh ./generated/shinTest.* ./generated/wave*.* ./generated/spi_trans*.* +.PHONY:com sim clean + +OUTPUT = shin_test +CPU_COUNT := $(shell nproc) +SPI_TYPE ?= -spi 0 +TRANS_CODE ?= +DEVCLK ?= --dev1 0 90 --dev2 0 -88 +CDR_TYPE ?= -cdr 0 + +VCS = vcs -sverilog +v2k -timescale=1ns/1ps \ + -full64 \ + -o ${OUTPUT} \ + -l compile.log \ + -debug_access+none \ + +define+VCS_COMPILE \ + -fastpartcomp=j${CPU_COUNT} \ + +SIM = ./${OUTPUT} -l run.log + +testShin_vcs: + python3 ./shinTest/gen_pkt.py ${SPI_TYPE} ${TRANS_CODE} + mkdir -p generated/log + rm -rf generated/log/* + @echo "Available CPUs: ${CPU_COUNT}" + ${VCS} -f ./shinTest_vcs.f 1>vcs_compile.log 2>&1 + ${SIM} + python3 ./shinTest/check_testcase.py + +testShinClk_vcs: + python3 ./shinTest/gen_pkt_clk.py ${DEVCLK} ${SPI_TYPE} ${TRANS_CODE} ${CDR_TYPE} + mkdir -p generated/log + rm -rf generated/log/* + ${VCS} -f ./shinTestClk_vcs.f 1>vcs_compile.log 2>&1 + ${SIM} + python3 ./shinTest/check_testcase.py + + +testShinMany_vcs: + python3 ./shinTest/gen_pkt_many_dev.py + mkdir -p generated/log + rm -rf generated/log/* + @echo "Available CPUs: ${CPU_COUNT}" + ${VCS} -f ./shinTest_vcs.f + ${SIM} + python3 ./shinTest/check_testcase.py + +sim: + ${SIM} + +testShin: + ./shinTest/gen_pkt.py ${SPI_TYPE} ${TRANS_CODE} + mkdir -p generated/log + rm -rf generated/log/* + iverilog -Wall \ + -o ./generated/shinTest.iverilog \ + -y ./generated/shin \ + -I ./generated/shin \ + -D RANDOMIZE_REG_INIT \ + ./shinTest/ShinTopSpiTb.v + vvp -N ./generated/shinTest.iverilog -lxt2 -fst || true + ./shinTest/check_testcase.py + +testShinClk: + ./shinTest/gen_pkt_clk.py ${DEVCLK} ${SPI_TYPE} ${TRANS_CODE} ${CDR_TYPE} + mkdir -p generated/log + rm -rf generated/log/* + iverilog -Wall \ + -o ./generated/shinTest_clk.iverilog \ + -y ./generated/shin \ + -I ./generated/shin \ + -D RANDOMIZE_REG_INIT \ + ./shinTest/ShinTopSpiTb_clk.v + vvp -N ./generated/shinTest_clk.iverilog -lxt2 -fst|| true + ./shinTest/check_testcase.py + +fstShin: + gtkwave ./generated/wave.fst 1>/dev/null 2>&1 & + +fstShinClk: + gtkwave ./generated/wave_clk.fst 1>/dev/null 2>&1 & + +clean: + rm -rf ./generated/log/* ./generated/shin/*.vh ./generated/shinTest.* ./generated/wave*.* ./generated/spi_trans*.* diff --git a/tb/shinTest/ShinTopSpiTb.v b/tb/shinTest/ShinTopSpiTb.v index cde2183..c1f3a96 100644 --- a/tb/shinTest/ShinTopSpiTb.v +++ b/tb/shinTest/ShinTopSpiTb.v @@ -1,998 +1,998 @@ -`timescale 1 ns / 1 ps - -module ShinTopSpiTb( - -); - - reg clock; - reg reset; - reg clk8x; - - reg [15:0] multiCLK; - - -`include "dev_predef.vh" - -`ifdef DEFINE_SLAVE_DEVICE - `define DEV_NUM 4 //slave num - `define ALL_DEV_NUM (`DEV_NUM + 1) // slave + master - `define SPI_CSN_NUM (`ALL_DEV_NUM * 4) - - `define HW_SERIAL 0 //48'h31303050584c //(48'h4c5850303031) - - `define IQSPI_PINS(N) (`N*4+3):(`N*4) - `define EQSPI_PINS(N) ((`N + `ALL_DEV_NUM)*4+3):((`N + `ALL_DEV_NUM)*4) - //`define AQSPI_PINS(N) ((`N + `ALL_DEV_NUM)*4+3):((`N + `ALL_DEV_NUM)*4) - - `define IQSPI_MISO(N) qspi_miso[`IQSPI_PINS(`N)] - `define EQSPI_MISO(N) qspi_miso[`EQSPI_PINS(`N)] - - `define IQSPI_CSN_NUM(id) (`id) - `define ESPI_CSN_NUM(id) ((`id)+(`ALL_DEV_NUM)) - `define EQSPI_CSN_NUM(id) ((`id)+(`ALL_DEV_NUM)*2) - //`define AQSPI_CSN_NUM(id) ((`id)+(`ALL_DEV_NUM)*3) - - - `define IQSPI_CSN(id) spi_csn[`IQSPI_CSN_NUM(`id)] - `define ESPI_CSN(id) spi_csn[`ESPI_CSN_NUM(`id)] - `define EQSPI_CSN(id) spi_csn[`EQSPI_CSN_NUM(`id)] - //`define AQSPI_CSN(id) spi_csn[`AQSPI_CSN_NUM(`id)] - - `define QSPI_MUX_MISO_INIT \ - (`IQSPI_MISO(0) & ~{4{`IQSPI_CSN(0)}}) |\ - (`IQSPI_MISO(1) & ~{4{`IQSPI_CSN(1)}}) |\ - (`IQSPI_MISO(2) & ~{4{`IQSPI_CSN(2)}}) |\ - (`IQSPI_MISO(3) & ~{4{`IQSPI_CSN(3)}}) |\ - (`IQSPI_MISO(4) & ~{4{`IQSPI_CSN(4)}}) |\ - (`EQSPI_MISO(0) & ~{4{`EQSPI_CSN(0)}}) |\ - (`EQSPI_MISO(1) & ~{4{`EQSPI_CSN(1)}}) |\ - (`EQSPI_MISO(2) & ~{4{`EQSPI_CSN(2)}}) |\ - (`EQSPI_MISO(3) & ~{4{`EQSPI_CSN(3)}}) |\ - (`EQSPI_MISO(4) & ~{4{`EQSPI_CSN(4)}}) - `define SPI_MUX_MISO_INIT \ - ( spi_miso[0] & ~`ESPI_CSN(0)) |\ - ( spi_miso[1] & ~`ESPI_CSN(1)) |\ - ( spi_miso[2] & ~`ESPI_CSN(2)) |\ - ( spi_miso[3] & ~`ESPI_CSN(3)) |\ - ( spi_miso[4] & ~`ESPI_CSN(4)) -`endif - wire [(`DEV_NUM - 1):0] dDat_w; - wire [(`DEV_NUM - 1):0] uDat_w; - - wire spi_sck; - wire spi_mosi; - wire [(`ALL_DEV_NUM - 1):0] spi_miso; - reg [(`SPI_CSN_NUM - 1):0] spi_csn; - - wire qspi_sck; - wire [3:0] qspi_mosi; - //wire [40-1:0] qspi_miso; - wire [(`ALL_DEV_NUM * 4 * 3 - 1):0] qspi_miso; - - integer spidata_file; - integer c_line; - integer _pos; - integer _len; - integer _t_start; - integer _t_end; - reg [63:0] _temp_time; - reg _reset_deactive; - - wire [(`ALL_DEV_NUM - 1):0] isSoftReset; - reg [(`ALL_DEV_NUM - 1):0] isSoftReset_reg; - - generate - for( genvar i = 0; i < `ALL_DEV_NUM; i = i + 1 ) begin - always @(posedge clock or posedge reset) begin - if(reset) isSoftReset_reg[i] <= 1'b0; - else isSoftReset_reg[i] <= isSoftReset[i]; - end - end - endgenerate - - - wire [`DEV_NUM:0] io_int_sig; - - reg latch0; - reg latch1; - - - -ShinTop s_ShinTop_Mst( - .clock(clock), - .reset(reset | isSoftReset_reg[0]), - - .io_multiCLK_0(multiCLK[0]), - .io_multiCLK_1(multiCLK[1]), - .io_multiCLK_2(multiCLK[2]), - .io_multiCLK_3(multiCLK[3]), - .io_multiCLK_4(multiCLK[4]), - .io_multiCLK_5(multiCLK[5]), - .io_multiCLK_6(multiCLK[6]), - .io_multiCLK_7(multiCLK[7]), - .io_multiCLK_8(multiCLK[8]), - .io_multiCLK_9(multiCLK[9]), - .io_multiCLK_10(multiCLK[10]), - .io_multiCLK_11(multiCLK[11]), - .io_multiCLK_12(multiCLK[12]), - .io_multiCLK_13(multiCLK[13]), - .io_multiCLK_14(multiCLK[14]), - .io_multiCLK_15(multiCLK[15]), - - .io_multiCLKDiv4_0(multiCLK[0]), - .io_multiCLKDiv4_1(multiCLK[4]), - .io_multiCLKDiv4_2(multiCLK[8]), - .io_multiCLKDiv4_3(multiCLK[12]), - - .io_dDatIn(1'b0), - .io_dDatOut(dDat_w[0]), - .io_uDatIn(uDat_w[0]), - .io_uDatOut(), - - .io_iqspi_sck(qspi_sck), - .io_iqspi_mosi(qspi_mosi), - .io_iqspi_miso(`IQSPI_MISO(0)), - .io_iqspi_isDirIn(), - .io_iqspi_csn(`IQSPI_CSN(0)), - - .io_ospi_sck (spi_sck), - .io_ospi_mosi(spi_mosi), - .io_ospi_miso(spi_miso[0]), - .io_ospi_csn (`ESPI_CSN(0)), - - - .io_oqspi_sck(qspi_sck), - .io_oqspi_mosi(qspi_mosi), - .io_oqspi_miso(`EQSPI_MISO(0)), - .io_oqspi_isDirIn(), - .io_oqspi_csn(`EQSPI_CSN(0)), - - .io_aqspi_sck(qspi_sck), - .io_aqspi_mosi(qspi_mosi), - .io_aqspi_miso(`AQSPI_MISO(0)), - .io_aqspi_isDirIn(), - .io_aqspi_csn(`AQSPI_CSN(0)), - - .io_isSoftReset(isSoftReset[0]), - .io_interrupt(io_int_sig[0]), - .io_latchPin_0(latch0), - .io_latchPin_1(latch1), - .io_hwSerial(`HW_SERIAL), - .io_uniCode(64'h0) -); - -`include "slave_dev_def.vh" - -`ifdef DEFINE_SLAVE_DEVICE -ShinTop s_ShinTop_slv0( - .clock(clock), - .reset(reset | isSoftReset_reg[1]), - - .io_multiCLK_0(multiCLK[0]), - .io_multiCLK_1(multiCLK[1]), - .io_multiCLK_2(multiCLK[2]), - .io_multiCLK_3(multiCLK[3]), - .io_multiCLK_4(multiCLK[4]), - .io_multiCLK_5(multiCLK[5]), - .io_multiCLK_6(multiCLK[6]), - .io_multiCLK_7(multiCLK[7]), - .io_multiCLK_8(multiCLK[8]), - .io_multiCLK_9(multiCLK[9]), - .io_multiCLK_10(multiCLK[10]), - .io_multiCLK_11(multiCLK[11]), - .io_multiCLK_12(multiCLK[12]), - .io_multiCLK_13(multiCLK[13]), - .io_multiCLK_14(multiCLK[14]), - .io_multiCLK_15(multiCLK[15]), - - .io_dDatIn(dDat_w[0]), - .io_dDatOut(dDat_w[1]), - .io_uDatIn(uDat_w[1]), - .io_uDatOut(uDat_w[0]), - - .io_iqspi_sck(qspi_sck), - .io_iqspi_mosi(qspi_mosi), - .io_iqspi_miso(`IQSPI_MISO(1)), - .io_iqspi_isDirIn(), - .io_iqspi_csn(`IQSPI_CSN(1)), - - .io_ospi_sck (spi_sck), - .io_ospi_mosi(spi_mosi), - .io_ospi_miso(spi_miso[1]), - .io_ospi_csn (`ESPI_CSN(1)), - - .io_oqspi_sck(qspi_sck), - .io_oqspi_mosi(qspi_mosi), - .io_oqspi_miso(`EQSPI_MISO(1)), - .io_oqspi_isDirIn(), - .io_oqspi_csn(`EQSPI_CSN(1)), - - .io_isSoftReset(isSoftReset[1]), - .io_interrupt(io_int_sig[1]), - .io_latchPin_0(latch0), - .io_latchPin_1(latch1), - .io_hwSerial(`HW_SERIAL), - .io_uniCode(0) -); - -ShinTop s_ShinTop_slv1( - .clock(clock), - .reset(reset | isSoftReset_reg[2]), - - .io_multiCLK_0(multiCLK[0]), - .io_multiCLK_1(multiCLK[1]), - .io_multiCLK_2(multiCLK[2]), - .io_multiCLK_3(multiCLK[3]), - .io_multiCLK_4(multiCLK[4]), - .io_multiCLK_5(multiCLK[5]), - .io_multiCLK_6(multiCLK[6]), - .io_multiCLK_7(multiCLK[7]), - .io_multiCLK_8(multiCLK[8]), - .io_multiCLK_9(multiCLK[9]), - .io_multiCLK_10(multiCLK[10]), - .io_multiCLK_11(multiCLK[11]), - .io_multiCLK_12(multiCLK[12]), - .io_multiCLK_13(multiCLK[13]), - .io_multiCLK_14(multiCLK[14]), - .io_multiCLK_15(multiCLK[15]), - - .io_dDatIn(dDat_w[1]), - .io_dDatOut(dDat_w[2]), - .io_uDatIn(uDat_w[2]), - .io_uDatOut(uDat_w[1]), - - .io_iqspi_sck(qspi_sck), - .io_iqspi_mosi(qspi_mosi), - .io_iqspi_miso(`IQSPI_MISO(2)), - .io_iqspi_isDirIn(), - .io_iqspi_csn(`IQSPI_CSN(2)), - - .io_ospi_sck (spi_sck), - .io_ospi_mosi(spi_mosi), - .io_ospi_miso(spi_miso[2]), - .io_ospi_csn (`ESPI_CSN(2)), - - .io_oqspi_sck(qspi_sck), - .io_oqspi_mosi(qspi_mosi), - .io_oqspi_miso(`EQSPI_MISO(2)), - .io_oqspi_isDirIn(), - .io_oqspi_csn(`EQSPI_CSN(2)), - - .io_isSoftReset(isSoftReset[2]), - .io_interrupt(io_int_sig[2]), - .io_latchPin_0(latch0), - .io_latchPin_1(latch1), - .io_hwSerial(`HW_SERIAL), - .io_uniCode(0) -); - -ShinTop s_ShinTop_slv2( - .clock(clock), - .reset(reset | isSoftReset_reg[3]), - - .io_multiCLK_0(multiCLK[0]), - .io_multiCLK_1(multiCLK[1]), - .io_multiCLK_2(multiCLK[2]), - .io_multiCLK_3(multiCLK[3]), - .io_multiCLK_4(multiCLK[4]), - .io_multiCLK_5(multiCLK[5]), - .io_multiCLK_6(multiCLK[6]), - .io_multiCLK_7(multiCLK[7]), - .io_multiCLK_8(multiCLK[8]), - .io_multiCLK_9(multiCLK[9]), - .io_multiCLK_10(multiCLK[10]), - .io_multiCLK_11(multiCLK[11]), - .io_multiCLK_12(multiCLK[12]), - .io_multiCLK_13(multiCLK[13]), - .io_multiCLK_14(multiCLK[14]), - .io_multiCLK_15(multiCLK[15]), - - .io_dDatIn(dDat_w[2]), - .io_dDatOut(dDat_w[3]), - .io_uDatIn(uDat_w[3]), - .io_uDatOut(uDat_w[2]), - - .io_iqspi_sck(qspi_sck), - .io_iqspi_mosi(qspi_mosi), - .io_iqspi_miso(`IQSPI_MISO(3)), - .io_iqspi_isDirIn(), - .io_iqspi_csn(`IQSPI_CSN(3)), - - .io_ospi_sck (spi_sck), - .io_ospi_mosi(spi_mosi), - .io_ospi_miso(spi_miso[3]), - .io_ospi_csn (`ESPI_CSN(3)), - - .io_oqspi_sck(qspi_sck), - .io_oqspi_mosi(qspi_mosi), - .io_oqspi_miso(`EQSPI_MISO(3)), - .io_oqspi_isDirIn(), - .io_oqspi_csn(`EQSPI_CSN(3)), - - .io_isSoftReset(isSoftReset[3]), - .io_interrupt(io_int_sig[3]), - .io_latchPin_0(latch0), - .io_latchPin_1(latch1), - .io_hwSerial(`HW_SERIAL), - .io_uniCode(0) -); - -ShinTop s_ShinTop_slv3( - .clock(clock), - .reset(reset | isSoftReset_reg[4]), - - .io_multiCLK_0(multiCLK[0]), - .io_multiCLK_1(multiCLK[1]), - .io_multiCLK_2(multiCLK[2]), - .io_multiCLK_3(multiCLK[3]), - .io_multiCLK_4(multiCLK[4]), - .io_multiCLK_5(multiCLK[5]), - .io_multiCLK_6(multiCLK[6]), - .io_multiCLK_7(multiCLK[7]), - .io_multiCLK_8(multiCLK[8]), - .io_multiCLK_9(multiCLK[9]), - .io_multiCLK_10(multiCLK[10]), - .io_multiCLK_11(multiCLK[11]), - .io_multiCLK_12(multiCLK[12]), - .io_multiCLK_13(multiCLK[13]), - .io_multiCLK_14(multiCLK[14]), - .io_multiCLK_15(multiCLK[15]), - - .io_dDatIn(dDat_w[3]), - .io_dDatOut(), - .io_uDatIn(1'b0), - .io_uDatOut(uDat_w[3]), - - .io_iqspi_sck(qspi_sck), - .io_iqspi_mosi(qspi_mosi), - .io_iqspi_miso(`IQSPI_MISO(4)), - .io_iqspi_isDirIn(), - .io_iqspi_csn(`IQSPI_CSN(4)), - - .io_ospi_sck (spi_sck), - .io_ospi_mosi(spi_mosi), - .io_ospi_miso(spi_miso[4]), - .io_ospi_csn (`ESPI_CSN(4)), - - .io_oqspi_sck(qspi_sck), - .io_oqspi_mosi(qspi_mosi), - .io_oqspi_miso(`EQSPI_MISO(4)), - .io_oqspi_isDirIn(), - .io_oqspi_csn(`EQSPI_CSN(4)), - - .io_isSoftReset(isSoftReset[4]), - .io_interrupt(io_int_sig[4]), - .io_latchPin_0(latch0), - .io_latchPin_1(latch1), - .io_hwSerial(`HW_SERIAL), - .io_uniCode(0) -); -`endif - -initial begin - clock = 0; - clk8x = 0; - reset = 1; - - latch0 = 0; - latch1 = 0; - - _reset_deactive = 1'b0; - - $timeformat(-9, 2, " ns", 8); - - spi_csn = {`SPI_CSN_NUM{1'b1}}; //~15'b0; - - #100 - reset <= 1; - - #240 - reset <= 0; - -//#20000000 - #1000000000 -`ifdef USING_OSPI - #1000000000 - #1000000000 -`endif -//#5000000 - - $display("Time Out !!!"); - $fclose(spidata_file); - //$stop; - $finish; -end - -initial begin - forever begin #20 clk8x <= ~clk8x; end -end - -initial begin - forever begin #80 clock <= ~clock; end -end - - -generate - for( genvar i = 0; i < 16; i = i + 1 ) begin - initial begin - multiCLK[i] = 0; - for( integer j = 0; j < i; j = j + 1 ) begin - #10 - ; - end - forever begin #80 multiCLK[i] <= ~multiCLK[i]; end - end - end -endgenerate - - - -initial -begin - spidata_file = $fopen("spi_trans_data.txt", "w"); - if (!spidata_file) $display("文件打开失败"); - - `ifdef VCS_COMPILE - $dumpfile("./generated/wave.vcd"); //生成的vcd文件名称 - $dumpvars(0, ShinTopSpiTb);//tb模块名称 - //$dumpvars(0, ShinTopSpiTb.s_ShinTop_Mst);//tb模块名称 - //$dumpvars(0, ShinTopSpiTb.s_ShinTop_slv124);//tb模块名称 - //$dumpvars(0, ShinTopSpiTb.s_ShinTop_slv125);//tb模块名称 - //$dumpvars(0, ShinTopSpiTb.s_ShinTop_slv126);//tb模块名称 - //$dumpvars(0, ShinTopSpiTb.s_ShinTop_slv127);//tb模块名称 - `endif - - `ifdef IVERILOG_COMPILE - $dumpfile("./generated/wave.fst"); //生成的fst文件名称 - $dumpvars(0, ShinTopSpiTb);//tb模块名称 - `endif -end - -always @(posedge reset) begin - _reset_deactive <= 1'b0; -end - -always @(negedge reset) begin - _reset_deactive <= 1'b1; -end - - `define SCKFRE #640 - - reg sck = 0; - - initial begin - forever begin - `SCKFRE sck <= ~sck; - end - end - - assign spi_sck = sck; - assign qspi_sck = sck; - - - reg [7:0] txBuf[0:2047]; - reg [7:0] rxBuf[0:2047]; - reg [7:0] exChangeRego; - reg [7:0] exChangeRegi; - - - - assign spi_mosi = exChangeRego[7]; - assign qspi_mosi = exChangeRego[7:4]; - - wire [3:0] qspi_mux_miso = `QSPI_MUX_MISO_INIT; - //( qspi_miso[4*0+3:4*0] & ~{4{spi_csn[ 0]}}) | - //( qspi_miso[4*1+3:4*1] & ~{4{spi_csn[ 1]}}) | - //( qspi_miso[4*2+3:4*2] & ~{4{spi_csn[ 2]}}) | - //( qspi_miso[4*3+3:4*3] & ~{4{spi_csn[ 3]}}) | - //( qspi_miso[4*4+3:4*4] & ~{4{spi_csn[ 4]}}) | - //( qspi_miso[4*5+3:4*5] & ~{4{spi_csn[10]}}) | - //( qspi_miso[4*6+3:4*6] & ~{4{spi_csn[11]}}) | - //( qspi_miso[4*7+3:4*7] & ~{4{spi_csn[12]}}) | - //( qspi_miso[4*8+3:4*8] & ~{4{spi_csn[13]}}) | - //( qspi_miso[4*9+3:4*9] & ~{4{spi_csn[14]}}); - /* - (`IQSPI_MISO(0) & ~{4{`IQSPI_CSN(0)}}) | - (`IQSPI_MISO(1) & ~{4{`IQSPI_CSN(1)}}) | - (`IQSPI_MISO(2) & ~{4{`IQSPI_CSN(2)}}) | - (`IQSPI_MISO(3) & ~{4{`IQSPI_CSN(3)}}) | - (`IQSPI_MISO(4) & ~{4{`IQSPI_CSN(4)}}) | - (`EQSPI_MISO(0) & ~{4{`EQSPI_CSN(0)}}) | - (`EQSPI_MISO(1) & ~{4{`EQSPI_CSN(1)}}) | - (`EQSPI_MISO(2) & ~{4{`EQSPI_CSN(2)}}) | - (`EQSPI_MISO(3) & ~{4{`EQSPI_CSN(3)}}) | - (`EQSPI_MISO(4) & ~{4{`EQSPI_CSN(4)}}); - */ - - wire spi_mux_miso = `SPI_MUX_MISO_INIT; - //( spi_miso[0] & ~spi_csn[5] ) | - //( spi_miso[1] & ~spi_csn[6] ) | - //( spi_miso[2] & ~spi_csn[7] ) | - //( spi_miso[3] & ~spi_csn[8] ) | - //( spi_miso[4] & ~spi_csn[9] ); - /* - ( spi_miso[0] & ~`ESPI_CSN(0)) | - ( spi_miso[1] & ~`ESPI_CSN(1)) | - ( spi_miso[2] & ~`ESPI_CSN(2)) | - ( spi_miso[3] & ~`ESPI_CSN(3)) | - ( spi_miso[4] & ~`ESPI_CSN(4)); - */ - - reg isReq = 0; - reg isBusy = 0; - - reg [11:0] length; - reg [16:0] idx; - - reg [11:0] transCnt; - reg [11:0] byteCnt; - reg [2:0] bitCnt; - - -always @(posedge clock) begin - if( isReq & sck == 0 ) begin - isBusy <= #5 1'b1; - transCnt <= #5 0; - - byteCnt <= #5 ~12'b0; - bitCnt <= #5 ~3'b0; - - spi_csn[idx] <= #5 1'b0; - exChangeRego <= txBuf[0]; - end -end - -//DEV_NUM -//ALL_DEV_NUM -wire isQspi = (idx >= 0 && idx <= (`ALL_DEV_NUM - 1)) || idx >= (`ALL_DEV_NUM * 2); -wire [11:0] nextByteCnt = byteCnt + 1; - -//输出 -always @(negedge sck) begin - if( isBusy ) begin - if( &bitCnt ) begin - exChangeRego <= txBuf[nextByteCnt]; - end else begin - exChangeRego <= isQspi ? exChangeRego << 4 : exChangeRego << 1; - end - end -end - -//输入 -always @(posedge sck) begin - if( isBusy ) begin - if( transCnt <= length ) begin - if( isQspi ) begin - bitCnt <= ~bitCnt; - end else begin - bitCnt <= bitCnt + 1; - end - if ( idx >= (`ALL_DEV_NUM * 3) ) begin - if( &bitCnt ) begin - byteCnt <= byteCnt +1; - transCnt <= transCnt + 1; - if( (txBuf[2] & 8'h80) === 8'h80 & nextByteCnt >= 5) begin - rxBuf[byteCnt] <= exChangeRegi; - //$display("spi read out %x", exChangeRegi); - end - if( (txBuf[2] & 8'h80) === 8'h80 & nextByteCnt >= 4) begin - exChangeRegi <= isQspi ? {exChangeRegi[3:0], qspi_mux_miso} : {exChangeRegi[6:0], spi_mux_miso}; - end else begin - exChangeRegi <= 0; - end - end else begin - exChangeRegi <= isQspi ? {exChangeRegi[3:0], qspi_mux_miso} : {exChangeRegi[6:0], spi_mux_miso}; - end - end else begin - if( &bitCnt ) begin - byteCnt <= byteCnt +1; - transCnt <= transCnt + 1; - if( txBuf[2] === 8'h80 & nextByteCnt >= 4) begin - rxBuf[byteCnt] <= exChangeRegi; - //$display("spi read out %x", exChangeRegi); - end - if( txBuf[2] === 8'h80 & nextByteCnt >= 3) begin - exChangeRegi <= isQspi ? {exChangeRegi[3:0], qspi_mux_miso} : {exChangeRegi[6:0], spi_mux_miso}; - end else begin - exChangeRegi <= 0; - end - end else begin - exChangeRegi <= isQspi ? {exChangeRegi[3:0], qspi_mux_miso} : {exChangeRegi[6:0], spi_mux_miso}; - end - end - end else begin - isBusy <= #5 1'b0; - spi_csn[idx] <= #5 1'b1; - end - end -end - - - - -//mst slv0~slv3的 内部qspi调用即设置 -//sidx为0~4;外部spi为5~9,外部qspi为10~15 -task spi_trans( input [15:0] saddress, input [7:0] scmd, input [12:0] slength, input [16:0] sidx ); - begin - txBuf[0] <= saddress[15:8]; - txBuf[1] <= saddress[7:0]; - if (sidx >=(`ALL_DEV_NUM * 3)) begin - txBuf[2] <= (scmd | slength[12:8]); - txBuf[3] <= slength[7:0]; - length <= slength + 4; - end else begin - txBuf[2] <= scmd; - length <= slength + 3; - end - - idx <= sidx; - - #5 - @(negedge sck) - isReq <= 1; - @(posedge sck) #5 - isReq <= 0; - - @( negedge isBusy) #1000 - begin - //$fwrite(spidata_file, "------------%5t------------\n", $realtime); - if (sidx >=(`ALL_DEV_NUM * 3)) begin - $fwrite(spidata_file, "T:%t \tdev:%4d(%4d), addr:0x%02h%02h, %s, len:%4d (0x%02h%02h)\n", - $realtime, - sidx % (`ALL_DEV_NUM), sidx, - txBuf[0], - txBuf[1], - (((txBuf[2] & 8'h80) == 0)? "Write":" Read"), - slength, - txBuf[2], txBuf[3]); - end else begin - $fwrite(spidata_file, "T:%t \tdev:%4d(%4d), addr:0x%02h%02h, %s, len:%4d\n", - $realtime, - sidx % (`ALL_DEV_NUM), sidx, - txBuf[0], - txBuf[1], - (((txBuf[2] & 8'h80) == 0)? "Write":" Read"), - slength); - end - - if (sidx >=(`ALL_DEV_NUM * 3)) begin _pos = 4; end - else begin _pos = 3; end - - if ( ((saddress == 16'h0800) - || (saddress == 16'h1000) - || (saddress == 16'h1800) - || (saddress == 16'h2000) - || (saddress == 16'h2800) - || (saddress == 16'h3000) - || (saddress == 16'h3800) - || (saddress == 16'h4000) - ) - && ((sidx == 0) - || (sidx == `ALL_DEV_NUM) - || (sidx == (`ALL_DEV_NUM * 2)) - || (sidx == (`ALL_DEV_NUM * 3)) - ) - ) begin - - for (integer _k = 0; _k < 4; _k++) begin - if (scmd == 0) begin - $fwrite(spidata_file, "%02h ", txBuf[_k + _pos]); - end else begin - $fwrite(spidata_file, "%02h ", rxBuf[_k + _pos]); - end - end - - $fwrite(spidata_file, "\n"); - _pos = 4 + _pos; - for (; _pos < slength; ) begin - for (integer _k = 0; _k < 6; _k++) begin - if (scmd == 0) begin - $fwrite(spidata_file, "%02h ", txBuf[_k + _pos]); - _len = txBuf[_pos + 5] + (txBuf[_pos + 4] & 8'h0f) * 256; - end else begin - $fwrite(spidata_file, "%02h ", rxBuf[_k + _pos]); - _len = rxBuf[_pos + 5] + (rxBuf[_pos + 4] & 8'h0f) * 256; - end - end - - begin:PRINT_PKT_COMMENT - integer dev; - integer addr_type; - integer addr; - integer cmd; - integer len; - - if (scmd == 0) begin - addr_type = txBuf[_pos + 1] & 8'h3; - dev = (txBuf[_pos] * 256) >> 2; - dev = dev + ((txBuf[_pos + 1] >> 2) & 8'hff); - addr = txBuf[_pos + 2] * 256 + (txBuf[_pos + 3] & 8'hff); - cmd = (txBuf[_pos + 4] >> 4) & 8'h0f; - len = (txBuf[_pos + 4] & 8'h0f) * 256 + (txBuf[_pos + 5] & 8'hff); - end else begin - addr_type = rxBuf[_pos + 1] & 8'h3; - dev = (rxBuf[_pos] * 256) >> 2; - dev = dev + ((rxBuf[_pos + 1] >> 2) & 8'hff); - addr = rxBuf[_pos + 2] * 256 + (rxBuf[_pos + 3] & 8'hff); - cmd = (rxBuf[_pos + 4] >> 4) & 8'h0f; - len = (rxBuf[_pos + 4] & 8'h0f) * 256 + (rxBuf[_pos + 5] & 8'hff); - end - - if (addr_type == 0) - $fwrite(spidata_file, "// type:%3d dev:%3d addr:0x%04x cmd:0x%1x len:%3d", addr_type, dev, addr[15:0], cmd[3:0], len); - else begin - addr = dev * 65536 + addr; - $fwrite(spidata_file, "// type:%3d addr:0x%08x cmd:0x%1x len:%3d", addr_type, addr, cmd[3:0], len); - end - end - - $fwrite(spidata_file, "\n{{ "); - _pos = _pos + 6; - for (integer _k = 0; _k < _len; _k++) begin - if (scmd == 0) begin - $fwrite(spidata_file, "%02h ", txBuf[_k + _pos]); - end else begin - $fwrite(spidata_file, "%02h ", rxBuf[_k + _pos]); - end - c_line = 0; - if ((_k + 2)%16 == 0) begin - $fwrite(spidata_file, "\n"); - c_line = 1; - end - end - $fwrite(spidata_file, "}}\n"); - _pos = _pos + _len; - - for (integer _k = 0; _k < 2; _k++) begin - if (scmd == 0) begin - $fwrite(spidata_file, "%02h ", txBuf[_k + _pos]); - end else begin - $fwrite(spidata_file, "%02h ", rxBuf[_k + _pos]); - end - end - _pos = _pos + 2; - $fwrite(spidata_file, "\n"); - end - end else begin - for (integer i=0; i=(`ALL_DEV_NUM * 3)) begin - txBuf[2] <= (`SPI_READ | 8'h0); - txBuf[3] <= 8'h04; - length = 8'h08; - //$display("using AQspi"); - end else begin - txBuf[2] <= `SPI_READ; - length = 8'h07; - //$display("using iqspi"); - end - - - idx = dev_idx; - - #5 - @(negedge sck) - isReq <= 1; - @(posedge sck) #5 - isReq <= 0; - - @( negedge isBusy) #1000 - begin - - end - #2000 - //$display("%x %x", rxBuf[3], rxBuf[6]); - if ((rxBuf[`ARRAY_IDX_OFF] & 8'h02) == 8'h02) - begin - is_run = 0; - end - if ((rxBuf[`ARRAY_IDX_OFF+3] & 8'h60) != 8'h00) - begin - $display("error occur"); - is_run = 0; - end - if (($realtime - st) >= 20000000.0) - begin - $display("comm timeout."); - is_run = 0; - end - end - end -endtask - - -initial begin - - #1000 - - - `include "tc_runlist.vh" - - #1000000 - $display("Testcase Finished! Time Out !!!"); - $fclose(spidata_file); - //$stop; - $finish; - -end - - -endmodule - +`timescale 1 ns / 1 ps + +module ShinTopSpiTb( + +); + + reg clock; + reg reset; + reg clk8x; + + reg [15:0] multiCLK; + + +`include "dev_predef.vh" + +`ifdef DEFINE_SLAVE_DEVICE + `define DEV_NUM 4 //slave num + `define ALL_DEV_NUM (`DEV_NUM + 1) // slave + master + `define SPI_CSN_NUM (`ALL_DEV_NUM * 4) + + `define HW_SERIAL 0 //48'h31303050584c //(48'h4c5850303031) + + `define IQSPI_PINS(N) (`N*4+3):(`N*4) + `define EQSPI_PINS(N) ((`N + `ALL_DEV_NUM)*4+3):((`N + `ALL_DEV_NUM)*4) + //`define AQSPI_PINS(N) ((`N + `ALL_DEV_NUM)*4+3):((`N + `ALL_DEV_NUM)*4) + + `define IQSPI_MISO(N) qspi_miso[`IQSPI_PINS(`N)] + `define EQSPI_MISO(N) qspi_miso[`EQSPI_PINS(`N)] + + `define IQSPI_CSN_NUM(id) (`id) + `define ESPI_CSN_NUM(id) ((`id)+(`ALL_DEV_NUM)) + `define EQSPI_CSN_NUM(id) ((`id)+(`ALL_DEV_NUM)*2) + //`define AQSPI_CSN_NUM(id) ((`id)+(`ALL_DEV_NUM)*3) + + + `define IQSPI_CSN(id) spi_csn[`IQSPI_CSN_NUM(`id)] + `define ESPI_CSN(id) spi_csn[`ESPI_CSN_NUM(`id)] + `define EQSPI_CSN(id) spi_csn[`EQSPI_CSN_NUM(`id)] + //`define AQSPI_CSN(id) spi_csn[`AQSPI_CSN_NUM(`id)] + + `define QSPI_MUX_MISO_INIT \ + (`IQSPI_MISO(0) & ~{4{`IQSPI_CSN(0)}}) |\ + (`IQSPI_MISO(1) & ~{4{`IQSPI_CSN(1)}}) |\ + (`IQSPI_MISO(2) & ~{4{`IQSPI_CSN(2)}}) |\ + (`IQSPI_MISO(3) & ~{4{`IQSPI_CSN(3)}}) |\ + (`IQSPI_MISO(4) & ~{4{`IQSPI_CSN(4)}}) |\ + (`EQSPI_MISO(0) & ~{4{`EQSPI_CSN(0)}}) |\ + (`EQSPI_MISO(1) & ~{4{`EQSPI_CSN(1)}}) |\ + (`EQSPI_MISO(2) & ~{4{`EQSPI_CSN(2)}}) |\ + (`EQSPI_MISO(3) & ~{4{`EQSPI_CSN(3)}}) |\ + (`EQSPI_MISO(4) & ~{4{`EQSPI_CSN(4)}}) + `define SPI_MUX_MISO_INIT \ + ( spi_miso[0] & ~`ESPI_CSN(0)) |\ + ( spi_miso[1] & ~`ESPI_CSN(1)) |\ + ( spi_miso[2] & ~`ESPI_CSN(2)) |\ + ( spi_miso[3] & ~`ESPI_CSN(3)) |\ + ( spi_miso[4] & ~`ESPI_CSN(4)) +`endif + wire [(`DEV_NUM - 1):0] dDat_w; + wire [(`DEV_NUM - 1):0] uDat_w; + + wire spi_sck; + wire spi_mosi; + wire [(`ALL_DEV_NUM - 1):0] spi_miso; + reg [(`SPI_CSN_NUM - 1):0] spi_csn; + + wire qspi_sck; + wire [3:0] qspi_mosi; + //wire [40-1:0] qspi_miso; + wire [(`ALL_DEV_NUM * 4 * 3 - 1):0] qspi_miso; + + integer spidata_file; + integer c_line; + integer _pos; + integer _len; + integer _t_start; + integer _t_end; + reg [63:0] _temp_time; + reg _reset_deactive; + + wire [(`ALL_DEV_NUM - 1):0] isSoftReset; + reg [(`ALL_DEV_NUM - 1):0] isSoftReset_reg; + + generate + for( genvar i = 0; i < `ALL_DEV_NUM; i = i + 1 ) begin + always @(posedge clock or posedge reset) begin + if(reset) isSoftReset_reg[i] <= 1'b0; + else isSoftReset_reg[i] <= isSoftReset[i]; + end + end + endgenerate + + + wire [`DEV_NUM:0] io_int_sig; + + reg latch0; + reg latch1; + + + +ShinTop s_ShinTop_Mst( + .clock(clock), + .reset(reset | isSoftReset_reg[0]), + + .io_multiCLK_0(multiCLK[0]), + .io_multiCLK_1(multiCLK[1]), + .io_multiCLK_2(multiCLK[2]), + .io_multiCLK_3(multiCLK[3]), + .io_multiCLK_4(multiCLK[4]), + .io_multiCLK_5(multiCLK[5]), + .io_multiCLK_6(multiCLK[6]), + .io_multiCLK_7(multiCLK[7]), + .io_multiCLK_8(multiCLK[8]), + .io_multiCLK_9(multiCLK[9]), + .io_multiCLK_10(multiCLK[10]), + .io_multiCLK_11(multiCLK[11]), + .io_multiCLK_12(multiCLK[12]), + .io_multiCLK_13(multiCLK[13]), + .io_multiCLK_14(multiCLK[14]), + .io_multiCLK_15(multiCLK[15]), + + .io_multiCLKDiv4_0(multiCLK[0]), + .io_multiCLKDiv4_1(multiCLK[4]), + .io_multiCLKDiv4_2(multiCLK[8]), + .io_multiCLKDiv4_3(multiCLK[12]), + + .io_dDatIn(1'b0), + .io_dDatOut(dDat_w[0]), + .io_uDatIn(uDat_w[0]), + .io_uDatOut(), + + .io_iqspi_sck(qspi_sck), + .io_iqspi_mosi(qspi_mosi), + .io_iqspi_miso(`IQSPI_MISO(0)), + .io_iqspi_isDirIn(), + .io_iqspi_csn(`IQSPI_CSN(0)), + + .io_ospi_sck (spi_sck), + .io_ospi_mosi(spi_mosi), + .io_ospi_miso(spi_miso[0]), + .io_ospi_csn (`ESPI_CSN(0)), + + + .io_oqspi_sck(qspi_sck), + .io_oqspi_mosi(qspi_mosi), + .io_oqspi_miso(`EQSPI_MISO(0)), + .io_oqspi_isDirIn(), + .io_oqspi_csn(`EQSPI_CSN(0)), + + .io_aqspi_sck(qspi_sck), + .io_aqspi_mosi(qspi_mosi), + .io_aqspi_miso(`AQSPI_MISO(0)), + .io_aqspi_isDirIn(), + .io_aqspi_csn(`AQSPI_CSN(0)), + + .io_isSoftReset(isSoftReset[0]), + .io_interrupt(io_int_sig[0]), + .io_latchPin_0(latch0), + .io_latchPin_1(latch1), + .io_hwSerial(`HW_SERIAL), + .io_uniCode(64'h0) +); + +`include "slave_dev_def.vh" + +`ifdef DEFINE_SLAVE_DEVICE +ShinTop s_ShinTop_slv0( + .clock(clock), + .reset(reset | isSoftReset_reg[1]), + + .io_multiCLK_0(multiCLK[0]), + .io_multiCLK_1(multiCLK[1]), + .io_multiCLK_2(multiCLK[2]), + .io_multiCLK_3(multiCLK[3]), + .io_multiCLK_4(multiCLK[4]), + .io_multiCLK_5(multiCLK[5]), + .io_multiCLK_6(multiCLK[6]), + .io_multiCLK_7(multiCLK[7]), + .io_multiCLK_8(multiCLK[8]), + .io_multiCLK_9(multiCLK[9]), + .io_multiCLK_10(multiCLK[10]), + .io_multiCLK_11(multiCLK[11]), + .io_multiCLK_12(multiCLK[12]), + .io_multiCLK_13(multiCLK[13]), + .io_multiCLK_14(multiCLK[14]), + .io_multiCLK_15(multiCLK[15]), + + .io_dDatIn(dDat_w[0]), + .io_dDatOut(dDat_w[1]), + .io_uDatIn(uDat_w[1]), + .io_uDatOut(uDat_w[0]), + + .io_iqspi_sck(qspi_sck), + .io_iqspi_mosi(qspi_mosi), + .io_iqspi_miso(`IQSPI_MISO(1)), + .io_iqspi_isDirIn(), + .io_iqspi_csn(`IQSPI_CSN(1)), + + .io_ospi_sck (spi_sck), + .io_ospi_mosi(spi_mosi), + .io_ospi_miso(spi_miso[1]), + .io_ospi_csn (`ESPI_CSN(1)), + + .io_oqspi_sck(qspi_sck), + .io_oqspi_mosi(qspi_mosi), + .io_oqspi_miso(`EQSPI_MISO(1)), + .io_oqspi_isDirIn(), + .io_oqspi_csn(`EQSPI_CSN(1)), + + .io_isSoftReset(isSoftReset[1]), + .io_interrupt(io_int_sig[1]), + .io_latchPin_0(latch0), + .io_latchPin_1(latch1), + .io_hwSerial(`HW_SERIAL), + .io_uniCode(0) +); + +ShinTop s_ShinTop_slv1( + .clock(clock), + .reset(reset | isSoftReset_reg[2]), + + .io_multiCLK_0(multiCLK[0]), + .io_multiCLK_1(multiCLK[1]), + .io_multiCLK_2(multiCLK[2]), + .io_multiCLK_3(multiCLK[3]), + .io_multiCLK_4(multiCLK[4]), + .io_multiCLK_5(multiCLK[5]), + .io_multiCLK_6(multiCLK[6]), + .io_multiCLK_7(multiCLK[7]), + .io_multiCLK_8(multiCLK[8]), + .io_multiCLK_9(multiCLK[9]), + .io_multiCLK_10(multiCLK[10]), + .io_multiCLK_11(multiCLK[11]), + .io_multiCLK_12(multiCLK[12]), + .io_multiCLK_13(multiCLK[13]), + .io_multiCLK_14(multiCLK[14]), + .io_multiCLK_15(multiCLK[15]), + + .io_dDatIn(dDat_w[1]), + .io_dDatOut(dDat_w[2]), + .io_uDatIn(uDat_w[2]), + .io_uDatOut(uDat_w[1]), + + .io_iqspi_sck(qspi_sck), + .io_iqspi_mosi(qspi_mosi), + .io_iqspi_miso(`IQSPI_MISO(2)), + .io_iqspi_isDirIn(), + .io_iqspi_csn(`IQSPI_CSN(2)), + + .io_ospi_sck (spi_sck), + .io_ospi_mosi(spi_mosi), + .io_ospi_miso(spi_miso[2]), + .io_ospi_csn (`ESPI_CSN(2)), + + .io_oqspi_sck(qspi_sck), + .io_oqspi_mosi(qspi_mosi), + .io_oqspi_miso(`EQSPI_MISO(2)), + .io_oqspi_isDirIn(), + .io_oqspi_csn(`EQSPI_CSN(2)), + + .io_isSoftReset(isSoftReset[2]), + .io_interrupt(io_int_sig[2]), + .io_latchPin_0(latch0), + .io_latchPin_1(latch1), + .io_hwSerial(`HW_SERIAL), + .io_uniCode(0) +); + +ShinTop s_ShinTop_slv2( + .clock(clock), + .reset(reset | isSoftReset_reg[3]), + + .io_multiCLK_0(multiCLK[0]), + .io_multiCLK_1(multiCLK[1]), + .io_multiCLK_2(multiCLK[2]), + .io_multiCLK_3(multiCLK[3]), + .io_multiCLK_4(multiCLK[4]), + .io_multiCLK_5(multiCLK[5]), + .io_multiCLK_6(multiCLK[6]), + .io_multiCLK_7(multiCLK[7]), + .io_multiCLK_8(multiCLK[8]), + .io_multiCLK_9(multiCLK[9]), + .io_multiCLK_10(multiCLK[10]), + .io_multiCLK_11(multiCLK[11]), + .io_multiCLK_12(multiCLK[12]), + .io_multiCLK_13(multiCLK[13]), + .io_multiCLK_14(multiCLK[14]), + .io_multiCLK_15(multiCLK[15]), + + .io_dDatIn(dDat_w[2]), + .io_dDatOut(dDat_w[3]), + .io_uDatIn(uDat_w[3]), + .io_uDatOut(uDat_w[2]), + + .io_iqspi_sck(qspi_sck), + .io_iqspi_mosi(qspi_mosi), + .io_iqspi_miso(`IQSPI_MISO(3)), + .io_iqspi_isDirIn(), + .io_iqspi_csn(`IQSPI_CSN(3)), + + .io_ospi_sck (spi_sck), + .io_ospi_mosi(spi_mosi), + .io_ospi_miso(spi_miso[3]), + .io_ospi_csn (`ESPI_CSN(3)), + + .io_oqspi_sck(qspi_sck), + .io_oqspi_mosi(qspi_mosi), + .io_oqspi_miso(`EQSPI_MISO(3)), + .io_oqspi_isDirIn(), + .io_oqspi_csn(`EQSPI_CSN(3)), + + .io_isSoftReset(isSoftReset[3]), + .io_interrupt(io_int_sig[3]), + .io_latchPin_0(latch0), + .io_latchPin_1(latch1), + .io_hwSerial(`HW_SERIAL), + .io_uniCode(0) +); + +ShinTop s_ShinTop_slv3( + .clock(clock), + .reset(reset | isSoftReset_reg[4]), + + .io_multiCLK_0(multiCLK[0]), + .io_multiCLK_1(multiCLK[1]), + .io_multiCLK_2(multiCLK[2]), + .io_multiCLK_3(multiCLK[3]), + .io_multiCLK_4(multiCLK[4]), + .io_multiCLK_5(multiCLK[5]), + .io_multiCLK_6(multiCLK[6]), + .io_multiCLK_7(multiCLK[7]), + .io_multiCLK_8(multiCLK[8]), + .io_multiCLK_9(multiCLK[9]), + .io_multiCLK_10(multiCLK[10]), + .io_multiCLK_11(multiCLK[11]), + .io_multiCLK_12(multiCLK[12]), + .io_multiCLK_13(multiCLK[13]), + .io_multiCLK_14(multiCLK[14]), + .io_multiCLK_15(multiCLK[15]), + + .io_dDatIn(dDat_w[3]), + .io_dDatOut(), + .io_uDatIn(1'b0), + .io_uDatOut(uDat_w[3]), + + .io_iqspi_sck(qspi_sck), + .io_iqspi_mosi(qspi_mosi), + .io_iqspi_miso(`IQSPI_MISO(4)), + .io_iqspi_isDirIn(), + .io_iqspi_csn(`IQSPI_CSN(4)), + + .io_ospi_sck (spi_sck), + .io_ospi_mosi(spi_mosi), + .io_ospi_miso(spi_miso[4]), + .io_ospi_csn (`ESPI_CSN(4)), + + .io_oqspi_sck(qspi_sck), + .io_oqspi_mosi(qspi_mosi), + .io_oqspi_miso(`EQSPI_MISO(4)), + .io_oqspi_isDirIn(), + .io_oqspi_csn(`EQSPI_CSN(4)), + + .io_isSoftReset(isSoftReset[4]), + .io_interrupt(io_int_sig[4]), + .io_latchPin_0(latch0), + .io_latchPin_1(latch1), + .io_hwSerial(`HW_SERIAL), + .io_uniCode(0) +); +`endif + +initial begin + clock = 0; + clk8x = 0; + reset = 1; + + latch0 = 0; + latch1 = 0; + + _reset_deactive = 1'b0; + + $timeformat(-9, 2, " ns", 8); + + spi_csn = {`SPI_CSN_NUM{1'b1}}; //~15'b0; + + #100 + reset <= 1; + + #240 + reset <= 0; + +//#20000000 + #1000000000 +`ifdef USING_OSPI + #1000000000 + #1000000000 +`endif +//#5000000 + + $display("Time Out !!!"); + $fclose(spidata_file); + //$stop; + $finish; +end + +initial begin + forever begin #20 clk8x <= ~clk8x; end +end + +initial begin + forever begin #80 clock <= ~clock; end +end + + +generate + for( genvar i = 0; i < 16; i = i + 1 ) begin + initial begin + multiCLK[i] = 0; + for( integer j = 0; j < i; j = j + 1 ) begin + #10 + ; + end + forever begin #80 multiCLK[i] <= ~multiCLK[i]; end + end + end +endgenerate + + + +initial +begin + spidata_file = $fopen("spi_trans_data.txt", "w"); + if (!spidata_file) $display("文件打开失败"); + + `ifdef VCS_COMPILE + $dumpfile("./generated/wave.vcd"); //生成的vcd文件名称 + $dumpvars(0, ShinTopSpiTb);//tb模块名称 + //$dumpvars(0, ShinTopSpiTb.s_ShinTop_Mst);//tb模块名称 + //$dumpvars(0, ShinTopSpiTb.s_ShinTop_slv124);//tb模块名称 + //$dumpvars(0, ShinTopSpiTb.s_ShinTop_slv125);//tb模块名称 + //$dumpvars(0, ShinTopSpiTb.s_ShinTop_slv126);//tb模块名称 + //$dumpvars(0, ShinTopSpiTb.s_ShinTop_slv127);//tb模块名称 + `endif + + `ifdef IVERILOG_COMPILE + $dumpfile("./generated/wave.fst"); //生成的fst文件名称 + $dumpvars(0, ShinTopSpiTb);//tb模块名称 + `endif +end + +always @(posedge reset) begin + _reset_deactive <= 1'b0; +end + +always @(negedge reset) begin + _reset_deactive <= 1'b1; +end + + `define SCKFRE #640 + + reg sck = 0; + + initial begin + forever begin + `SCKFRE sck <= ~sck; + end + end + + assign spi_sck = sck; + assign qspi_sck = sck; + + + reg [7:0] txBuf[0:2047]; + reg [7:0] rxBuf[0:2047]; + reg [7:0] exChangeRego; + reg [7:0] exChangeRegi; + + + + assign spi_mosi = exChangeRego[7]; + assign qspi_mosi = exChangeRego[7:4]; + + wire [3:0] qspi_mux_miso = `QSPI_MUX_MISO_INIT; + //( qspi_miso[4*0+3:4*0] & ~{4{spi_csn[ 0]}}) | + //( qspi_miso[4*1+3:4*1] & ~{4{spi_csn[ 1]}}) | + //( qspi_miso[4*2+3:4*2] & ~{4{spi_csn[ 2]}}) | + //( qspi_miso[4*3+3:4*3] & ~{4{spi_csn[ 3]}}) | + //( qspi_miso[4*4+3:4*4] & ~{4{spi_csn[ 4]}}) | + //( qspi_miso[4*5+3:4*5] & ~{4{spi_csn[10]}}) | + //( qspi_miso[4*6+3:4*6] & ~{4{spi_csn[11]}}) | + //( qspi_miso[4*7+3:4*7] & ~{4{spi_csn[12]}}) | + //( qspi_miso[4*8+3:4*8] & ~{4{spi_csn[13]}}) | + //( qspi_miso[4*9+3:4*9] & ~{4{spi_csn[14]}}); + /* + (`IQSPI_MISO(0) & ~{4{`IQSPI_CSN(0)}}) | + (`IQSPI_MISO(1) & ~{4{`IQSPI_CSN(1)}}) | + (`IQSPI_MISO(2) & ~{4{`IQSPI_CSN(2)}}) | + (`IQSPI_MISO(3) & ~{4{`IQSPI_CSN(3)}}) | + (`IQSPI_MISO(4) & ~{4{`IQSPI_CSN(4)}}) | + (`EQSPI_MISO(0) & ~{4{`EQSPI_CSN(0)}}) | + (`EQSPI_MISO(1) & ~{4{`EQSPI_CSN(1)}}) | + (`EQSPI_MISO(2) & ~{4{`EQSPI_CSN(2)}}) | + (`EQSPI_MISO(3) & ~{4{`EQSPI_CSN(3)}}) | + (`EQSPI_MISO(4) & ~{4{`EQSPI_CSN(4)}}); + */ + + wire spi_mux_miso = `SPI_MUX_MISO_INIT; + //( spi_miso[0] & ~spi_csn[5] ) | + //( spi_miso[1] & ~spi_csn[6] ) | + //( spi_miso[2] & ~spi_csn[7] ) | + //( spi_miso[3] & ~spi_csn[8] ) | + //( spi_miso[4] & ~spi_csn[9] ); + /* + ( spi_miso[0] & ~`ESPI_CSN(0)) | + ( spi_miso[1] & ~`ESPI_CSN(1)) | + ( spi_miso[2] & ~`ESPI_CSN(2)) | + ( spi_miso[3] & ~`ESPI_CSN(3)) | + ( spi_miso[4] & ~`ESPI_CSN(4)); + */ + + reg isReq = 0; + reg isBusy = 0; + + reg [11:0] length; + reg [16:0] idx; + + reg [11:0] transCnt; + reg [11:0] byteCnt; + reg [2:0] bitCnt; + + +always @(posedge clock) begin + if( isReq & sck == 0 ) begin + isBusy <= #5 1'b1; + transCnt <= #5 0; + + byteCnt <= #5 ~12'b0; + bitCnt <= #5 ~3'b0; + + spi_csn[idx] <= #5 1'b0; + exChangeRego <= txBuf[0]; + end +end + +//DEV_NUM +//ALL_DEV_NUM +wire isQspi = (idx >= 0 && idx <= (`ALL_DEV_NUM - 1)) || idx >= (`ALL_DEV_NUM * 2); +wire [11:0] nextByteCnt = byteCnt + 1; + +//输出 +always @(negedge sck) begin + if( isBusy ) begin + if( &bitCnt ) begin + exChangeRego <= txBuf[nextByteCnt]; + end else begin + exChangeRego <= isQspi ? exChangeRego << 4 : exChangeRego << 1; + end + end +end + +//输入 +always @(posedge sck) begin + if( isBusy ) begin + if( transCnt <= length ) begin + if( isQspi ) begin + bitCnt <= ~bitCnt; + end else begin + bitCnt <= bitCnt + 1; + end + if ( idx >= (`ALL_DEV_NUM * 3) ) begin + if( &bitCnt ) begin + byteCnt <= byteCnt +1; + transCnt <= transCnt + 1; + if( (txBuf[2] & 8'h80) === 8'h80 & nextByteCnt >= 5) begin + rxBuf[byteCnt] <= exChangeRegi; + //$display("spi read out %x", exChangeRegi); + end + if( (txBuf[2] & 8'h80) === 8'h80 & nextByteCnt >= 4) begin + exChangeRegi <= isQspi ? {exChangeRegi[3:0], qspi_mux_miso} : {exChangeRegi[6:0], spi_mux_miso}; + end else begin + exChangeRegi <= 0; + end + end else begin + exChangeRegi <= isQspi ? {exChangeRegi[3:0], qspi_mux_miso} : {exChangeRegi[6:0], spi_mux_miso}; + end + end else begin + if( &bitCnt ) begin + byteCnt <= byteCnt +1; + transCnt <= transCnt + 1; + if( txBuf[2] === 8'h80 & nextByteCnt >= 4) begin + rxBuf[byteCnt] <= exChangeRegi; + //$display("spi read out %x", exChangeRegi); + end + if( txBuf[2] === 8'h80 & nextByteCnt >= 3) begin + exChangeRegi <= isQspi ? {exChangeRegi[3:0], qspi_mux_miso} : {exChangeRegi[6:0], spi_mux_miso}; + end else begin + exChangeRegi <= 0; + end + end else begin + exChangeRegi <= isQspi ? {exChangeRegi[3:0], qspi_mux_miso} : {exChangeRegi[6:0], spi_mux_miso}; + end + end + end else begin + isBusy <= #5 1'b0; + spi_csn[idx] <= #5 1'b1; + end + end +end + + + + +//mst slv0~slv3的 内部qspi调用即设置 +//sidx为0~4;外部spi为5~9,外部qspi为10~15 +task spi_trans( input [15:0] saddress, input [7:0] scmd, input [12:0] slength, input [16:0] sidx ); + begin + txBuf[0] <= saddress[15:8]; + txBuf[1] <= saddress[7:0]; + if (sidx >=(`ALL_DEV_NUM * 3)) begin + txBuf[2] <= (scmd | slength[12:8]); + txBuf[3] <= slength[7:0]; + length <= slength + 4; + end else begin + txBuf[2] <= scmd; + length <= slength + 3; + end + + idx <= sidx; + + #5 + @(negedge sck) + isReq <= 1; + @(posedge sck) #5 + isReq <= 0; + + @( negedge isBusy) #1000 + begin + //$fwrite(spidata_file, "------------%5t------------\n", $realtime); + if (sidx >=(`ALL_DEV_NUM * 3)) begin + $fwrite(spidata_file, "T:%t \tdev:%4d(%4d), addr:0x%02h%02h, %s, len:%4d (0x%02h%02h)\n", + $realtime, + sidx % (`ALL_DEV_NUM), sidx, + txBuf[0], + txBuf[1], + (((txBuf[2] & 8'h80) == 0)? "Write":" Read"), + slength, + txBuf[2], txBuf[3]); + end else begin + $fwrite(spidata_file, "T:%t \tdev:%4d(%4d), addr:0x%02h%02h, %s, len:%4d\n", + $realtime, + sidx % (`ALL_DEV_NUM), sidx, + txBuf[0], + txBuf[1], + (((txBuf[2] & 8'h80) == 0)? "Write":" Read"), + slength); + end + + if (sidx >=(`ALL_DEV_NUM * 3)) begin _pos = 4; end + else begin _pos = 3; end + + if ( ((saddress == 16'h0800) + || (saddress == 16'h1000) + || (saddress == 16'h1800) + || (saddress == 16'h2000) + || (saddress == 16'h2800) + || (saddress == 16'h3000) + || (saddress == 16'h3800) + || (saddress == 16'h4000) + ) + && ((sidx == 0) + || (sidx == `ALL_DEV_NUM) + || (sidx == (`ALL_DEV_NUM * 2)) + || (sidx == (`ALL_DEV_NUM * 3)) + ) + ) begin + + for (integer _k = 0; _k < 4; _k++) begin + if (scmd == 0) begin + $fwrite(spidata_file, "%02h ", txBuf[_k + _pos]); + end else begin + $fwrite(spidata_file, "%02h ", rxBuf[_k + _pos]); + end + end + + $fwrite(spidata_file, "\n"); + _pos = 4 + _pos; + for (; _pos < slength; ) begin + for (integer _k = 0; _k < 6; _k++) begin + if (scmd == 0) begin + $fwrite(spidata_file, "%02h ", txBuf[_k + _pos]); + _len = txBuf[_pos + 5] + (txBuf[_pos + 4] & 8'h0f) * 256; + end else begin + $fwrite(spidata_file, "%02h ", rxBuf[_k + _pos]); + _len = rxBuf[_pos + 5] + (rxBuf[_pos + 4] & 8'h0f) * 256; + end + end + + begin:PRINT_PKT_COMMENT + integer dev; + integer addr_type; + integer addr; + integer cmd; + integer len; + + if (scmd == 0) begin + addr_type = txBuf[_pos + 1] & 8'h3; + dev = (txBuf[_pos] * 256) >> 2; + dev = dev + ((txBuf[_pos + 1] >> 2) & 8'hff); + addr = txBuf[_pos + 2] * 256 + (txBuf[_pos + 3] & 8'hff); + cmd = (txBuf[_pos + 4] >> 4) & 8'h0f; + len = (txBuf[_pos + 4] & 8'h0f) * 256 + (txBuf[_pos + 5] & 8'hff); + end else begin + addr_type = rxBuf[_pos + 1] & 8'h3; + dev = (rxBuf[_pos] * 256) >> 2; + dev = dev + ((rxBuf[_pos + 1] >> 2) & 8'hff); + addr = rxBuf[_pos + 2] * 256 + (rxBuf[_pos + 3] & 8'hff); + cmd = (rxBuf[_pos + 4] >> 4) & 8'h0f; + len = (rxBuf[_pos + 4] & 8'h0f) * 256 + (rxBuf[_pos + 5] & 8'hff); + end + + if (addr_type == 0) + $fwrite(spidata_file, "// type:%3d dev:%3d addr:0x%04x cmd:0x%1x len:%3d", addr_type, dev, addr[15:0], cmd[3:0], len); + else begin + addr = dev * 65536 + addr; + $fwrite(spidata_file, "// type:%3d addr:0x%08x cmd:0x%1x len:%3d", addr_type, addr, cmd[3:0], len); + end + end + + $fwrite(spidata_file, "\n{{ "); + _pos = _pos + 6; + for (integer _k = 0; _k < _len; _k++) begin + if (scmd == 0) begin + $fwrite(spidata_file, "%02h ", txBuf[_k + _pos]); + end else begin + $fwrite(spidata_file, "%02h ", rxBuf[_k + _pos]); + end + c_line = 0; + if ((_k + 2)%16 == 0) begin + $fwrite(spidata_file, "\n"); + c_line = 1; + end + end + $fwrite(spidata_file, "}}\n"); + _pos = _pos + _len; + + for (integer _k = 0; _k < 2; _k++) begin + if (scmd == 0) begin + $fwrite(spidata_file, "%02h ", txBuf[_k + _pos]); + end else begin + $fwrite(spidata_file, "%02h ", rxBuf[_k + _pos]); + end + end + _pos = _pos + 2; + $fwrite(spidata_file, "\n"); + end + end else begin + for (integer i=0; i=(`ALL_DEV_NUM * 3)) begin + txBuf[2] <= (`SPI_READ | 8'h0); + txBuf[3] <= 8'h04; + length = 8'h08; + //$display("using AQspi"); + end else begin + txBuf[2] <= `SPI_READ; + length = 8'h07; + //$display("using iqspi"); + end + + + idx = dev_idx; + + #5 + @(negedge sck) + isReq <= 1; + @(posedge sck) #5 + isReq <= 0; + + @( negedge isBusy) #1000 + begin + + end + #2000 + //$display("%x %x", rxBuf[3], rxBuf[6]); + if ((rxBuf[`ARRAY_IDX_OFF] & 8'h02) == 8'h02) + begin + is_run = 0; + end + if ((rxBuf[`ARRAY_IDX_OFF+3] & 8'h60) != 8'h00) + begin + $display("error occur"); + is_run = 0; + end + if (($realtime - st) >= 20000000.0) + begin + $display("comm timeout."); + is_run = 0; + end + end + end +endtask + + +initial begin + + #1000 + + + `include "tc_runlist.vh" + + #1000000 + $display("Testcase Finished! Time Out !!!"); + $fclose(spidata_file); + //$stop; + $finish; + +end + + +endmodule + diff --git a/tb/shinTest/ShinTopSpiTb_clk.v b/tb/shinTest/ShinTopSpiTb_clk.v index 05ab10f..6e1d6f7 100644 --- a/tb/shinTest/ShinTopSpiTb_clk.v +++ b/tb/shinTest/ShinTopSpiTb_clk.v @@ -1,1037 +1,1037 @@ -`timescale 1 ns / 1 ps - -module ShinTopSpiTb( - -); - - reg clock; - reg reset; - - reg [15:0] multiCLK; - - -`include "dev_predef.vh" - -`ifdef DEFINE_SLAVE_DEVICE -`define DEV_NUM 4 //slave num -`define ALL_DEV_NUM (`DEV_NUM + 1) // slave + master -`define SPI_CSN_NUM (`ALL_DEV_NUM * 4) - -`define HW_SERIAL 0 //48'h31303050584c //(48'h4c5850303031) -`define IQSPI_PINS(N) (`N*4+3):(`N*4) -`define EQSPI_PINS(N) ((`N + `ALL_DEV_NUM)*4+3):((`N + `ALL_DEV_NUM)*4) -`define IQSPI_MISO(N) qspi_miso[`IQSPI_PINS(`N)] -`define EQSPI_MISO(N) qspi_miso[`EQSPI_PINS(`N)] - -`define IQSPI_CSN_NUM(id) (`id) -`define ESPI_CSN_NUM(id) ((`id)+(`ALL_DEV_NUM)) -`define EQSPI_CSN_NUM(id) ((`id)+(`ALL_DEV_NUM)*2) - -`define IQSPI_CSN(id) spi_csn[`IQSPI_CSN_NUM(`id)] -`define ESPI_CSN(id) spi_csn[`ESPI_CSN_NUM(`id)] -`define EQSPI_CSN(id) spi_csn[`EQSPI_CSN_NUM(`id)] -`define QSPI_MUX_MISO_INIT \ - (`IQSPI_MISO(0) & ~{4{`IQSPI_CSN(0)}}) |\ - (`IQSPI_MISO(1) & ~{4{`IQSPI_CSN(1)}}) |\ - (`IQSPI_MISO(2) & ~{4{`IQSPI_CSN(2)}}) |\ - (`IQSPI_MISO(3) & ~{4{`IQSPI_CSN(3)}}) |\ - (`IQSPI_MISO(4) & ~{4{`IQSPI_CSN(4)}}) |\ - (`EQSPI_MISO(0) & ~{4{`EQSPI_CSN(0)}}) |\ - (`EQSPI_MISO(1) & ~{4{`EQSPI_CSN(1)}}) |\ - (`EQSPI_MISO(2) & ~{4{`EQSPI_CSN(2)}}) |\ - (`EQSPI_MISO(3) & ~{4{`EQSPI_CSN(3)}}) |\ - (`EQSPI_MISO(4) & ~{4{`EQSPI_CSN(4)}}) -`define SPI_MUX_MISO_INIT \ - ( spi_miso[0] & ~`ESPI_CSN(0)) |\ - ( spi_miso[1] & ~`ESPI_CSN(1)) |\ - ( spi_miso[2] & ~`ESPI_CSN(2)) |\ - ( spi_miso[3] & ~`ESPI_CSN(3)) |\ - ( spi_miso[4] & ~`ESPI_CSN(4)) -`endif - wire [(`DEV_NUM - 1):0] dDat_w; - wire [(`DEV_NUM - 1):0] uDat_w; - - wire spi_sck; - wire spi_mosi; - wire [(`ALL_DEV_NUM - 1):0] spi_miso; - reg [(`SPI_CSN_NUM - 1):0] spi_csn; - - wire qspi_sck; - wire [3:0] qspi_mosi; - //wire [40-1:0] qspi_miso; - wire [(`ALL_DEV_NUM * 4 * 3 - 1):0] qspi_miso; - - integer spidata_file; - integer c_line; - integer _pos; - integer _len; - integer _t_start; - integer _t_end; - reg [63:0] _temp_time; - reg _reset_deactive; - - wire [(`ALL_DEV_NUM - 1):0] isSoftReset; - reg [(`ALL_DEV_NUM - 1):0] isSoftReset_reg; - - generate - for( genvar i = 0; i < `ALL_DEV_NUM; i = i + 1 ) begin - always @(posedge clock or posedge reset) begin - if(reset) isSoftReset_reg[i] <= 1'b0; - else isSoftReset_reg[i] <= isSoftReset[i]; - end - end - endgenerate - - - wire [`DEV_NUM:0] io_int_sig; - - reg latch0; - reg latch1; - - - -ShinTop s_ShinTop_Mst( - .clock(clock), - .reset(reset | isSoftReset_reg[0]), - - .io_multiCLK_0(multiCLK[0]), - .io_multiCLK_1(multiCLK[1]), - .io_multiCLK_2(multiCLK[2]), - .io_multiCLK_3(multiCLK[3]), - .io_multiCLK_4(multiCLK[4]), - .io_multiCLK_5(multiCLK[5]), - .io_multiCLK_6(multiCLK[6]), - .io_multiCLK_7(multiCLK[7]), - .io_multiCLK_8(multiCLK[8]), - .io_multiCLK_9(multiCLK[9]), - .io_multiCLK_10(multiCLK[10]), - .io_multiCLK_11(multiCLK[11]), - .io_multiCLK_12(multiCLK[12]), - .io_multiCLK_13(multiCLK[13]), - .io_multiCLK_14(multiCLK[14]), - .io_multiCLK_15(multiCLK[15]), - - .io_multiCLKDiv4_0(multiCLK[0]), - .io_multiCLKDiv4_1(multiCLK[4]), - .io_multiCLKDiv4_2(multiCLK[8]), - .io_multiCLKDiv4_3(multiCLK[12]), - - .io_dDatIn(1'b0), - .io_dDatOut(dDat_w[0]), - .io_uDatIn(uDat_w[0]), - .io_uDatOut(), - - .io_iqspi_sck(qspi_sck), - .io_iqspi_mosi(qspi_mosi), - .io_iqspi_miso(`IQSPI_MISO(0)), - .io_iqspi_isDirIn(), - .io_iqspi_csn(`IQSPI_CSN(0)), - - .io_ospi_sck (spi_sck), - .io_ospi_mosi(spi_mosi), - .io_ospi_miso(spi_miso[0]), - .io_ospi_csn (`ESPI_CSN(0)), - - - .io_oqspi_sck(qspi_sck), - .io_oqspi_mosi(qspi_mosi), - .io_oqspi_miso(`EQSPI_MISO(0)), - .io_oqspi_isDirIn(), - .io_oqspi_csn(`EQSPI_CSN(0)), - - .io_aqspi_sck(qspi_sck), - .io_aqspi_mosi(qspi_mosi), - .io_aqspi_miso(`AQSPI_MISO(0)), - .io_aqspi_isDirIn(), - .io_aqspi_csn(`AQSPI_CSN(0)), - - .io_isSoftReset(isSoftReset[0]), - .io_interrupt(io_int_sig[0]), - .io_latchPin_0(latch0), - .io_latchPin_1(latch1), - .io_hwSerial(`HW_SERIAL), - .io_uniCode(64'h0) -); - -`include "slave_dev_def.vh" - -`ifdef DEFINE_SLAVE_DEVICE -ShinTop s_ShinTop_slv0( - .clock(clock), - .reset(reset | isSoftReset_reg[1]), - - .io_multiCLK_0(multiCLK[0]), - .io_multiCLK_1(multiCLK[1]), - .io_multiCLK_2(multiCLK[2]), - .io_multiCLK_3(multiCLK[3]), - .io_multiCLK_4(multiCLK[4]), - .io_multiCLK_5(multiCLK[5]), - .io_multiCLK_6(multiCLK[6]), - .io_multiCLK_7(multiCLK[7]), - .io_multiCLK_8(multiCLK[8]), - .io_multiCLK_9(multiCLK[9]), - .io_multiCLK_10(multiCLK[10]), - .io_multiCLK_11(multiCLK[11]), - .io_multiCLK_12(multiCLK[12]), - .io_multiCLK_13(multiCLK[13]), - .io_multiCLK_14(multiCLK[14]), - .io_multiCLK_15(multiCLK[15]), - - .io_dDatIn(dDat_w[0]), - .io_dDatOut(dDat_w[1]), - .io_uDatIn(uDat_w[1]), - .io_uDatOut(uDat_w[0]), - - .io_iqspi_sck(qspi_sck), - .io_iqspi_mosi(qspi_mosi), - .io_iqspi_miso(`IQSPI_MISO(1)), - .io_iqspi_isDirIn(), - .io_iqspi_csn(`IQSPI_CSN(1)), - - .io_ospi_sck (spi_sck), - .io_ospi_mosi(spi_mosi), - .io_ospi_miso(spi_miso[1]), - .io_ospi_csn (`ESPI_CSN(1)), - - .io_oqspi_sck(qspi_sck), - .io_oqspi_mosi(qspi_mosi), - .io_oqspi_miso(`EQSPI_MISO(1)), - .io_oqspi_isDirIn(), - .io_oqspi_csn(`EQSPI_CSN(1)), - - .io_isSoftReset(isSoftReset[1]), - .io_interrupt(io_int_sig[1]), - .io_latchPin_0(latch0), - .io_latchPin_1(latch1), - .io_hwSerial(`HW_SERIAL), - .io_uniCode(0) -); - -ShinTop s_ShinTop_slv1( - .clock(clock), - .reset(reset | isSoftReset_reg[2]), - - .io_multiCLK_0(multiCLK[0]), - .io_multiCLK_1(multiCLK[1]), - .io_multiCLK_2(multiCLK[2]), - .io_multiCLK_3(multiCLK[3]), - .io_multiCLK_4(multiCLK[4]), - .io_multiCLK_5(multiCLK[5]), - .io_multiCLK_6(multiCLK[6]), - .io_multiCLK_7(multiCLK[7]), - .io_multiCLK_8(multiCLK[8]), - .io_multiCLK_9(multiCLK[9]), - .io_multiCLK_10(multiCLK[10]), - .io_multiCLK_11(multiCLK[11]), - .io_multiCLK_12(multiCLK[12]), - .io_multiCLK_13(multiCLK[13]), - .io_multiCLK_14(multiCLK[14]), - .io_multiCLK_15(multiCLK[15]), - - .io_dDatIn(dDat_w[1]), - .io_dDatOut(dDat_w[2]), - .io_uDatIn(uDat_w[2]), - .io_uDatOut(uDat_w[1]), - - .io_iqspi_sck(qspi_sck), - .io_iqspi_mosi(qspi_mosi), - .io_iqspi_miso(`IQSPI_MISO(2)), - .io_iqspi_isDirIn(), - .io_iqspi_csn(`IQSPI_CSN(2)), - - .io_ospi_sck (spi_sck), - .io_ospi_mosi(spi_mosi), - .io_ospi_miso(spi_miso[2]), - .io_ospi_csn (`ESPI_CSN(2)), - - .io_oqspi_sck(qspi_sck), - .io_oqspi_mosi(qspi_mosi), - .io_oqspi_miso(`EQSPI_MISO(2)), - .io_oqspi_isDirIn(), - .io_oqspi_csn(`EQSPI_CSN(2)), - - .io_isSoftReset(isSoftReset[2]), - .io_interrupt(io_int_sig[2]), - .io_latchPin_0(latch0), - .io_latchPin_1(latch1), - .io_hwSerial(`HW_SERIAL), - .io_uniCode(0) -); - -ShinTop s_ShinTop_slv2( - .clock(clock), - .reset(reset | isSoftReset_reg[3]), - - .io_multiCLK_0(multiCLK[0]), - .io_multiCLK_1(multiCLK[1]), - .io_multiCLK_2(multiCLK[2]), - .io_multiCLK_3(multiCLK[3]), - .io_multiCLK_4(multiCLK[4]), - .io_multiCLK_5(multiCLK[5]), - .io_multiCLK_6(multiCLK[6]), - .io_multiCLK_7(multiCLK[7]), - .io_multiCLK_8(multiCLK[8]), - .io_multiCLK_9(multiCLK[9]), - .io_multiCLK_10(multiCLK[10]), - .io_multiCLK_11(multiCLK[11]), - .io_multiCLK_12(multiCLK[12]), - .io_multiCLK_13(multiCLK[13]), - .io_multiCLK_14(multiCLK[14]), - .io_multiCLK_15(multiCLK[15]), - - .io_dDatIn(dDat_w[2]), - .io_dDatOut(dDat_w[3]), - .io_uDatIn(uDat_w[3]), - .io_uDatOut(uDat_w[2]), - - .io_iqspi_sck(qspi_sck), - .io_iqspi_mosi(qspi_mosi), - .io_iqspi_miso(`IQSPI_MISO(3)), - .io_iqspi_isDirIn(), - .io_iqspi_csn(`IQSPI_CSN(3)), - - .io_ospi_sck (spi_sck), - .io_ospi_mosi(spi_mosi), - .io_ospi_miso(spi_miso[3]), - .io_ospi_csn (`ESPI_CSN(3)), - - .io_oqspi_sck(qspi_sck), - .io_oqspi_mosi(qspi_mosi), - .io_oqspi_miso(`EQSPI_MISO(3)), - .io_oqspi_isDirIn(), - .io_oqspi_csn(`EQSPI_CSN(3)), - - .io_isSoftReset(isSoftReset[3]), - .io_interrupt(io_int_sig[3]), - .io_latchPin_0(latch0), - .io_latchPin_1(latch1), - .io_hwSerial(`HW_SERIAL), - .io_uniCode(0) -); - -ShinTop s_ShinTop_slv3( - .clock(clock), - .reset(reset | isSoftReset_reg[4]), - - .io_multiCLK_0(multiCLK[0]), - .io_multiCLK_1(multiCLK[1]), - .io_multiCLK_2(multiCLK[2]), - .io_multiCLK_3(multiCLK[3]), - .io_multiCLK_4(multiCLK[4]), - .io_multiCLK_5(multiCLK[5]), - .io_multiCLK_6(multiCLK[6]), - .io_multiCLK_7(multiCLK[7]), - .io_multiCLK_8(multiCLK[8]), - .io_multiCLK_9(multiCLK[9]), - .io_multiCLK_10(multiCLK[10]), - .io_multiCLK_11(multiCLK[11]), - .io_multiCLK_12(multiCLK[12]), - .io_multiCLK_13(multiCLK[13]), - .io_multiCLK_14(multiCLK[14]), - .io_multiCLK_15(multiCLK[15]), - - .io_dDatIn(dDat_w[3]), - .io_dDatOut(), - .io_uDatIn(1'b0), - .io_uDatOut(uDat_w[3]), - - .io_iqspi_sck(qspi_sck), - .io_iqspi_mosi(qspi_mosi), - .io_iqspi_miso(`IQSPI_MISO(4)), - .io_iqspi_isDirIn(), - .io_iqspi_csn(`IQSPI_CSN(4)), - - .io_ospi_sck (spi_sck), - .io_ospi_mosi(spi_mosi), - .io_ospi_miso(spi_miso[4]), - .io_ospi_csn (`ESPI_CSN(4)), - - .io_oqspi_sck(qspi_sck), - .io_oqspi_mosi(qspi_mosi), - .io_oqspi_miso(`EQSPI_MISO(4)), - .io_oqspi_isDirIn(), - .io_oqspi_csn(`EQSPI_CSN(4)), - - .io_isSoftReset(isSoftReset[4]), - .io_interrupt(io_int_sig[4]), - .io_latchPin_0(latch0), - .io_latchPin_1(latch1), - .io_hwSerial(`HW_SERIAL), - .io_uniCode(0) -); -`endif - -initial begin - clock = 0; - reset = 1; - - latch0 = 0; - latch1 = 0; - - _reset_deactive = 1'b0; - - $timeformat(-9, 2, " ns", 8); - - spi_csn = {`SPI_CSN_NUM{1'b1}}; //~15'b0; - - #10000000 - reset <= 1; - - #24000000 - reset <= 0; - - #8000000000000 - #8000000000000 - #8000000000000 - -`ifdef USING_OSPI - #8000000000000 - #8000000000000 -`endif - - $display("Time Out !!!"); - $fclose(spidata_file); - //$stop; - $finish; -end - -initial begin - forever begin #8000000 clock <= ~clock; end -end - - -generate - for( genvar i = 0; i < 16; i = i + 1 ) begin - initial begin - multiCLK[i] = 0; - for( integer j = 0; j < i; j = j + 1 ) begin - #1000000 - ; - end - forever begin #8000000 multiCLK[i] <= ~multiCLK[i]; end - end - end -endgenerate - - -/* -//如果频率差到 80ppm,参数是: 8000640/1000080/8000640 [pass] -//如果频率差到120ppm,参数是: 8000960/1000120/8000960 [pass] -//如果频率差到160ppm,参数是: 8001280/1000160/8001280 [pass] -//如果频率差到168ppm,参数是: 8001344/1000168/8001344 [pass] - -//如果频率差到176ppm,参数是: 8001408/1000176/8001408 [pass] -//如果频率差到-176ppm,参数是: 7998592/ 999824/7998592 [pass] - -//如果频率差到180ppm,参数是: 8001440/1000180/8001440 [pass] -//如果频率差到-180ppm,参数是: 7998560/ 999820/7998560 [pass] - -//如果频率差到181ppm,参数是: 8001448/1000181/8001448 [failed] //tc29, tc30联合测试,tc30最后几个字节不过, 单测能过 -//如果频率差到-181ppm,参数是: 7998552/ 999819/7998552 [failed] //同上 - -//如果频率差到182ppm,参数是: 8001456/1000182/8001456 [failed] -//如果频率差到-182ppm,参数是: 7998544/ 999818/7998544 [failed] //单测, tc30下行是对的,上行发生错误 - -//如果频率差到184ppm,参数是: 8001472/1000184/8001472 [failed] //差得字节数不多,大概在180ppm上下 -//如果频率差到-184ppm,参数是: 7998528/ 999816/7998528 [failed] - -initial begin - forever begin #7998552 clock2 <= ~clock2; end -end - -generate - for( genvar i = 0; i < 16; i = i + 1 ) begin - initial begin - //相位信息 - #750000 - multiCLK2[i] = 0; - for( integer j = 0; j < i; j = j + 1 ) begin - #999819 - ; - end - forever begin #7998552 multiCLK2[i] <= ~multiCLK2[i]; end - end - end -endgenerate - - - -initial begin - forever begin #7998552 clock3 <= ~clock3; end -end - -generate - for( genvar i = 0; i < 16; i = i + 1 ) begin - initial begin - //相位信息 - #750000 - multiCLK3[i] = 0; - for( integer j = 0; j < i; j = j + 1 ) begin - #999819 - ; - end - forever begin #7998552 multiCLK3[i] <= ~multiCLK3[i]; end - end - end -endgenerate -*/ - - -`include "slave_dev_clk.vh" - -initial -begin - spidata_file = $fopen("spi_trans_data.txt", "w"); - if (!spidata_file) $display("文件打开失败"); - `ifdef VCS_COMPILE - $dumpfile("./generated/wave.vcd"); //生成的vcd文件名称 - //$dumpvars(0, ShinTopSpiTb);//tb模块名称 - $dumpvars(0, ShinTopSpiTb.s_ShinTop_Mst); - $dumpvars(0, ShinTopSpiTb.s_ShinTop_slv0); - //$dumpvars(0, ShinTopSpiTb.s_ShinTop_slv1); - `endif - - `ifdef IVERILOG_COMPILE - $dumpfile("./generated/wave_clk.fst"); //生成的fst文件名称 - $dumpvars(0, ShinTopSpiTb);//tb模块名称 - `endif -end - -always @(posedge reset) begin - _reset_deactive <= 1'b0; -end - -always @(negedge reset) begin - _reset_deactive <= 1'b1; -end - - `define SCKFRE #64000000 - - reg sck = 0; - - initial begin - forever begin - `SCKFRE sck <= ~sck; - end - end - - assign spi_sck = sck; - assign qspi_sck = sck; - - - reg [7:0] txBuf[0:2047]; - reg [7:0] rxBuf[0:2047]; - reg [7:0] exChangeRego; - reg [7:0] exChangeRegi; - - - - assign spi_mosi = exChangeRego[7]; - assign qspi_mosi = exChangeRego[7:4]; - - wire [3:0] qspi_mux_miso = `QSPI_MUX_MISO_INIT; - //( qspi_miso[4*0+3:4*0] & ~{4{spi_csn[ 0]}}) | - //( qspi_miso[4*1+3:4*1] & ~{4{spi_csn[ 1]}}) | - //( qspi_miso[4*2+3:4*2] & ~{4{spi_csn[ 2]}}) | - //( qspi_miso[4*3+3:4*3] & ~{4{spi_csn[ 3]}}) | - //( qspi_miso[4*4+3:4*4] & ~{4{spi_csn[ 4]}}) | - //( qspi_miso[4*5+3:4*5] & ~{4{spi_csn[10]}}) | - //( qspi_miso[4*6+3:4*6] & ~{4{spi_csn[11]}}) | - //( qspi_miso[4*7+3:4*7] & ~{4{spi_csn[12]}}) | - //( qspi_miso[4*8+3:4*8] & ~{4{spi_csn[13]}}) | - //( qspi_miso[4*9+3:4*9] & ~{4{spi_csn[14]}}); - /* - (`IQSPI_MISO(0) & ~{4{`IQSPI_CSN(0)}}) | - (`IQSPI_MISO(1) & ~{4{`IQSPI_CSN(1)}}) | - (`IQSPI_MISO(2) & ~{4{`IQSPI_CSN(2)}}) | - (`IQSPI_MISO(3) & ~{4{`IQSPI_CSN(3)}}) | - (`IQSPI_MISO(4) & ~{4{`IQSPI_CSN(4)}}) | - (`EQSPI_MISO(0) & ~{4{`EQSPI_CSN(0)}}) | - (`EQSPI_MISO(1) & ~{4{`EQSPI_CSN(1)}}) | - (`EQSPI_MISO(2) & ~{4{`EQSPI_CSN(2)}}) | - (`EQSPI_MISO(3) & ~{4{`EQSPI_CSN(3)}}) | - (`EQSPI_MISO(4) & ~{4{`EQSPI_CSN(4)}}); - */ - - wire spi_mux_miso = `SPI_MUX_MISO_INIT; - //( spi_miso[0] & ~spi_csn[5] ) | - //( spi_miso[1] & ~spi_csn[6] ) | - //( spi_miso[2] & ~spi_csn[7] ) | - //( spi_miso[3] & ~spi_csn[8] ) | - //( spi_miso[4] & ~spi_csn[9] ); - /* - ( spi_miso[0] & ~`ESPI_CSN(0)) | - ( spi_miso[1] & ~`ESPI_CSN(1)) | - ( spi_miso[2] & ~`ESPI_CSN(2)) | - ( spi_miso[3] & ~`ESPI_CSN(3)) | - ( spi_miso[4] & ~`ESPI_CSN(4)); - */ - - reg isReq = 0; - reg isBusy = 0; - - reg [11:0] length; - reg [16:0] idx; - - reg [11:0] transCnt; - reg [11:0] byteCnt; - reg [2:0] bitCnt; - - -always @(posedge clock) begin - if( isReq & sck == 0 ) begin - isBusy <= #500000 1'b1; - transCnt <= #500000 0; - - byteCnt <= #500000 ~12'b0; - bitCnt <= #500000 ~3'b0; - - spi_csn[idx] <= #500000 1'b0; - exChangeRego <= txBuf[0]; - end -end - -//DEV_NUM -//ALL_DEV_NUM -wire isQspi = (idx >= 0 && idx <= (`ALL_DEV_NUM - 1)) || idx >= (`ALL_DEV_NUM * 2); -wire [11:0] nextByteCnt = byteCnt + 1; - -//输出 -always @(negedge sck) begin - if( isBusy ) begin - if( &bitCnt ) begin - exChangeRego <= txBuf[nextByteCnt]; - end else begin - exChangeRego <= isQspi ? exChangeRego << 4 : exChangeRego << 1; - end - end -end - -//输入 -always @(posedge sck) begin - if( isBusy ) begin - if( transCnt <= length ) begin - if( isQspi ) begin - bitCnt <= ~bitCnt; - end else begin - bitCnt <= bitCnt + 1; - end - if ( idx >= (`ALL_DEV_NUM * 3) ) begin - if( &bitCnt ) begin - byteCnt <= byteCnt +1; - transCnt <= transCnt + 1; - if( (txBuf[2] & 8'h80) === 8'h80 & nextByteCnt >= 5) begin - rxBuf[byteCnt] <= exChangeRegi; - //$display("spi read out %x", exChangeRegi); - end - if( (txBuf[2] & 8'h80) === 8'h80 & nextByteCnt >= 4) begin - exChangeRegi <= isQspi ? {exChangeRegi[3:0], qspi_mux_miso} : {exChangeRegi[6:0], spi_mux_miso}; - end else begin - exChangeRegi <= 0; - end - end else begin - exChangeRegi <= isQspi ? {exChangeRegi[3:0], qspi_mux_miso} : {exChangeRegi[6:0], spi_mux_miso}; - end - end else begin - if( &bitCnt ) begin - byteCnt <= byteCnt +1; - transCnt <= transCnt + 1; - if( txBuf[2] === 8'h80 & nextByteCnt >= 4) begin - rxBuf[byteCnt] <= exChangeRegi; - //$display("spi read out %x", exChangeRegi); - end - if( txBuf[2] === 8'h80 & nextByteCnt >= 3) begin - exChangeRegi <= isQspi ? {exChangeRegi[3:0], qspi_mux_miso} : {exChangeRegi[6:0], spi_mux_miso}; - end else begin - exChangeRegi <= 0; - end - end else begin - exChangeRegi <= isQspi ? {exChangeRegi[3:0], qspi_mux_miso} : {exChangeRegi[6:0], spi_mux_miso}; - end - end - end else begin - isBusy <= #500000 1'b0; - spi_csn[idx] <= #500000 1'b1; - end - end -end - - - - -//mst slv0~slv3的 内部qspi调用即设置 -//sidx为0~4;外部spi为5~9,外部qspi为10~15 -task spi_trans( input [15:0] saddress, input [7:0] scmd, input [12:0] slength, input [16:0] sidx ); - begin - txBuf[0] <= saddress[15:8]; - txBuf[1] <= saddress[7:0]; - if (sidx >=(`ALL_DEV_NUM * 3)) begin - txBuf[2] <= (scmd | slength[12:8]); - txBuf[3] <= slength[7:0]; - length <= slength + 4; - end else begin - txBuf[2] <= scmd; - length <= slength + 3; - end - - idx <= sidx; - - #500000 - @(negedge sck) - isReq <= 1; - @(posedge sck) #500000 - isReq <= 0; - - @( negedge isBusy) #100000000 - begin - //$fwrite(spidata_file, "------------%5t------------\n", $realtime); - $fwrite(spidata_file, "T:%t \tdev:%4d(%4d), addr:0x%02h%02h, %s, len:%4d (0x%02h%02h)\n", - $realtime, - sidx % (`ALL_DEV_NUM), sidx, - txBuf[0], - txBuf[1], - (((txBuf[2] & 8'h80) == 0)? "Write":" Read"), - slength, - txBuf[2], txBuf[3]); - - if (sidx >=(`ALL_DEV_NUM * 3)) begin _pos = 4; end - else begin _pos = 3; end - - if ( ((saddress == 16'h0800) - || (saddress == 16'h1000) - || (saddress == 16'h1800) - || (saddress == 16'h2000) - || (saddress == 16'h2800) - || (saddress == 16'h3000) - || (saddress == 16'h3800) - || (saddress == 16'h4000) - ) - && ((sidx == 0) - || (sidx == `ALL_DEV_NUM) - || (sidx == (`ALL_DEV_NUM * 2)) - || (sidx == (`ALL_DEV_NUM * 3)) - ) - ) begin - - for (integer _k = 0; _k < 4; _k++) begin - if (scmd == 0) begin - $fwrite(spidata_file, "%02h ", txBuf[_k + _pos]); - end else begin - $fwrite(spidata_file, "%02h ", rxBuf[_k + _pos]); - end - end - - $fwrite(spidata_file, "\n"); - _pos = 4 + _pos; - for (; _pos < slength; ) begin - for (integer _k = 0; _k < 6; _k++) begin - if (scmd == 0) begin - $fwrite(spidata_file, "%02h ", txBuf[_k + _pos]); - _len = txBuf[_pos + 5] + (txBuf[_pos + 4] & 8'h0f) * 256; - end else begin - $fwrite(spidata_file, "%02h ", rxBuf[_k + _pos]); - _len = rxBuf[_pos + 5] + (rxBuf[_pos + 4] & 8'h0f) * 256; - end - end - - begin:PRINT_PKT_COMMENT - integer dev; - integer addr_type; - integer addr; - integer cmd; - integer len; - - if (scmd == 0) begin - addr_type = txBuf[_pos + 1] & 8'h3; - dev = (txBuf[_pos] * 256) >> 2; - dev = dev + ((txBuf[_pos + 1] >> 2) & 8'hff); - addr = txBuf[_pos + 2] * 256 + (txBuf[_pos + 3] & 8'hff); - cmd = (txBuf[_pos + 4] >> 4) & 8'h0f; - len = (txBuf[_pos + 4] & 8'h0f) * 256 + (txBuf[_pos + 5] & 8'hff); - end else begin - addr_type = rxBuf[_pos + 1] & 8'h3; - dev = (rxBuf[_pos] * 256) >> 2; - dev = dev + ((rxBuf[_pos + 1] >> 2) & 8'hff); - addr = rxBuf[_pos + 2] * 256 + (rxBuf[_pos + 3] & 8'hff); - cmd = (rxBuf[_pos + 4] >> 4) & 8'h0f; - len = (rxBuf[_pos + 4] & 8'h0f) * 256 + (rxBuf[_pos + 5] & 8'hff); - end - - if (addr_type == 0) - $fwrite(spidata_file, "// type:%3d dev:%3d addr:0x%04x cmd:0x%1x len:%3d", addr_type, dev, addr[15:0], cmd[3:0], len); - else begin - addr = dev * 65536 + addr; - $fwrite(spidata_file, "// type:%3d addr:0x%08x cmd:0x%1x len:%3d", addr_type, addr, cmd[3:0], len); - end - end - - $fwrite(spidata_file, "\n{{ "); - _pos = _pos + 6; - for (integer _k = 0; _k < _len; _k++) begin - if (scmd == 0) begin - $fwrite(spidata_file, "%02h ", txBuf[_k + _pos]); - end else begin - $fwrite(spidata_file, "%02h ", rxBuf[_k + _pos]); - end - c_line = 0; - if ((_k + 2)%16 == 0) begin - $fwrite(spidata_file, "\n"); - c_line = 1; - end - end - $fwrite(spidata_file, "}}\n"); - _pos = _pos + _len; - - for (integer _k = 0; _k < 2; _k++) begin - if (scmd == 0) begin - $fwrite(spidata_file, "%02h ", txBuf[_k + _pos]); - end else begin - $fwrite(spidata_file, "%02h ", rxBuf[_k + _pos]); - end - end - _pos = _pos + 2; - $fwrite(spidata_file, "\n"); - end - end else begin - for (integer i=0; i=(`ALL_DEV_NUM * 3)) begin - txBuf[2] <= (`SPI_READ | 8'h0); - txBuf[3] <= 8'h04; - length = 8'h08; - //$display("using AQspi"); - end else begin - txBuf[2] <= `SPI_READ; - length = 8'h07; - //$display("using iqspi"); - end - - - idx = dev_idx; - - #500000 - @(negedge sck) - isReq <= 1; - @(posedge sck) #500000 - isReq <= 0; - - @( negedge isBusy) #100000000 - begin - - end - #100000000 - //$display("%x %x", rxBuf[3], rxBuf[6]); - if ((rxBuf[`ARRAY_IDX_OFF] & 8'h02) == 8'h02) - begin - is_run = 0; - end - if ((rxBuf[`ARRAY_IDX_OFF+3] & 8'h60) != 8'h00) - begin - $display("error occur"); - is_run = 0; - end - if (($realtime - st) >= 1000000000000.0) - begin - $display("comm timeout."); - is_run = 0; - end - end - end -endtask - - -initial begin - - #50000000 - - - `include "tc_runlist.vh" - - #100000000000 - $display("Testcase Finished! Time Out !!!"); - $fclose(spidata_file); - //$stop; - $finish; - -end - - -endmodule - +`timescale 1 ns / 1 ps + +module ShinTopSpiTb( + +); + + reg clock; + reg reset; + + reg [15:0] multiCLK; + + +`include "dev_predef.vh" + +`ifdef DEFINE_SLAVE_DEVICE +`define DEV_NUM 4 //slave num +`define ALL_DEV_NUM (`DEV_NUM + 1) // slave + master +`define SPI_CSN_NUM (`ALL_DEV_NUM * 4) + +`define HW_SERIAL 0 //48'h31303050584c //(48'h4c5850303031) +`define IQSPI_PINS(N) (`N*4+3):(`N*4) +`define EQSPI_PINS(N) ((`N + `ALL_DEV_NUM)*4+3):((`N + `ALL_DEV_NUM)*4) +`define IQSPI_MISO(N) qspi_miso[`IQSPI_PINS(`N)] +`define EQSPI_MISO(N) qspi_miso[`EQSPI_PINS(`N)] + +`define IQSPI_CSN_NUM(id) (`id) +`define ESPI_CSN_NUM(id) ((`id)+(`ALL_DEV_NUM)) +`define EQSPI_CSN_NUM(id) ((`id)+(`ALL_DEV_NUM)*2) + +`define IQSPI_CSN(id) spi_csn[`IQSPI_CSN_NUM(`id)] +`define ESPI_CSN(id) spi_csn[`ESPI_CSN_NUM(`id)] +`define EQSPI_CSN(id) spi_csn[`EQSPI_CSN_NUM(`id)] +`define QSPI_MUX_MISO_INIT \ + (`IQSPI_MISO(0) & ~{4{`IQSPI_CSN(0)}}) |\ + (`IQSPI_MISO(1) & ~{4{`IQSPI_CSN(1)}}) |\ + (`IQSPI_MISO(2) & ~{4{`IQSPI_CSN(2)}}) |\ + (`IQSPI_MISO(3) & ~{4{`IQSPI_CSN(3)}}) |\ + (`IQSPI_MISO(4) & ~{4{`IQSPI_CSN(4)}}) |\ + (`EQSPI_MISO(0) & ~{4{`EQSPI_CSN(0)}}) |\ + (`EQSPI_MISO(1) & ~{4{`EQSPI_CSN(1)}}) |\ + (`EQSPI_MISO(2) & ~{4{`EQSPI_CSN(2)}}) |\ + (`EQSPI_MISO(3) & ~{4{`EQSPI_CSN(3)}}) |\ + (`EQSPI_MISO(4) & ~{4{`EQSPI_CSN(4)}}) +`define SPI_MUX_MISO_INIT \ + ( spi_miso[0] & ~`ESPI_CSN(0)) |\ + ( spi_miso[1] & ~`ESPI_CSN(1)) |\ + ( spi_miso[2] & ~`ESPI_CSN(2)) |\ + ( spi_miso[3] & ~`ESPI_CSN(3)) |\ + ( spi_miso[4] & ~`ESPI_CSN(4)) +`endif + wire [(`DEV_NUM - 1):0] dDat_w; + wire [(`DEV_NUM - 1):0] uDat_w; + + wire spi_sck; + wire spi_mosi; + wire [(`ALL_DEV_NUM - 1):0] spi_miso; + reg [(`SPI_CSN_NUM - 1):0] spi_csn; + + wire qspi_sck; + wire [3:0] qspi_mosi; + //wire [40-1:0] qspi_miso; + wire [(`ALL_DEV_NUM * 4 * 3 - 1):0] qspi_miso; + + integer spidata_file; + integer c_line; + integer _pos; + integer _len; + integer _t_start; + integer _t_end; + reg [63:0] _temp_time; + reg _reset_deactive; + + wire [(`ALL_DEV_NUM - 1):0] isSoftReset; + reg [(`ALL_DEV_NUM - 1):0] isSoftReset_reg; + + generate + for( genvar i = 0; i < `ALL_DEV_NUM; i = i + 1 ) begin + always @(posedge clock or posedge reset) begin + if(reset) isSoftReset_reg[i] <= 1'b0; + else isSoftReset_reg[i] <= isSoftReset[i]; + end + end + endgenerate + + + wire [`DEV_NUM:0] io_int_sig; + + reg latch0; + reg latch1; + + + +ShinTop s_ShinTop_Mst( + .clock(clock), + .reset(reset | isSoftReset_reg[0]), + + .io_multiCLK_0(multiCLK[0]), + .io_multiCLK_1(multiCLK[1]), + .io_multiCLK_2(multiCLK[2]), + .io_multiCLK_3(multiCLK[3]), + .io_multiCLK_4(multiCLK[4]), + .io_multiCLK_5(multiCLK[5]), + .io_multiCLK_6(multiCLK[6]), + .io_multiCLK_7(multiCLK[7]), + .io_multiCLK_8(multiCLK[8]), + .io_multiCLK_9(multiCLK[9]), + .io_multiCLK_10(multiCLK[10]), + .io_multiCLK_11(multiCLK[11]), + .io_multiCLK_12(multiCLK[12]), + .io_multiCLK_13(multiCLK[13]), + .io_multiCLK_14(multiCLK[14]), + .io_multiCLK_15(multiCLK[15]), + + .io_multiCLKDiv4_0(multiCLK[0]), + .io_multiCLKDiv4_1(multiCLK[4]), + .io_multiCLKDiv4_2(multiCLK[8]), + .io_multiCLKDiv4_3(multiCLK[12]), + + .io_dDatIn(1'b0), + .io_dDatOut(dDat_w[0]), + .io_uDatIn(uDat_w[0]), + .io_uDatOut(), + + .io_iqspi_sck(qspi_sck), + .io_iqspi_mosi(qspi_mosi), + .io_iqspi_miso(`IQSPI_MISO(0)), + .io_iqspi_isDirIn(), + .io_iqspi_csn(`IQSPI_CSN(0)), + + .io_ospi_sck (spi_sck), + .io_ospi_mosi(spi_mosi), + .io_ospi_miso(spi_miso[0]), + .io_ospi_csn (`ESPI_CSN(0)), + + + .io_oqspi_sck(qspi_sck), + .io_oqspi_mosi(qspi_mosi), + .io_oqspi_miso(`EQSPI_MISO(0)), + .io_oqspi_isDirIn(), + .io_oqspi_csn(`EQSPI_CSN(0)), + + .io_aqspi_sck(qspi_sck), + .io_aqspi_mosi(qspi_mosi), + .io_aqspi_miso(`AQSPI_MISO(0)), + .io_aqspi_isDirIn(), + .io_aqspi_csn(`AQSPI_CSN(0)), + + .io_isSoftReset(isSoftReset[0]), + .io_interrupt(io_int_sig[0]), + .io_latchPin_0(latch0), + .io_latchPin_1(latch1), + .io_hwSerial(`HW_SERIAL), + .io_uniCode(64'h0) +); + +`include "slave_dev_def.vh" + +`ifdef DEFINE_SLAVE_DEVICE +ShinTop s_ShinTop_slv0( + .clock(clock), + .reset(reset | isSoftReset_reg[1]), + + .io_multiCLK_0(multiCLK[0]), + .io_multiCLK_1(multiCLK[1]), + .io_multiCLK_2(multiCLK[2]), + .io_multiCLK_3(multiCLK[3]), + .io_multiCLK_4(multiCLK[4]), + .io_multiCLK_5(multiCLK[5]), + .io_multiCLK_6(multiCLK[6]), + .io_multiCLK_7(multiCLK[7]), + .io_multiCLK_8(multiCLK[8]), + .io_multiCLK_9(multiCLK[9]), + .io_multiCLK_10(multiCLK[10]), + .io_multiCLK_11(multiCLK[11]), + .io_multiCLK_12(multiCLK[12]), + .io_multiCLK_13(multiCLK[13]), + .io_multiCLK_14(multiCLK[14]), + .io_multiCLK_15(multiCLK[15]), + + .io_dDatIn(dDat_w[0]), + .io_dDatOut(dDat_w[1]), + .io_uDatIn(uDat_w[1]), + .io_uDatOut(uDat_w[0]), + + .io_iqspi_sck(qspi_sck), + .io_iqspi_mosi(qspi_mosi), + .io_iqspi_miso(`IQSPI_MISO(1)), + .io_iqspi_isDirIn(), + .io_iqspi_csn(`IQSPI_CSN(1)), + + .io_ospi_sck (spi_sck), + .io_ospi_mosi(spi_mosi), + .io_ospi_miso(spi_miso[1]), + .io_ospi_csn (`ESPI_CSN(1)), + + .io_oqspi_sck(qspi_sck), + .io_oqspi_mosi(qspi_mosi), + .io_oqspi_miso(`EQSPI_MISO(1)), + .io_oqspi_isDirIn(), + .io_oqspi_csn(`EQSPI_CSN(1)), + + .io_isSoftReset(isSoftReset[1]), + .io_interrupt(io_int_sig[1]), + .io_latchPin_0(latch0), + .io_latchPin_1(latch1), + .io_hwSerial(`HW_SERIAL), + .io_uniCode(0) +); + +ShinTop s_ShinTop_slv1( + .clock(clock), + .reset(reset | isSoftReset_reg[2]), + + .io_multiCLK_0(multiCLK[0]), + .io_multiCLK_1(multiCLK[1]), + .io_multiCLK_2(multiCLK[2]), + .io_multiCLK_3(multiCLK[3]), + .io_multiCLK_4(multiCLK[4]), + .io_multiCLK_5(multiCLK[5]), + .io_multiCLK_6(multiCLK[6]), + .io_multiCLK_7(multiCLK[7]), + .io_multiCLK_8(multiCLK[8]), + .io_multiCLK_9(multiCLK[9]), + .io_multiCLK_10(multiCLK[10]), + .io_multiCLK_11(multiCLK[11]), + .io_multiCLK_12(multiCLK[12]), + .io_multiCLK_13(multiCLK[13]), + .io_multiCLK_14(multiCLK[14]), + .io_multiCLK_15(multiCLK[15]), + + .io_dDatIn(dDat_w[1]), + .io_dDatOut(dDat_w[2]), + .io_uDatIn(uDat_w[2]), + .io_uDatOut(uDat_w[1]), + + .io_iqspi_sck(qspi_sck), + .io_iqspi_mosi(qspi_mosi), + .io_iqspi_miso(`IQSPI_MISO(2)), + .io_iqspi_isDirIn(), + .io_iqspi_csn(`IQSPI_CSN(2)), + + .io_ospi_sck (spi_sck), + .io_ospi_mosi(spi_mosi), + .io_ospi_miso(spi_miso[2]), + .io_ospi_csn (`ESPI_CSN(2)), + + .io_oqspi_sck(qspi_sck), + .io_oqspi_mosi(qspi_mosi), + .io_oqspi_miso(`EQSPI_MISO(2)), + .io_oqspi_isDirIn(), + .io_oqspi_csn(`EQSPI_CSN(2)), + + .io_isSoftReset(isSoftReset[2]), + .io_interrupt(io_int_sig[2]), + .io_latchPin_0(latch0), + .io_latchPin_1(latch1), + .io_hwSerial(`HW_SERIAL), + .io_uniCode(0) +); + +ShinTop s_ShinTop_slv2( + .clock(clock), + .reset(reset | isSoftReset_reg[3]), + + .io_multiCLK_0(multiCLK[0]), + .io_multiCLK_1(multiCLK[1]), + .io_multiCLK_2(multiCLK[2]), + .io_multiCLK_3(multiCLK[3]), + .io_multiCLK_4(multiCLK[4]), + .io_multiCLK_5(multiCLK[5]), + .io_multiCLK_6(multiCLK[6]), + .io_multiCLK_7(multiCLK[7]), + .io_multiCLK_8(multiCLK[8]), + .io_multiCLK_9(multiCLK[9]), + .io_multiCLK_10(multiCLK[10]), + .io_multiCLK_11(multiCLK[11]), + .io_multiCLK_12(multiCLK[12]), + .io_multiCLK_13(multiCLK[13]), + .io_multiCLK_14(multiCLK[14]), + .io_multiCLK_15(multiCLK[15]), + + .io_dDatIn(dDat_w[2]), + .io_dDatOut(dDat_w[3]), + .io_uDatIn(uDat_w[3]), + .io_uDatOut(uDat_w[2]), + + .io_iqspi_sck(qspi_sck), + .io_iqspi_mosi(qspi_mosi), + .io_iqspi_miso(`IQSPI_MISO(3)), + .io_iqspi_isDirIn(), + .io_iqspi_csn(`IQSPI_CSN(3)), + + .io_ospi_sck (spi_sck), + .io_ospi_mosi(spi_mosi), + .io_ospi_miso(spi_miso[3]), + .io_ospi_csn (`ESPI_CSN(3)), + + .io_oqspi_sck(qspi_sck), + .io_oqspi_mosi(qspi_mosi), + .io_oqspi_miso(`EQSPI_MISO(3)), + .io_oqspi_isDirIn(), + .io_oqspi_csn(`EQSPI_CSN(3)), + + .io_isSoftReset(isSoftReset[3]), + .io_interrupt(io_int_sig[3]), + .io_latchPin_0(latch0), + .io_latchPin_1(latch1), + .io_hwSerial(`HW_SERIAL), + .io_uniCode(0) +); + +ShinTop s_ShinTop_slv3( + .clock(clock), + .reset(reset | isSoftReset_reg[4]), + + .io_multiCLK_0(multiCLK[0]), + .io_multiCLK_1(multiCLK[1]), + .io_multiCLK_2(multiCLK[2]), + .io_multiCLK_3(multiCLK[3]), + .io_multiCLK_4(multiCLK[4]), + .io_multiCLK_5(multiCLK[5]), + .io_multiCLK_6(multiCLK[6]), + .io_multiCLK_7(multiCLK[7]), + .io_multiCLK_8(multiCLK[8]), + .io_multiCLK_9(multiCLK[9]), + .io_multiCLK_10(multiCLK[10]), + .io_multiCLK_11(multiCLK[11]), + .io_multiCLK_12(multiCLK[12]), + .io_multiCLK_13(multiCLK[13]), + .io_multiCLK_14(multiCLK[14]), + .io_multiCLK_15(multiCLK[15]), + + .io_dDatIn(dDat_w[3]), + .io_dDatOut(), + .io_uDatIn(1'b0), + .io_uDatOut(uDat_w[3]), + + .io_iqspi_sck(qspi_sck), + .io_iqspi_mosi(qspi_mosi), + .io_iqspi_miso(`IQSPI_MISO(4)), + .io_iqspi_isDirIn(), + .io_iqspi_csn(`IQSPI_CSN(4)), + + .io_ospi_sck (spi_sck), + .io_ospi_mosi(spi_mosi), + .io_ospi_miso(spi_miso[4]), + .io_ospi_csn (`ESPI_CSN(4)), + + .io_oqspi_sck(qspi_sck), + .io_oqspi_mosi(qspi_mosi), + .io_oqspi_miso(`EQSPI_MISO(4)), + .io_oqspi_isDirIn(), + .io_oqspi_csn(`EQSPI_CSN(4)), + + .io_isSoftReset(isSoftReset[4]), + .io_interrupt(io_int_sig[4]), + .io_latchPin_0(latch0), + .io_latchPin_1(latch1), + .io_hwSerial(`HW_SERIAL), + .io_uniCode(0) +); +`endif + +initial begin + clock = 0; + reset = 1; + + latch0 = 0; + latch1 = 0; + + _reset_deactive = 1'b0; + + $timeformat(-9, 2, " ns", 8); + + spi_csn = {`SPI_CSN_NUM{1'b1}}; //~15'b0; + + #10000000 + reset <= 1; + + #24000000 + reset <= 0; + + #8000000000000 + #8000000000000 + #8000000000000 + +`ifdef USING_OSPI + #8000000000000 + #8000000000000 +`endif + + $display("Time Out !!!"); + $fclose(spidata_file); + //$stop; + $finish; +end + +initial begin + forever begin #8000000 clock <= ~clock; end +end + + +generate + for( genvar i = 0; i < 16; i = i + 1 ) begin + initial begin + multiCLK[i] = 0; + for( integer j = 0; j < i; j = j + 1 ) begin + #1000000 + ; + end + forever begin #8000000 multiCLK[i] <= ~multiCLK[i]; end + end + end +endgenerate + + +/* +//如果频率差到 80ppm,参数是: 8000640/1000080/8000640 [pass] +//如果频率差到120ppm,参数是: 8000960/1000120/8000960 [pass] +//如果频率差到160ppm,参数是: 8001280/1000160/8001280 [pass] +//如果频率差到168ppm,参数是: 8001344/1000168/8001344 [pass] + +//如果频率差到176ppm,参数是: 8001408/1000176/8001408 [pass] +//如果频率差到-176ppm,参数是: 7998592/ 999824/7998592 [pass] + +//如果频率差到180ppm,参数是: 8001440/1000180/8001440 [pass] +//如果频率差到-180ppm,参数是: 7998560/ 999820/7998560 [pass] + +//如果频率差到181ppm,参数是: 8001448/1000181/8001448 [failed] //tc29, tc30联合测试,tc30最后几个字节不过, 单测能过 +//如果频率差到-181ppm,参数是: 7998552/ 999819/7998552 [failed] //同上 + +//如果频率差到182ppm,参数是: 8001456/1000182/8001456 [failed] +//如果频率差到-182ppm,参数是: 7998544/ 999818/7998544 [failed] //单测, tc30下行是对的,上行发生错误 + +//如果频率差到184ppm,参数是: 8001472/1000184/8001472 [failed] //差得字节数不多,大概在180ppm上下 +//如果频率差到-184ppm,参数是: 7998528/ 999816/7998528 [failed] + +initial begin + forever begin #7998552 clock2 <= ~clock2; end +end + +generate + for( genvar i = 0; i < 16; i = i + 1 ) begin + initial begin + //相位信息 + #750000 + multiCLK2[i] = 0; + for( integer j = 0; j < i; j = j + 1 ) begin + #999819 + ; + end + forever begin #7998552 multiCLK2[i] <= ~multiCLK2[i]; end + end + end +endgenerate + + + +initial begin + forever begin #7998552 clock3 <= ~clock3; end +end + +generate + for( genvar i = 0; i < 16; i = i + 1 ) begin + initial begin + //相位信息 + #750000 + multiCLK3[i] = 0; + for( integer j = 0; j < i; j = j + 1 ) begin + #999819 + ; + end + forever begin #7998552 multiCLK3[i] <= ~multiCLK3[i]; end + end + end +endgenerate +*/ + + +`include "slave_dev_clk.vh" + +initial +begin + spidata_file = $fopen("spi_trans_data.txt", "w"); + if (!spidata_file) $display("文件打开失败"); + `ifdef VCS_COMPILE + $dumpfile("./generated/wave.vcd"); //生成的vcd文件名称 + //$dumpvars(0, ShinTopSpiTb);//tb模块名称 + $dumpvars(0, ShinTopSpiTb.s_ShinTop_Mst); + $dumpvars(0, ShinTopSpiTb.s_ShinTop_slv0); + //$dumpvars(0, ShinTopSpiTb.s_ShinTop_slv1); + `endif + + `ifdef IVERILOG_COMPILE + $dumpfile("./generated/wave_clk.fst"); //生成的fst文件名称 + $dumpvars(0, ShinTopSpiTb);//tb模块名称 + `endif +end + +always @(posedge reset) begin + _reset_deactive <= 1'b0; +end + +always @(negedge reset) begin + _reset_deactive <= 1'b1; +end + + `define SCKFRE #64000000 + + reg sck = 0; + + initial begin + forever begin + `SCKFRE sck <= ~sck; + end + end + + assign spi_sck = sck; + assign qspi_sck = sck; + + + reg [7:0] txBuf[0:2047]; + reg [7:0] rxBuf[0:2047]; + reg [7:0] exChangeRego; + reg [7:0] exChangeRegi; + + + + assign spi_mosi = exChangeRego[7]; + assign qspi_mosi = exChangeRego[7:4]; + + wire [3:0] qspi_mux_miso = `QSPI_MUX_MISO_INIT; + //( qspi_miso[4*0+3:4*0] & ~{4{spi_csn[ 0]}}) | + //( qspi_miso[4*1+3:4*1] & ~{4{spi_csn[ 1]}}) | + //( qspi_miso[4*2+3:4*2] & ~{4{spi_csn[ 2]}}) | + //( qspi_miso[4*3+3:4*3] & ~{4{spi_csn[ 3]}}) | + //( qspi_miso[4*4+3:4*4] & ~{4{spi_csn[ 4]}}) | + //( qspi_miso[4*5+3:4*5] & ~{4{spi_csn[10]}}) | + //( qspi_miso[4*6+3:4*6] & ~{4{spi_csn[11]}}) | + //( qspi_miso[4*7+3:4*7] & ~{4{spi_csn[12]}}) | + //( qspi_miso[4*8+3:4*8] & ~{4{spi_csn[13]}}) | + //( qspi_miso[4*9+3:4*9] & ~{4{spi_csn[14]}}); + /* + (`IQSPI_MISO(0) & ~{4{`IQSPI_CSN(0)}}) | + (`IQSPI_MISO(1) & ~{4{`IQSPI_CSN(1)}}) | + (`IQSPI_MISO(2) & ~{4{`IQSPI_CSN(2)}}) | + (`IQSPI_MISO(3) & ~{4{`IQSPI_CSN(3)}}) | + (`IQSPI_MISO(4) & ~{4{`IQSPI_CSN(4)}}) | + (`EQSPI_MISO(0) & ~{4{`EQSPI_CSN(0)}}) | + (`EQSPI_MISO(1) & ~{4{`EQSPI_CSN(1)}}) | + (`EQSPI_MISO(2) & ~{4{`EQSPI_CSN(2)}}) | + (`EQSPI_MISO(3) & ~{4{`EQSPI_CSN(3)}}) | + (`EQSPI_MISO(4) & ~{4{`EQSPI_CSN(4)}}); + */ + + wire spi_mux_miso = `SPI_MUX_MISO_INIT; + //( spi_miso[0] & ~spi_csn[5] ) | + //( spi_miso[1] & ~spi_csn[6] ) | + //( spi_miso[2] & ~spi_csn[7] ) | + //( spi_miso[3] & ~spi_csn[8] ) | + //( spi_miso[4] & ~spi_csn[9] ); + /* + ( spi_miso[0] & ~`ESPI_CSN(0)) | + ( spi_miso[1] & ~`ESPI_CSN(1)) | + ( spi_miso[2] & ~`ESPI_CSN(2)) | + ( spi_miso[3] & ~`ESPI_CSN(3)) | + ( spi_miso[4] & ~`ESPI_CSN(4)); + */ + + reg isReq = 0; + reg isBusy = 0; + + reg [11:0] length; + reg [16:0] idx; + + reg [11:0] transCnt; + reg [11:0] byteCnt; + reg [2:0] bitCnt; + + +always @(posedge clock) begin + if( isReq & sck == 0 ) begin + isBusy <= #500000 1'b1; + transCnt <= #500000 0; + + byteCnt <= #500000 ~12'b0; + bitCnt <= #500000 ~3'b0; + + spi_csn[idx] <= #500000 1'b0; + exChangeRego <= txBuf[0]; + end +end + +//DEV_NUM +//ALL_DEV_NUM +wire isQspi = (idx >= 0 && idx <= (`ALL_DEV_NUM - 1)) || idx >= (`ALL_DEV_NUM * 2); +wire [11:0] nextByteCnt = byteCnt + 1; + +//输出 +always @(negedge sck) begin + if( isBusy ) begin + if( &bitCnt ) begin + exChangeRego <= txBuf[nextByteCnt]; + end else begin + exChangeRego <= isQspi ? exChangeRego << 4 : exChangeRego << 1; + end + end +end + +//输入 +always @(posedge sck) begin + if( isBusy ) begin + if( transCnt <= length ) begin + if( isQspi ) begin + bitCnt <= ~bitCnt; + end else begin + bitCnt <= bitCnt + 1; + end + if ( idx >= (`ALL_DEV_NUM * 3) ) begin + if( &bitCnt ) begin + byteCnt <= byteCnt +1; + transCnt <= transCnt + 1; + if( (txBuf[2] & 8'h80) === 8'h80 & nextByteCnt >= 5) begin + rxBuf[byteCnt] <= exChangeRegi; + //$display("spi read out %x", exChangeRegi); + end + if( (txBuf[2] & 8'h80) === 8'h80 & nextByteCnt >= 4) begin + exChangeRegi <= isQspi ? {exChangeRegi[3:0], qspi_mux_miso} : {exChangeRegi[6:0], spi_mux_miso}; + end else begin + exChangeRegi <= 0; + end + end else begin + exChangeRegi <= isQspi ? {exChangeRegi[3:0], qspi_mux_miso} : {exChangeRegi[6:0], spi_mux_miso}; + end + end else begin + if( &bitCnt ) begin + byteCnt <= byteCnt +1; + transCnt <= transCnt + 1; + if( txBuf[2] === 8'h80 & nextByteCnt >= 4) begin + rxBuf[byteCnt] <= exChangeRegi; + //$display("spi read out %x", exChangeRegi); + end + if( txBuf[2] === 8'h80 & nextByteCnt >= 3) begin + exChangeRegi <= isQspi ? {exChangeRegi[3:0], qspi_mux_miso} : {exChangeRegi[6:0], spi_mux_miso}; + end else begin + exChangeRegi <= 0; + end + end else begin + exChangeRegi <= isQspi ? {exChangeRegi[3:0], qspi_mux_miso} : {exChangeRegi[6:0], spi_mux_miso}; + end + end + end else begin + isBusy <= #500000 1'b0; + spi_csn[idx] <= #500000 1'b1; + end + end +end + + + + +//mst slv0~slv3的 内部qspi调用即设置 +//sidx为0~4;外部spi为5~9,外部qspi为10~15 +task spi_trans( input [15:0] saddress, input [7:0] scmd, input [12:0] slength, input [16:0] sidx ); + begin + txBuf[0] <= saddress[15:8]; + txBuf[1] <= saddress[7:0]; + if (sidx >=(`ALL_DEV_NUM * 3)) begin + txBuf[2] <= (scmd | slength[12:8]); + txBuf[3] <= slength[7:0]; + length <= slength + 4; + end else begin + txBuf[2] <= scmd; + length <= slength + 3; + end + + idx <= sidx; + + #500000 + @(negedge sck) + isReq <= 1; + @(posedge sck) #500000 + isReq <= 0; + + @( negedge isBusy) #100000000 + begin + //$fwrite(spidata_file, "------------%5t------------\n", $realtime); + $fwrite(spidata_file, "T:%t \tdev:%4d(%4d), addr:0x%02h%02h, %s, len:%4d (0x%02h%02h)\n", + $realtime, + sidx % (`ALL_DEV_NUM), sidx, + txBuf[0], + txBuf[1], + (((txBuf[2] & 8'h80) == 0)? "Write":" Read"), + slength, + txBuf[2], txBuf[3]); + + if (sidx >=(`ALL_DEV_NUM * 3)) begin _pos = 4; end + else begin _pos = 3; end + + if ( ((saddress == 16'h0800) + || (saddress == 16'h1000) + || (saddress == 16'h1800) + || (saddress == 16'h2000) + || (saddress == 16'h2800) + || (saddress == 16'h3000) + || (saddress == 16'h3800) + || (saddress == 16'h4000) + ) + && ((sidx == 0) + || (sidx == `ALL_DEV_NUM) + || (sidx == (`ALL_DEV_NUM * 2)) + || (sidx == (`ALL_DEV_NUM * 3)) + ) + ) begin + + for (integer _k = 0; _k < 4; _k++) begin + if (scmd == 0) begin + $fwrite(spidata_file, "%02h ", txBuf[_k + _pos]); + end else begin + $fwrite(spidata_file, "%02h ", rxBuf[_k + _pos]); + end + end + + $fwrite(spidata_file, "\n"); + _pos = 4 + _pos; + for (; _pos < slength; ) begin + for (integer _k = 0; _k < 6; _k++) begin + if (scmd == 0) begin + $fwrite(spidata_file, "%02h ", txBuf[_k + _pos]); + _len = txBuf[_pos + 5] + (txBuf[_pos + 4] & 8'h0f) * 256; + end else begin + $fwrite(spidata_file, "%02h ", rxBuf[_k + _pos]); + _len = rxBuf[_pos + 5] + (rxBuf[_pos + 4] & 8'h0f) * 256; + end + end + + begin:PRINT_PKT_COMMENT + integer dev; + integer addr_type; + integer addr; + integer cmd; + integer len; + + if (scmd == 0) begin + addr_type = txBuf[_pos + 1] & 8'h3; + dev = (txBuf[_pos] * 256) >> 2; + dev = dev + ((txBuf[_pos + 1] >> 2) & 8'hff); + addr = txBuf[_pos + 2] * 256 + (txBuf[_pos + 3] & 8'hff); + cmd = (txBuf[_pos + 4] >> 4) & 8'h0f; + len = (txBuf[_pos + 4] & 8'h0f) * 256 + (txBuf[_pos + 5] & 8'hff); + end else begin + addr_type = rxBuf[_pos + 1] & 8'h3; + dev = (rxBuf[_pos] * 256) >> 2; + dev = dev + ((rxBuf[_pos + 1] >> 2) & 8'hff); + addr = rxBuf[_pos + 2] * 256 + (rxBuf[_pos + 3] & 8'hff); + cmd = (rxBuf[_pos + 4] >> 4) & 8'h0f; + len = (rxBuf[_pos + 4] & 8'h0f) * 256 + (rxBuf[_pos + 5] & 8'hff); + end + + if (addr_type == 0) + $fwrite(spidata_file, "// type:%3d dev:%3d addr:0x%04x cmd:0x%1x len:%3d", addr_type, dev, addr[15:0], cmd[3:0], len); + else begin + addr = dev * 65536 + addr; + $fwrite(spidata_file, "// type:%3d addr:0x%08x cmd:0x%1x len:%3d", addr_type, addr, cmd[3:0], len); + end + end + + $fwrite(spidata_file, "\n{{ "); + _pos = _pos + 6; + for (integer _k = 0; _k < _len; _k++) begin + if (scmd == 0) begin + $fwrite(spidata_file, "%02h ", txBuf[_k + _pos]); + end else begin + $fwrite(spidata_file, "%02h ", rxBuf[_k + _pos]); + end + c_line = 0; + if ((_k + 2)%16 == 0) begin + $fwrite(spidata_file, "\n"); + c_line = 1; + end + end + $fwrite(spidata_file, "}}\n"); + _pos = _pos + _len; + + for (integer _k = 0; _k < 2; _k++) begin + if (scmd == 0) begin + $fwrite(spidata_file, "%02h ", txBuf[_k + _pos]); + end else begin + $fwrite(spidata_file, "%02h ", rxBuf[_k + _pos]); + end + end + _pos = _pos + 2; + $fwrite(spidata_file, "\n"); + end + end else begin + for (integer i=0; i=(`ALL_DEV_NUM * 3)) begin + txBuf[2] <= (`SPI_READ | 8'h0); + txBuf[3] <= 8'h04; + length = 8'h08; + //$display("using AQspi"); + end else begin + txBuf[2] <= `SPI_READ; + length = 8'h07; + //$display("using iqspi"); + end + + + idx = dev_idx; + + #500000 + @(negedge sck) + isReq <= 1; + @(posedge sck) #500000 + isReq <= 0; + + @( negedge isBusy) #100000000 + begin + + end + #100000000 + //$display("%x %x", rxBuf[3], rxBuf[6]); + if ((rxBuf[`ARRAY_IDX_OFF] & 8'h02) == 8'h02) + begin + is_run = 0; + end + if ((rxBuf[`ARRAY_IDX_OFF+3] & 8'h60) != 8'h00) + begin + $display("error occur"); + is_run = 0; + end + if (($realtime - st) >= 1000000000000.0) + begin + $display("comm timeout."); + is_run = 0; + end + end + end +endtask + + +initial begin + + #50000000 + + + `include "tc_runlist.vh" + + #100000000000 + $display("Testcase Finished! Time Out !!!"); + $fclose(spidata_file); + //$stop; + $finish; + +end + + +endmodule + diff --git a/tb/shinTest/SimCDRTb.v b/tb/shinTest/SimCDRTb.v index aa3330c..667d769 100644 --- a/tb/shinTest/SimCDRTb.v +++ b/tb/shinTest/SimCDRTb.v @@ -1,101 +1,101 @@ -`timescale 1 ns / 1 ps - - -module SimCDRTb( - -); - - reg clock = 0; - reg reset = 0; - - reg [15:0] multiCLK; - - initial begin - clock = 0; - reset = 1; - - #100 - reset <= 1; - - #240 - reset <= 0; - end - - - initial begin - forever begin #8000000 clock <= ~clock; end - end - - /* - generate - for( genvar i = 0; i < 16; i = i + 1 ) begin - initial begin - multiCLK[i] = 0; - for( integer j = 0; j < i; j = j + 1 ) begin - #1000176 - ; - end - forever begin #8001408 multiCLK[i] <= ~multiCLK[i]; end - end - end - endgenerate - */ - - `include "simCdrClk.vh" - - reg [7:0] data; - wire success; - wire failed; - - integer seed = 606; - always @(posedge clock) begin - data <= $random(seed); - end - - - SimCDR s_SimCDR( - .clock(clock), - .reset(reset), - .io_data(data), - .io_multiCLK_0(multiCLK[0]), - .io_multiCLK_1(multiCLK[1]), - .io_multiCLK_2(multiCLK[2]), - .io_multiCLK_3(multiCLK[3]), - .io_multiCLK_4(multiCLK[4]), - .io_multiCLK_5(multiCLK[5]), - .io_multiCLK_6(multiCLK[6]), - .io_multiCLK_7(multiCLK[7]), - .io_multiCLK_8(multiCLK[8]), - .io_multiCLK_9(multiCLK[9]), - .io_multiCLK_10(multiCLK[10]), - .io_multiCLK_11(multiCLK[11]), - .io_multiCLK_12(multiCLK[12]), - .io_multiCLK_13(multiCLK[13]), - .io_multiCLK_14(multiCLK[14]), - .io_multiCLK_15(multiCLK[15]), - - .io_flush(1'b0), - .io_isSuccess(success), - .io_isFailed(failed) - ); - - - initial - begin - $dumpfile("./tb/build/wave_cdr.vcd"); //生成的vcd文件名称 - $dumpvars(0, SimCDRTb);//tb模块名称 - end - - always @(posedge clock) begin - if (success) begin - $display("Success onces! \n"); - end - if (failed) begin - $display("Error! \n"); - $stop; - end - end - - - -endmodule +`timescale 1 ns / 1 ps + + +module SimCDRTb( + +); + + reg clock = 0; + reg reset = 0; + + reg [15:0] multiCLK; + + initial begin + clock = 0; + reset = 1; + + #100 + reset <= 1; + + #240 + reset <= 0; + end + + + initial begin + forever begin #8000000 clock <= ~clock; end + end + + /* + generate + for( genvar i = 0; i < 16; i = i + 1 ) begin + initial begin + multiCLK[i] = 0; + for( integer j = 0; j < i; j = j + 1 ) begin + #1000176 + ; + end + forever begin #8001408 multiCLK[i] <= ~multiCLK[i]; end + end + end + endgenerate + */ + + `include "simCdrClk.vh" + + reg [7:0] data; + wire success; + wire failed; + + integer seed = 606; + always @(posedge clock) begin + data <= $random(seed); + end + + + SimCDR s_SimCDR( + .clock(clock), + .reset(reset), + .io_data(data), + .io_multiCLK_0(multiCLK[0]), + .io_multiCLK_1(multiCLK[1]), + .io_multiCLK_2(multiCLK[2]), + .io_multiCLK_3(multiCLK[3]), + .io_multiCLK_4(multiCLK[4]), + .io_multiCLK_5(multiCLK[5]), + .io_multiCLK_6(multiCLK[6]), + .io_multiCLK_7(multiCLK[7]), + .io_multiCLK_8(multiCLK[8]), + .io_multiCLK_9(multiCLK[9]), + .io_multiCLK_10(multiCLK[10]), + .io_multiCLK_11(multiCLK[11]), + .io_multiCLK_12(multiCLK[12]), + .io_multiCLK_13(multiCLK[13]), + .io_multiCLK_14(multiCLK[14]), + .io_multiCLK_15(multiCLK[15]), + + .io_flush(1'b0), + .io_isSuccess(success), + .io_isFailed(failed) + ); + + + initial + begin + $dumpfile("./tb/build/wave_cdr.vcd"); //生成的vcd文件名称 + $dumpvars(0, SimCDRTb);//tb模块名称 + end + + always @(posedge clock) begin + if (success) begin + $display("Success onces! \n"); + end + if (failed) begin + $display("Error! \n"); + $stop; + end + end + + + +endmodule diff --git a/tb/shinTest/check_testcase.py b/tb/shinTest/check_testcase.py index 7a3891b..caec1c1 100755 --- a/tb/shinTest/check_testcase.py +++ b/tb/shinTest/check_testcase.py @@ -1,158 +1,158 @@ -#!/usr/bin/env python -#encoding=utf-8 -import os - - -def parse_value(value): - """Parse a value with bit-width specification and return its integer representation and mask. - The mask will have 1s where the bits are valid and 0s where they are 'x'. - """ - if 'h' in value.lower(): - base = 16 - prefix_length = value.find('h') + 1 - elif 'o' in value.lower(): - base = 8 - prefix_length = value.find('o') + 1 - elif 'b' in value.lower(): - base = 2 - prefix_length = value.find('b') + 1 - else: - raise ValueError(f"Invalid format for value: {value}") - - # Extract the numeric part - num_str = value[prefix_length:] - - # Initialize parsed value and mask - parsed_value = 0 - mask = 0 - - # Process each character in the numeric part - #print(num_str) - for char in num_str: - if char.lower() == 'x': - mask = mask * base - parsed_value = parsed_value * base - else: - mask = (mask * base) + (base - 1) - parsed_value = (parsed_value * base) + int(char, base) - - #print(value, hex(parsed_value), hex(mask)) - return parsed_value, mask - -def compare_files(source_file, target_file): - warning_need_recheck = 0 - try: - with open(source_file, 'r') as src, open(target_file, 'r') as tgt: - source_lines = src.readlines() - target_lines = tgt.readlines() - - if len(source_lines) != len(target_lines): - print(f"Error: The number of lines in {source_file} and {target_file} do not match.") - return - - all_match = True - - for i, (src_line, tgt_line) in enumerate(zip(source_lines, target_lines)): - src_values = src_line.strip().split() - tgt_values = tgt_line.strip().split() - - if len(src_values) != len(tgt_values): - if len(src_values) != 1: - print(f"Error: Line {i+1}: The number of values in {source_file} and {target_file} do not match.") - all_match = False - continue - else: - if src_values[0].strip().lower() == 'x': - if warning_need_recheck == 0: - print(f'[\033[93mWARNING\033[0m] Ignored lines detected. This test case requires manual comparison. \n\t[\033[93mTARGET\033[0m] {target_file}\n\t[\033[93mSRC\033[0m] {source_file}') - warning_need_recheck = 1 - continue - - line_match = True - - for j, (src_val, tgt_val) in enumerate(zip(src_values, tgt_values)): - try: - src_int, src_mask = parse_value(src_val) - tgt_int, tgt_mask = parse_value(tgt_val) - except ValueError as e: - print(f"Error: Line {i+1}, Position {j+1}: {e}") - line_match = False - all_match = False - continue - - # Combine masks to determine which bits to compare - combined_mask = src_mask #& tgt_mask - - # Compare only the bits that are not 'x' in either source or target - if combined_mask == 0: - #print(f"Line {i+1}, Position {j+1}: Both values contain 'x' at all positions, skipping check.") - continue - - masked_src = src_int & combined_mask - masked_tgt = tgt_int & combined_mask - #print(hex(masked_src), hex(masked_tgt), hex(combined_mask)) - - if masked_src == masked_tgt: - #print(f"Line {i+1}, Position {j+1}: Values match ({src_val} == {tgt_val}).") - pass - else: - #print(f"\tLine {i+1}, Position {j+1}: Values differ ({src_val} != {tgt_val}).") - line_match = False - all_match = False - - if line_match: - #print(f"Line {i+1}: All values on this line match.") - pass - - if all_match: - #print("All lines match.") - #pass - return True - else: - #print("Some lines or positions do not match.") - #pass - return False - - except FileNotFoundError as e: - print(f"Error: {e}") - except Exception as e: - print(f"An unexpected error occurred: {e}") - - return False - -def list_files_in_directory(directory): - try: - # 获取目录中的所有文件和子目录 - files = os.listdir(directory) - - # 过滤出文件(排除子目录) - files_only = [f for f in files if os.path.isfile(os.path.join(directory, f))] - - return files_only - except FileNotFoundError: - print(f"Error: The directory '{directory}' does not exist.") - return [] - except PermissionError: - print(f"Error: Permission denied to access the directory '{directory}'.") - return [] - except Exception as e: - print(f"An unexpected error occurred: {e}") - return [] - -if __name__ == "__main__": - files = list_files_in_directory('generated/log') - src_files = list_files_in_directory('tb/shinTest/testcase_result') - for fi in files: - rst_f = 'generated/log/' + fi - src_f = 'tb/shinTest/testcase_result/' + fi - - outmsg = f"TESTCASE: {fi}" - outmsg = outmsg + " " * (60 - len(outmsg)) - if not (fi in src_files): - print(f"{outmsg}[\033[93mIGNORE\033[0m]") - continue - - if compare_files(src_f, rst_f): - print(f"{outmsg}[\033[92mPASS\033[0m]") - else: +#!/usr/bin/env python +#encoding=utf-8 +import os + + +def parse_value(value): + """Parse a value with bit-width specification and return its integer representation and mask. + The mask will have 1s where the bits are valid and 0s where they are 'x'. + """ + if 'h' in value.lower(): + base = 16 + prefix_length = value.find('h') + 1 + elif 'o' in value.lower(): + base = 8 + prefix_length = value.find('o') + 1 + elif 'b' in value.lower(): + base = 2 + prefix_length = value.find('b') + 1 + else: + raise ValueError(f"Invalid format for value: {value}") + + # Extract the numeric part + num_str = value[prefix_length:] + + # Initialize parsed value and mask + parsed_value = 0 + mask = 0 + + # Process each character in the numeric part + #print(num_str) + for char in num_str: + if char.lower() == 'x': + mask = mask * base + parsed_value = parsed_value * base + else: + mask = (mask * base) + (base - 1) + parsed_value = (parsed_value * base) + int(char, base) + + #print(value, hex(parsed_value), hex(mask)) + return parsed_value, mask + +def compare_files(source_file, target_file): + warning_need_recheck = 0 + try: + with open(source_file, 'r') as src, open(target_file, 'r') as tgt: + source_lines = src.readlines() + target_lines = tgt.readlines() + + if len(source_lines) != len(target_lines): + print(f"Error: The number of lines in {source_file} and {target_file} do not match.") + return + + all_match = True + + for i, (src_line, tgt_line) in enumerate(zip(source_lines, target_lines)): + src_values = src_line.strip().split() + tgt_values = tgt_line.strip().split() + + if len(src_values) != len(tgt_values): + if len(src_values) != 1: + print(f"Error: Line {i+1}: The number of values in {source_file} and {target_file} do not match.") + all_match = False + continue + else: + if src_values[0].strip().lower() == 'x': + if warning_need_recheck == 0: + print(f'[\033[93mWARNING\033[0m] Ignored lines detected. This test case requires manual comparison. \n\t[\033[93mTARGET\033[0m] {target_file}\n\t[\033[93mSRC\033[0m] {source_file}') + warning_need_recheck = 1 + continue + + line_match = True + + for j, (src_val, tgt_val) in enumerate(zip(src_values, tgt_values)): + try: + src_int, src_mask = parse_value(src_val) + tgt_int, tgt_mask = parse_value(tgt_val) + except ValueError as e: + print(f"Error: Line {i+1}, Position {j+1}: {e}") + line_match = False + all_match = False + continue + + # Combine masks to determine which bits to compare + combined_mask = src_mask #& tgt_mask + + # Compare only the bits that are not 'x' in either source or target + if combined_mask == 0: + #print(f"Line {i+1}, Position {j+1}: Both values contain 'x' at all positions, skipping check.") + continue + + masked_src = src_int & combined_mask + masked_tgt = tgt_int & combined_mask + #print(hex(masked_src), hex(masked_tgt), hex(combined_mask)) + + if masked_src == masked_tgt: + #print(f"Line {i+1}, Position {j+1}: Values match ({src_val} == {tgt_val}).") + pass + else: + #print(f"\tLine {i+1}, Position {j+1}: Values differ ({src_val} != {tgt_val}).") + line_match = False + all_match = False + + if line_match: + #print(f"Line {i+1}: All values on this line match.") + pass + + if all_match: + #print("All lines match.") + #pass + return True + else: + #print("Some lines or positions do not match.") + #pass + return False + + except FileNotFoundError as e: + print(f"Error: {e}") + except Exception as e: + print(f"An unexpected error occurred: {e}") + + return False + +def list_files_in_directory(directory): + try: + # 获取目录中的所有文件和子目录 + files = os.listdir(directory) + + # 过滤出文件(排除子目录) + files_only = [f for f in files if os.path.isfile(os.path.join(directory, f))] + + return files_only + except FileNotFoundError: + print(f"Error: The directory '{directory}' does not exist.") + return [] + except PermissionError: + print(f"Error: Permission denied to access the directory '{directory}'.") + return [] + except Exception as e: + print(f"An unexpected error occurred: {e}") + return [] + +if __name__ == "__main__": + files = list_files_in_directory('generated/log') + src_files = list_files_in_directory('tb/shinTest/testcase_result') + for fi in files: + rst_f = 'generated/log/' + fi + src_f = 'tb/shinTest/testcase_result/' + fi + + outmsg = f"TESTCASE: {fi}" + outmsg = outmsg + " " * (60 - len(outmsg)) + if not (fi in src_files): + print(f"{outmsg}[\033[93mIGNORE\033[0m]") + continue + + if compare_files(src_f, rst_f): + print(f"{outmsg}[\033[92mPASS\033[0m]") + else: print(f"{outmsg}[\033[91mFAILED\033[0m]\n\t[\033[91mTARGET\033[0m] {rst_f}\n\t[\033[91mSRC\033[0m] {src_f}") \ No newline at end of file diff --git a/tb/shinTest/gen_pkt.py b/tb/shinTest/gen_pkt.py index be35d82..8179c8b 100755 --- a/tb/shinTest/gen_pkt.py +++ b/tb/shinTest/gen_pkt.py @@ -1,164 +1,164 @@ -#!/usr/bin/env python -#encoding=utf-8 -from pyutils import * -from testcase import environment, rwregs, ebmmu, errorPkt, watchdog, broadcast, sync, base, mac -import argparse - - -if __name__ == '__main__': - parser = argparse.ArgumentParser() - - # 可选参数 - parser.add_argument("-8b10b", action="store_true", dest="use_8b10b", default=False, help="使用8b10b编码") - parser.add_argument("-spi", dest="spi_type", type=int, default=0, help="选择SPI,0:ISPI;1:OSPI;2:OQSPI;3:AQSPI") - parser.add_argument("-cdr", dest="cdr_type", type=int, default=0, help="选择CDR") - # 解析参数 - args = parser.parse_args() - - #if args.use_8b10b: - # add_tc_2_runlist(rwregs.tc1()) - #print(args.spi_type) - environment.set_spi_interface(args.spi_type) - environment.set_using_8b10b(args.use_8b10b) - environment.set_cdr_type(args.cdr_type) - - environment.gen_slv_dev_num(4) - environment.bringup() - - ''' - add_tc_2_runlist(errorPkt.tc1()) - add_tc_2_runlist(errorPkt.tc2()) - add_tc_2_runlist(errorPkt.tc3()) - add_tc_2_runlist(errorPkt.tc4()) - add_tc_2_runlist(errorPkt.tc5()) - add_tc_2_runlist(errorPkt.tc6()) - add_tc_2_runlist(errorPkt.tc7()) - add_tc_2_runlist(errorPkt.tc8()) - add_tc_2_runlist(errorPkt.tc9()) - add_tc_2_runlist(errorPkt.tc10()) - add_tc_2_runlist(errorPkt.tc11()) - add_tc_2_runlist(errorPkt.tc12()) - add_tc_2_runlist(errorPkt.tc13()) - add_tc_2_runlist(errorPkt.tc14()) - add_tc_2_runlist(errorPkt.tc15()) - add_tc_2_runlist(errorPkt.tc16()) - add_tc_2_runlist(errorPkt.tc17()) - add_tc_2_runlist(errorPkt.tc18()) - add_tc_2_runlist(errorPkt.tc19()) - add_tc_2_runlist(errorPkt.tc20()) - add_tc_2_runlist(errorPkt.tc21()) - add_tc_2_runlist(errorPkt.tc22()) - add_tc_2_runlist(errorPkt.tc23()) - add_tc_2_runlist(errorPkt.tc24()) - add_tc_2_runlist(errorPkt.tc25()) - add_tc_2_runlist(errorPkt.tc26()) - add_tc_2_runlist(errorPkt.tc27()) - add_tc_2_runlist(errorPkt.tc28()) - add_tc_2_runlist(errorPkt.tc29()) - add_tc_2_runlist(errorPkt.tc30()) - add_tc_2_runlist(errorPkt.tc31()) - add_tc_2_runlist(errorPkt.tc32()) - add_tc_2_runlist(errorPkt.tc33()) - add_tc_2_runlist(errorPkt.tc34()) - add_tc_2_runlist(errorPkt.tc35()) - add_tc_2_runlist(errorPkt.tc36()) - add_tc_2_runlist(errorPkt.tc37()) - add_tc_2_runlist(errorPkt.tc38()) - #''' - - ''' - add_tc_2_runlist(rwregs.tc1()) - add_tc_2_runlist(rwregs.tc2()) - add_tc_2_runlist(rwregs.tc3()) - #''' - - ''' - add_tc_2_runlist(base.tc1()) - add_tc_2_runlist(base.tc2()) - add_tc_2_runlist(base.tc3()) - add_tc_2_runlist(base.tc4()) - add_tc_2_runlist(base.tc5()) - add_tc_2_runlist(base.tc6()) - add_tc_2_runlist(base.tc7()) - add_tc_2_runlist(base.tc8()) - add_tc_2_runlist(base.tc9()) - add_tc_2_runlist(base.tc10()) - add_tc_2_runlist(base.tc11()) - add_tc_2_runlist(base.tc12()) - add_tc_2_runlist(base.tc13()) - add_tc_2_runlist(base.tc14()) - add_tc_2_runlist(base.tc15()) - add_tc_2_runlist(base.tc16()) - add_tc_2_runlist(base.tc17()) - add_tc_2_runlist(base.tc18()) - add_tc_2_runlist(base.tc19()) - add_tc_2_runlist(base.tc20()) - add_tc_2_runlist(base.tc21()) - add_tc_2_runlist(base.tc22()) - add_tc_2_runlist(base.tc23()) - add_tc_2_runlist(base.tc24()) - add_tc_2_runlist(base.tc25()) - add_tc_2_runlist(base.tc26()) - add_tc_2_runlist(base.tc27()) - add_tc_2_runlist(base.tc28()) - add_tc_2_runlist(base.tc29()) - add_tc_2_runlist(base.tc30()) - add_tc_2_runlist(base.tc31()) - #''' - - ''' - add_tc_2_runlist(broadcast.tc1()) - add_tc_2_runlist(broadcast.tc2()) - add_tc_2_runlist(broadcast.tc3()) - #''' - - ''' - add_tc_2_runlist(sync.tc1()) - add_tc_2_runlist(sync.tc2()) - add_tc_2_runlist(sync.tc3()) - add_tc_2_runlist(sync.tc4()) - add_tc_2_runlist(sync.tc5()) - add_tc_2_runlist(sync.tc6()) - add_tc_2_runlist(sync.tc7()) - add_tc_2_runlist(sync.tc8()) - #''' - - ''' - add_tc_2_runlist(ebmmu.tc1()) - add_tc_2_runlist(ebmmu.tc2()) - add_tc_2_runlist(ebmmu.tc3()) - add_tc_2_runlist(ebmmu.tc4()) - add_tc_2_runlist(ebmmu.tc5()) - add_tc_2_runlist(ebmmu.tc6()) - add_tc_2_runlist(ebmmu.tc7()) - add_tc_2_runlist(ebmmu.tc8()) - add_tc_2_runlist(ebmmu.tc9()) - add_tc_2_runlist(ebmmu.tc10()) - add_tc_2_runlist(ebmmu.tc11()) - add_tc_2_runlist(ebmmu.tc12()) - add_tc_2_runlist(ebmmu.tc13()) - add_tc_2_runlist(ebmmu.tc14()) - add_tc_2_runlist(ebmmu.tc15()) - add_tc_2_runlist(ebmmu.tc16()) - add_tc_2_runlist(ebmmu.tc17()) - add_tc_2_runlist(ebmmu.tc18()) - add_tc_2_runlist(ebmmu.tc19()) - #''' - - add_tc_2_runlist(watchdog.tc1()) - add_tc_2_runlist(watchdog.tc2()) - add_tc_2_runlist(watchdog.tc3()) - add_tc_2_runlist(watchdog.tc4()) - - #add_tc_2_runlist(mac.tc1()) - #add_tc_2_runlist(mac.tc2()) - #add_tc_2_runlist(mac.tc3()) - #add_tc_2_runlist(mac.tc4()) - #add_tc_2_runlist(mac.tc5()) - #add_tc_2_runlist(mac.tc6()) - #add_tc_2_runlist(mac.tc7()) - - environment.teardown() - - gen_tc_runlist() - +#!/usr/bin/env python +#encoding=utf-8 +from pyutils import * +from testcase import environment, rwregs, ebmmu, errorPkt, watchdog, broadcast, sync, base, mac +import argparse + + +if __name__ == '__main__': + parser = argparse.ArgumentParser() + + # 可选参数 + parser.add_argument("-8b10b", action="store_true", dest="use_8b10b", default=False, help="使用8b10b编码") + parser.add_argument("-spi", dest="spi_type", type=int, default=0, help="选择SPI,0:ISPI;1:OSPI;2:OQSPI;3:AQSPI") + parser.add_argument("-cdr", dest="cdr_type", type=int, default=0, help="选择CDR") + # 解析参数 + args = parser.parse_args() + + #if args.use_8b10b: + # add_tc_2_runlist(rwregs.tc1()) + #print(args.spi_type) + environment.set_spi_interface(args.spi_type) + environment.set_using_8b10b(args.use_8b10b) + environment.set_cdr_type(args.cdr_type) + + environment.gen_slv_dev_num(4) + environment.bringup() + + ''' + add_tc_2_runlist(errorPkt.tc1()) + add_tc_2_runlist(errorPkt.tc2()) + add_tc_2_runlist(errorPkt.tc3()) + add_tc_2_runlist(errorPkt.tc4()) + add_tc_2_runlist(errorPkt.tc5()) + add_tc_2_runlist(errorPkt.tc6()) + add_tc_2_runlist(errorPkt.tc7()) + add_tc_2_runlist(errorPkt.tc8()) + add_tc_2_runlist(errorPkt.tc9()) + add_tc_2_runlist(errorPkt.tc10()) + add_tc_2_runlist(errorPkt.tc11()) + add_tc_2_runlist(errorPkt.tc12()) + add_tc_2_runlist(errorPkt.tc13()) + add_tc_2_runlist(errorPkt.tc14()) + add_tc_2_runlist(errorPkt.tc15()) + add_tc_2_runlist(errorPkt.tc16()) + add_tc_2_runlist(errorPkt.tc17()) + add_tc_2_runlist(errorPkt.tc18()) + add_tc_2_runlist(errorPkt.tc19()) + add_tc_2_runlist(errorPkt.tc20()) + add_tc_2_runlist(errorPkt.tc21()) + add_tc_2_runlist(errorPkt.tc22()) + add_tc_2_runlist(errorPkt.tc23()) + add_tc_2_runlist(errorPkt.tc24()) + add_tc_2_runlist(errorPkt.tc25()) + add_tc_2_runlist(errorPkt.tc26()) + add_tc_2_runlist(errorPkt.tc27()) + add_tc_2_runlist(errorPkt.tc28()) + add_tc_2_runlist(errorPkt.tc29()) + add_tc_2_runlist(errorPkt.tc30()) + add_tc_2_runlist(errorPkt.tc31()) + add_tc_2_runlist(errorPkt.tc32()) + add_tc_2_runlist(errorPkt.tc33()) + add_tc_2_runlist(errorPkt.tc34()) + add_tc_2_runlist(errorPkt.tc35()) + add_tc_2_runlist(errorPkt.tc36()) + add_tc_2_runlist(errorPkt.tc37()) + add_tc_2_runlist(errorPkt.tc38()) + #''' + + ''' + add_tc_2_runlist(rwregs.tc1()) + add_tc_2_runlist(rwregs.tc2()) + add_tc_2_runlist(rwregs.tc3()) + #''' + + ''' + add_tc_2_runlist(base.tc1()) + add_tc_2_runlist(base.tc2()) + add_tc_2_runlist(base.tc3()) + add_tc_2_runlist(base.tc4()) + add_tc_2_runlist(base.tc5()) + add_tc_2_runlist(base.tc6()) + add_tc_2_runlist(base.tc7()) + add_tc_2_runlist(base.tc8()) + add_tc_2_runlist(base.tc9()) + add_tc_2_runlist(base.tc10()) + add_tc_2_runlist(base.tc11()) + add_tc_2_runlist(base.tc12()) + add_tc_2_runlist(base.tc13()) + add_tc_2_runlist(base.tc14()) + add_tc_2_runlist(base.tc15()) + add_tc_2_runlist(base.tc16()) + add_tc_2_runlist(base.tc17()) + add_tc_2_runlist(base.tc18()) + add_tc_2_runlist(base.tc19()) + add_tc_2_runlist(base.tc20()) + add_tc_2_runlist(base.tc21()) + add_tc_2_runlist(base.tc22()) + add_tc_2_runlist(base.tc23()) + add_tc_2_runlist(base.tc24()) + add_tc_2_runlist(base.tc25()) + add_tc_2_runlist(base.tc26()) + add_tc_2_runlist(base.tc27()) + add_tc_2_runlist(base.tc28()) + add_tc_2_runlist(base.tc29()) + add_tc_2_runlist(base.tc30()) + add_tc_2_runlist(base.tc31()) + #''' + + ''' + add_tc_2_runlist(broadcast.tc1()) + add_tc_2_runlist(broadcast.tc2()) + add_tc_2_runlist(broadcast.tc3()) + #''' + + ''' + add_tc_2_runlist(sync.tc1()) + add_tc_2_runlist(sync.tc2()) + add_tc_2_runlist(sync.tc3()) + add_tc_2_runlist(sync.tc4()) + add_tc_2_runlist(sync.tc5()) + add_tc_2_runlist(sync.tc6()) + add_tc_2_runlist(sync.tc7()) + add_tc_2_runlist(sync.tc8()) + #''' + + ''' + add_tc_2_runlist(ebmmu.tc1()) + add_tc_2_runlist(ebmmu.tc2()) + add_tc_2_runlist(ebmmu.tc3()) + add_tc_2_runlist(ebmmu.tc4()) + add_tc_2_runlist(ebmmu.tc5()) + add_tc_2_runlist(ebmmu.tc6()) + add_tc_2_runlist(ebmmu.tc7()) + add_tc_2_runlist(ebmmu.tc8()) + add_tc_2_runlist(ebmmu.tc9()) + add_tc_2_runlist(ebmmu.tc10()) + add_tc_2_runlist(ebmmu.tc11()) + add_tc_2_runlist(ebmmu.tc12()) + add_tc_2_runlist(ebmmu.tc13()) + add_tc_2_runlist(ebmmu.tc14()) + add_tc_2_runlist(ebmmu.tc15()) + add_tc_2_runlist(ebmmu.tc16()) + add_tc_2_runlist(ebmmu.tc17()) + add_tc_2_runlist(ebmmu.tc18()) + add_tc_2_runlist(ebmmu.tc19()) + #''' + + add_tc_2_runlist(watchdog.tc1()) + add_tc_2_runlist(watchdog.tc2()) + add_tc_2_runlist(watchdog.tc3()) + add_tc_2_runlist(watchdog.tc4()) + + #add_tc_2_runlist(mac.tc1()) + #add_tc_2_runlist(mac.tc2()) + #add_tc_2_runlist(mac.tc3()) + #add_tc_2_runlist(mac.tc4()) + #add_tc_2_runlist(mac.tc5()) + #add_tc_2_runlist(mac.tc6()) + #add_tc_2_runlist(mac.tc7()) + + environment.teardown() + + gen_tc_runlist() + diff --git a/tb/shinTest/gen_pkt_clk.py b/tb/shinTest/gen_pkt_clk.py index 928f0c4..9302c71 100755 --- a/tb/shinTest/gen_pkt_clk.py +++ b/tb/shinTest/gen_pkt_clk.py @@ -1,168 +1,168 @@ -#!/usr/bin/env python -#encoding=utf-8 -from pyutils import * -from testcase import environment, rwregs, ebmmu, errorPkt, watchdog, broadcast, sync, base, mac -import argparse - -if __name__ == '__main__': - - parser = argparse.ArgumentParser() - - # 可选参数 - parser.add_argument("-d1", "--dev1", nargs=2, type=int, default=[0, 0], help="相位(度)、频率偏差ppm") - parser.add_argument("-d2", "--dev2", nargs=2, type=int, default=[0, 0], help="相位(度)、频率偏差ppm") - parser.add_argument("-d3", "--dev3", nargs=2, type=int, default=[0, 0], help="相位(度)、频率偏差ppm") - parser.add_argument("-d4", "--dev4", nargs=2, type=int, default=[0, 0], help="相位(度)、频率偏差ppm") - parser.add_argument("-8b10b", action="store_true", dest="use_8b10b", default=False, help="使用8b10b编码") - parser.add_argument("-spi", dest="spi_type", type=int, default=0, help="选择SPI,0:ISPI;1:OSPI;2:OQSPI;3:AQSPI") - parser.add_argument("-cdr", dest="cdr_type", type=int, default=0, help="选择CDR") - - # 解析参数 - args = parser.parse_args() - # 使用参数 - dev_clk_info = dict() - if args.dev1 != [0, 0]: - dev_clk_info[1] = args.dev1 - - if args.dev2 != [0, 0]: - dev_clk_info[2] = args.dev2 - - if args.dev3 != [0, 0]: - dev_clk_info[3] = args.dev3 - - if args.dev4 != [0, 0]: - dev_clk_info[4] = args.dev4 - - environment.set_dev_clk(dev_clk_info) - environment.set_spi_interface(args.spi_type) - environment.set_using_8b10b(args.use_8b10b) - environment.set_cdr_type(args.cdr_type) - - environment.gen_slv_dev_for_clk(4) - - environment.bringup() - - if args.use_8b10b: - add_tc_2_runlist(rwregs.tc1()) - - #add_tc_2_runlist(errorPkt.tc1()) - #add_tc_2_runlist(errorPkt.tc2()) - #add_tc_2_runlist(errorPkt.tc3()) - #add_tc_2_runlist(errorPkt.tc4()) - #add_tc_2_runlist(errorPkt.tc5()) - #add_tc_2_runlist(errorPkt.tc6()) - #add_tc_2_runlist(errorPkt.tc7()) - #add_tc_2_runlist(errorPkt.tc8()) - #add_tc_2_runlist(errorPkt.tc9()) - #add_tc_2_runlist(errorPkt.tc10()) - #add_tc_2_runlist(errorPkt.tc11()) - #add_tc_2_runlist(errorPkt.tc12()) - #add_tc_2_runlist(errorPkt.tc13()) - #add_tc_2_runlist(errorPkt.tc14()) - #add_tc_2_runlist(errorPkt.tc15()) - #add_tc_2_runlist(errorPkt.tc16()) - #add_tc_2_runlist(errorPkt.tc17()) - #add_tc_2_runlist(errorPkt.tc18()) - #add_tc_2_runlist(errorPkt.tc19()) - #add_tc_2_runlist(errorPkt.tc20()) - #add_tc_2_runlist(errorPkt.tc21()) - #add_tc_2_runlist(errorPkt.tc22()) - #add_tc_2_runlist(errorPkt.tc23()) - #add_tc_2_runlist(errorPkt.tc24()) - #add_tc_2_runlist(errorPkt.tc25()) - #add_tc_2_runlist(errorPkt.tc26()) - #add_tc_2_runlist(errorPkt.tc27()) - #add_tc_2_runlist(errorPkt.tc28()) - #add_tc_2_runlist(errorPkt.tc29()) - #add_tc_2_runlist(errorPkt.tc30()) - #add_tc_2_runlist(errorPkt.tc31()) - #add_tc_2_runlist(errorPkt.tc32()) - #add_tc_2_runlist(errorPkt.tc33()) - #add_tc_2_runlist(errorPkt.tc34()) - #add_tc_2_runlist(errorPkt.tc35()) - #add_tc_2_runlist(errorPkt.tc36()) - #add_tc_2_runlist(errorPkt.tc37()) - #add_tc_2_runlist(errorPkt.tc38()) - - - #add_tc_2_runlist(base.tc1()) - #add_tc_2_runlist(base.tc2()) - #add_tc_2_runlist(base.tc3()) - #add_tc_2_runlist(base.tc4()) - #add_tc_2_runlist(base.tc5()) - #add_tc_2_runlist(base.tc6()) - #add_tc_2_runlist(base.tc7()) - #add_tc_2_runlist(base.tc8()) - #add_tc_2_runlist(base.tc9()) - #add_tc_2_runlist(base.tc10()) - #add_tc_2_runlist(base.tc11()) - #add_tc_2_runlist(base.tc12()) - #add_tc_2_runlist(base.tc13()) - #add_tc_2_runlist(base.tc14()) - #add_tc_2_runlist(base.tc15()) - #add_tc_2_runlist(base.tc16()) - #add_tc_2_runlist(base.tc17()) - #add_tc_2_runlist(base.tc18()) - #add_tc_2_runlist(base.tc19()) - #add_tc_2_runlist(base.tc20()) - #add_tc_2_runlist(base.tc21()) - #add_tc_2_runlist(base.tc22()) - #add_tc_2_runlist(base.tc23()) - #add_tc_2_runlist(base.tc24()) - #add_tc_2_runlist(base.tc25()) - #add_tc_2_runlist(base.tc26()) - #add_tc_2_runlist(base.tc27()) - #add_tc_2_runlist(base.tc28()) - #add_tc_2_runlist(base.tc29()) - add_tc_2_runlist(base.tc29()) - add_tc_2_runlist(base.tc30()) - - - #add_tc_2_runlist(broadcast.tc1()) - #add_tc_2_runlist(broadcast.tc2()) - #add_tc_2_runlist(broadcast.tc3()) - - - #add_tc_2_runlist(sync.tc1()) - #add_tc_2_runlist(sync.tc2()) - #add_tc_2_runlist(sync.tc3()) - #add_tc_2_runlist(sync.tc4()) - #add_tc_2_runlist(sync.tc5()) - #add_tc_2_runlist(sync.tc6()) - #add_tc_2_runlist(sync.tc7()) - - #add_tc_2_runlist(ebmmu.tc1()) - #add_tc_2_runlist(ebmmu.tc2()) - #add_tc_2_runlist(ebmmu.tc3()) - #add_tc_2_runlist(ebmmu.tc4()) - #add_tc_2_runlist(ebmmu.tc5()) - #add_tc_2_runlist(ebmmu.tc6()) - #add_tc_2_runlist(ebmmu.tc7()) - #add_tc_2_runlist(ebmmu.tc8()) - #add_tc_2_runlist(ebmmu.tc9()) - #add_tc_2_runlist(ebmmu.tc10()) - #add_tc_2_runlist(ebmmu.tc11()) - #add_tc_2_runlist(ebmmu.tc12()) - #add_tc_2_runlist(ebmmu.tc13()) - #add_tc_2_runlist(ebmmu.tc14()) - #add_tc_2_runlist(ebmmu.tc15()) - #add_tc_2_runlist(ebmmu.tc16()) - #add_tc_2_runlist(ebmmu.tc17()) - #add_tc_2_runlist(ebmmu.tc18()) - #add_tc_2_runlist(ebmmu.tc19()) - - #add_tc_2_runlist(watchdog.tc1()) - #add_tc_2_runlist(watchdog.tc2()) - - #add_tc_2_runlist(mac.tc1()) - #add_tc_2_runlist(mac.tc2()) - #add_tc_2_runlist(mac.tc3()) - #add_tc_2_runlist(mac.tc4()) - #add_tc_2_runlist(mac.tc5()) - #add_tc_2_runlist(mac.tc6()) - #add_tc_2_runlist(mac.tc7()) - - environment.teardown() - - gen_tc_runlist() - +#!/usr/bin/env python +#encoding=utf-8 +from pyutils import * +from testcase import environment, rwregs, ebmmu, errorPkt, watchdog, broadcast, sync, base, mac +import argparse + +if __name__ == '__main__': + + parser = argparse.ArgumentParser() + + # 可选参数 + parser.add_argument("-d1", "--dev1", nargs=2, type=int, default=[0, 0], help="相位(度)、频率偏差ppm") + parser.add_argument("-d2", "--dev2", nargs=2, type=int, default=[0, 0], help="相位(度)、频率偏差ppm") + parser.add_argument("-d3", "--dev3", nargs=2, type=int, default=[0, 0], help="相位(度)、频率偏差ppm") + parser.add_argument("-d4", "--dev4", nargs=2, type=int, default=[0, 0], help="相位(度)、频率偏差ppm") + parser.add_argument("-8b10b", action="store_true", dest="use_8b10b", default=False, help="使用8b10b编码") + parser.add_argument("-spi", dest="spi_type", type=int, default=0, help="选择SPI,0:ISPI;1:OSPI;2:OQSPI;3:AQSPI") + parser.add_argument("-cdr", dest="cdr_type", type=int, default=0, help="选择CDR") + + # 解析参数 + args = parser.parse_args() + # 使用参数 + dev_clk_info = dict() + if args.dev1 != [0, 0]: + dev_clk_info[1] = args.dev1 + + if args.dev2 != [0, 0]: + dev_clk_info[2] = args.dev2 + + if args.dev3 != [0, 0]: + dev_clk_info[3] = args.dev3 + + if args.dev4 != [0, 0]: + dev_clk_info[4] = args.dev4 + + environment.set_dev_clk(dev_clk_info) + environment.set_spi_interface(args.spi_type) + environment.set_using_8b10b(args.use_8b10b) + environment.set_cdr_type(args.cdr_type) + + environment.gen_slv_dev_for_clk(4) + + environment.bringup() + + if args.use_8b10b: + add_tc_2_runlist(rwregs.tc1()) + + #add_tc_2_runlist(errorPkt.tc1()) + #add_tc_2_runlist(errorPkt.tc2()) + #add_tc_2_runlist(errorPkt.tc3()) + #add_tc_2_runlist(errorPkt.tc4()) + #add_tc_2_runlist(errorPkt.tc5()) + #add_tc_2_runlist(errorPkt.tc6()) + #add_tc_2_runlist(errorPkt.tc7()) + #add_tc_2_runlist(errorPkt.tc8()) + #add_tc_2_runlist(errorPkt.tc9()) + #add_tc_2_runlist(errorPkt.tc10()) + #add_tc_2_runlist(errorPkt.tc11()) + #add_tc_2_runlist(errorPkt.tc12()) + #add_tc_2_runlist(errorPkt.tc13()) + #add_tc_2_runlist(errorPkt.tc14()) + #add_tc_2_runlist(errorPkt.tc15()) + #add_tc_2_runlist(errorPkt.tc16()) + #add_tc_2_runlist(errorPkt.tc17()) + #add_tc_2_runlist(errorPkt.tc18()) + #add_tc_2_runlist(errorPkt.tc19()) + #add_tc_2_runlist(errorPkt.tc20()) + #add_tc_2_runlist(errorPkt.tc21()) + #add_tc_2_runlist(errorPkt.tc22()) + #add_tc_2_runlist(errorPkt.tc23()) + #add_tc_2_runlist(errorPkt.tc24()) + #add_tc_2_runlist(errorPkt.tc25()) + #add_tc_2_runlist(errorPkt.tc26()) + #add_tc_2_runlist(errorPkt.tc27()) + #add_tc_2_runlist(errorPkt.tc28()) + #add_tc_2_runlist(errorPkt.tc29()) + #add_tc_2_runlist(errorPkt.tc30()) + #add_tc_2_runlist(errorPkt.tc31()) + #add_tc_2_runlist(errorPkt.tc32()) + #add_tc_2_runlist(errorPkt.tc33()) + #add_tc_2_runlist(errorPkt.tc34()) + #add_tc_2_runlist(errorPkt.tc35()) + #add_tc_2_runlist(errorPkt.tc36()) + #add_tc_2_runlist(errorPkt.tc37()) + #add_tc_2_runlist(errorPkt.tc38()) + + + #add_tc_2_runlist(base.tc1()) + #add_tc_2_runlist(base.tc2()) + #add_tc_2_runlist(base.tc3()) + #add_tc_2_runlist(base.tc4()) + #add_tc_2_runlist(base.tc5()) + #add_tc_2_runlist(base.tc6()) + #add_tc_2_runlist(base.tc7()) + #add_tc_2_runlist(base.tc8()) + #add_tc_2_runlist(base.tc9()) + #add_tc_2_runlist(base.tc10()) + #add_tc_2_runlist(base.tc11()) + #add_tc_2_runlist(base.tc12()) + #add_tc_2_runlist(base.tc13()) + #add_tc_2_runlist(base.tc14()) + #add_tc_2_runlist(base.tc15()) + #add_tc_2_runlist(base.tc16()) + #add_tc_2_runlist(base.tc17()) + #add_tc_2_runlist(base.tc18()) + #add_tc_2_runlist(base.tc19()) + #add_tc_2_runlist(base.tc20()) + #add_tc_2_runlist(base.tc21()) + #add_tc_2_runlist(base.tc22()) + #add_tc_2_runlist(base.tc23()) + #add_tc_2_runlist(base.tc24()) + #add_tc_2_runlist(base.tc25()) + #add_tc_2_runlist(base.tc26()) + #add_tc_2_runlist(base.tc27()) + #add_tc_2_runlist(base.tc28()) + #add_tc_2_runlist(base.tc29()) + add_tc_2_runlist(base.tc29()) + add_tc_2_runlist(base.tc30()) + + + #add_tc_2_runlist(broadcast.tc1()) + #add_tc_2_runlist(broadcast.tc2()) + #add_tc_2_runlist(broadcast.tc3()) + + + #add_tc_2_runlist(sync.tc1()) + #add_tc_2_runlist(sync.tc2()) + #add_tc_2_runlist(sync.tc3()) + #add_tc_2_runlist(sync.tc4()) + #add_tc_2_runlist(sync.tc5()) + #add_tc_2_runlist(sync.tc6()) + #add_tc_2_runlist(sync.tc7()) + + #add_tc_2_runlist(ebmmu.tc1()) + #add_tc_2_runlist(ebmmu.tc2()) + #add_tc_2_runlist(ebmmu.tc3()) + #add_tc_2_runlist(ebmmu.tc4()) + #add_tc_2_runlist(ebmmu.tc5()) + #add_tc_2_runlist(ebmmu.tc6()) + #add_tc_2_runlist(ebmmu.tc7()) + #add_tc_2_runlist(ebmmu.tc8()) + #add_tc_2_runlist(ebmmu.tc9()) + #add_tc_2_runlist(ebmmu.tc10()) + #add_tc_2_runlist(ebmmu.tc11()) + #add_tc_2_runlist(ebmmu.tc12()) + #add_tc_2_runlist(ebmmu.tc13()) + #add_tc_2_runlist(ebmmu.tc14()) + #add_tc_2_runlist(ebmmu.tc15()) + #add_tc_2_runlist(ebmmu.tc16()) + #add_tc_2_runlist(ebmmu.tc17()) + #add_tc_2_runlist(ebmmu.tc18()) + #add_tc_2_runlist(ebmmu.tc19()) + + #add_tc_2_runlist(watchdog.tc1()) + #add_tc_2_runlist(watchdog.tc2()) + + #add_tc_2_runlist(mac.tc1()) + #add_tc_2_runlist(mac.tc2()) + #add_tc_2_runlist(mac.tc3()) + #add_tc_2_runlist(mac.tc4()) + #add_tc_2_runlist(mac.tc5()) + #add_tc_2_runlist(mac.tc6()) + #add_tc_2_runlist(mac.tc7()) + + environment.teardown() + + gen_tc_runlist() + diff --git a/tb/shinTest/gen_pkt_many_dev.py b/tb/shinTest/gen_pkt_many_dev.py index 4992429..b6486bb 100755 --- a/tb/shinTest/gen_pkt_many_dev.py +++ b/tb/shinTest/gen_pkt_many_dev.py @@ -1,140 +1,140 @@ -#!/usr/bin/env python -#encoding=utf-8 -from pyutils import * -from testcase import environment, rwregs, ebmmu, errorPkt, watchdog, broadcast, sync, base, mac, manydev - -if __name__ == '__main__': - environment.gen_slv_dev_num(200) - environment.bringup() - - - add_tc_2_runlist(manydev.tc1()) - - ''' - add_tc_2_runlist(errorPkt.tc1()) - add_tc_2_runlist(errorPkt.tc2()) - add_tc_2_runlist(errorPkt.tc3()) - add_tc_2_runlist(errorPkt.tc4()) - add_tc_2_runlist(errorPkt.tc5()) - add_tc_2_runlist(errorPkt.tc6()) - add_tc_2_runlist(errorPkt.tc7()) - add_tc_2_runlist(errorPkt.tc8()) - add_tc_2_runlist(errorPkt.tc9()) - add_tc_2_runlist(errorPkt.tc10()) - add_tc_2_runlist(errorPkt.tc11()) - add_tc_2_runlist(errorPkt.tc12()) - add_tc_2_runlist(errorPkt.tc13()) - add_tc_2_runlist(errorPkt.tc14()) - add_tc_2_runlist(errorPkt.tc15()) - add_tc_2_runlist(errorPkt.tc16()) - add_tc_2_runlist(errorPkt.tc17()) - add_tc_2_runlist(errorPkt.tc18()) - add_tc_2_runlist(errorPkt.tc19()) - add_tc_2_runlist(errorPkt.tc20()) - add_tc_2_runlist(errorPkt.tc21()) - add_tc_2_runlist(errorPkt.tc22()) - add_tc_2_runlist(errorPkt.tc23()) - add_tc_2_runlist(errorPkt.tc24()) - add_tc_2_runlist(errorPkt.tc25()) - add_tc_2_runlist(errorPkt.tc26()) - add_tc_2_runlist(errorPkt.tc27()) - add_tc_2_runlist(errorPkt.tc28()) - add_tc_2_runlist(errorPkt.tc29()) - add_tc_2_runlist(errorPkt.tc30()) - add_tc_2_runlist(errorPkt.tc31()) - add_tc_2_runlist(errorPkt.tc32()) - add_tc_2_runlist(errorPkt.tc33()) - add_tc_2_runlist(errorPkt.tc34()) - add_tc_2_runlist(errorPkt.tc35()) - add_tc_2_runlist(errorPkt.tc36()) - add_tc_2_runlist(errorPkt.tc37()) - add_tc_2_runlist(errorPkt.tc38()) - #''' - - ''' - add_tc_2_runlist(base.tc1()) - add_tc_2_runlist(base.tc2()) - add_tc_2_runlist(base.tc3()) - add_tc_2_runlist(base.tc4()) - add_tc_2_runlist(base.tc5()) - add_tc_2_runlist(base.tc6()) - add_tc_2_runlist(base.tc7()) - add_tc_2_runlist(base.tc8()) - add_tc_2_runlist(base.tc9()) - add_tc_2_runlist(base.tc10()) - add_tc_2_runlist(base.tc11()) - add_tc_2_runlist(base.tc12()) - add_tc_2_runlist(base.tc13()) - add_tc_2_runlist(base.tc14()) - add_tc_2_runlist(base.tc15()) - add_tc_2_runlist(base.tc16()) - add_tc_2_runlist(base.tc17()) - add_tc_2_runlist(base.tc18()) - add_tc_2_runlist(base.tc19()) - add_tc_2_runlist(base.tc20()) - add_tc_2_runlist(base.tc21()) - add_tc_2_runlist(base.tc22()) - add_tc_2_runlist(base.tc23()) - add_tc_2_runlist(base.tc24()) - add_tc_2_runlist(base.tc25()) - add_tc_2_runlist(base.tc26()) - add_tc_2_runlist(base.tc27()) - add_tc_2_runlist(base.tc28()) - - add_tc_2_runlist(base.tc29()) - add_tc_2_runlist(base.tc30()) - #''' - - - ''' - add_tc_2_runlist(broadcast.tc1()) - add_tc_2_runlist(broadcast.tc2()) - add_tc_2_runlist(broadcast.tc3()) - #''' - - - #add_tc_2_runlist(sync.tc1()) - #add_tc_2_runlist(sync.tc2()) - #add_tc_2_runlist(sync.tc3()) - #add_tc_2_runlist(sync.tc4()) - #add_tc_2_runlist(sync.tc5()) - #add_tc_2_runlist(sync.tc6()) - #add_tc_2_runlist(sync.tc7()) - - ''' - add_tc_2_runlist(ebmmu.tc1()) - add_tc_2_runlist(ebmmu.tc2()) - add_tc_2_runlist(ebmmu.tc3()) - add_tc_2_runlist(ebmmu.tc4()) - add_tc_2_runlist(ebmmu.tc5()) - add_tc_2_runlist(ebmmu.tc6()) - add_tc_2_runlist(ebmmu.tc7()) - add_tc_2_runlist(ebmmu.tc8()) - add_tc_2_runlist(ebmmu.tc9()) - add_tc_2_runlist(ebmmu.tc10()) - add_tc_2_runlist(ebmmu.tc11()) - add_tc_2_runlist(ebmmu.tc12()) - add_tc_2_runlist(ebmmu.tc13()) - add_tc_2_runlist(ebmmu.tc14()) - add_tc_2_runlist(ebmmu.tc15()) - add_tc_2_runlist(ebmmu.tc16()) - add_tc_2_runlist(ebmmu.tc17()) - add_tc_2_runlist(ebmmu.tc18()) - add_tc_2_runlist(ebmmu.tc19()) - #''' - - #add_tc_2_runlist(watchdog.tc1()) - #add_tc_2_runlist(watchdog.tc2()) - - #add_tc_2_runlist(mac.tc1()) - #add_tc_2_runlist(mac.tc2()) - #add_tc_2_runlist(mac.tc3()) - #add_tc_2_runlist(mac.tc4()) - #add_tc_2_runlist(mac.tc5()) - #add_tc_2_runlist(mac.tc6()) - #add_tc_2_runlist(mac.tc7()) - - environment.teardown() - - gen_tc_runlist() - +#!/usr/bin/env python +#encoding=utf-8 +from pyutils import * +from testcase import environment, rwregs, ebmmu, errorPkt, watchdog, broadcast, sync, base, mac, manydev + +if __name__ == '__main__': + environment.gen_slv_dev_num(200) + environment.bringup() + + + add_tc_2_runlist(manydev.tc1()) + + ''' + add_tc_2_runlist(errorPkt.tc1()) + add_tc_2_runlist(errorPkt.tc2()) + add_tc_2_runlist(errorPkt.tc3()) + add_tc_2_runlist(errorPkt.tc4()) + add_tc_2_runlist(errorPkt.tc5()) + add_tc_2_runlist(errorPkt.tc6()) + add_tc_2_runlist(errorPkt.tc7()) + add_tc_2_runlist(errorPkt.tc8()) + add_tc_2_runlist(errorPkt.tc9()) + add_tc_2_runlist(errorPkt.tc10()) + add_tc_2_runlist(errorPkt.tc11()) + add_tc_2_runlist(errorPkt.tc12()) + add_tc_2_runlist(errorPkt.tc13()) + add_tc_2_runlist(errorPkt.tc14()) + add_tc_2_runlist(errorPkt.tc15()) + add_tc_2_runlist(errorPkt.tc16()) + add_tc_2_runlist(errorPkt.tc17()) + add_tc_2_runlist(errorPkt.tc18()) + add_tc_2_runlist(errorPkt.tc19()) + add_tc_2_runlist(errorPkt.tc20()) + add_tc_2_runlist(errorPkt.tc21()) + add_tc_2_runlist(errorPkt.tc22()) + add_tc_2_runlist(errorPkt.tc23()) + add_tc_2_runlist(errorPkt.tc24()) + add_tc_2_runlist(errorPkt.tc25()) + add_tc_2_runlist(errorPkt.tc26()) + add_tc_2_runlist(errorPkt.tc27()) + add_tc_2_runlist(errorPkt.tc28()) + add_tc_2_runlist(errorPkt.tc29()) + add_tc_2_runlist(errorPkt.tc30()) + add_tc_2_runlist(errorPkt.tc31()) + add_tc_2_runlist(errorPkt.tc32()) + add_tc_2_runlist(errorPkt.tc33()) + add_tc_2_runlist(errorPkt.tc34()) + add_tc_2_runlist(errorPkt.tc35()) + add_tc_2_runlist(errorPkt.tc36()) + add_tc_2_runlist(errorPkt.tc37()) + add_tc_2_runlist(errorPkt.tc38()) + #''' + + ''' + add_tc_2_runlist(base.tc1()) + add_tc_2_runlist(base.tc2()) + add_tc_2_runlist(base.tc3()) + add_tc_2_runlist(base.tc4()) + add_tc_2_runlist(base.tc5()) + add_tc_2_runlist(base.tc6()) + add_tc_2_runlist(base.tc7()) + add_tc_2_runlist(base.tc8()) + add_tc_2_runlist(base.tc9()) + add_tc_2_runlist(base.tc10()) + add_tc_2_runlist(base.tc11()) + add_tc_2_runlist(base.tc12()) + add_tc_2_runlist(base.tc13()) + add_tc_2_runlist(base.tc14()) + add_tc_2_runlist(base.tc15()) + add_tc_2_runlist(base.tc16()) + add_tc_2_runlist(base.tc17()) + add_tc_2_runlist(base.tc18()) + add_tc_2_runlist(base.tc19()) + add_tc_2_runlist(base.tc20()) + add_tc_2_runlist(base.tc21()) + add_tc_2_runlist(base.tc22()) + add_tc_2_runlist(base.tc23()) + add_tc_2_runlist(base.tc24()) + add_tc_2_runlist(base.tc25()) + add_tc_2_runlist(base.tc26()) + add_tc_2_runlist(base.tc27()) + add_tc_2_runlist(base.tc28()) + + add_tc_2_runlist(base.tc29()) + add_tc_2_runlist(base.tc30()) + #''' + + + ''' + add_tc_2_runlist(broadcast.tc1()) + add_tc_2_runlist(broadcast.tc2()) + add_tc_2_runlist(broadcast.tc3()) + #''' + + + #add_tc_2_runlist(sync.tc1()) + #add_tc_2_runlist(sync.tc2()) + #add_tc_2_runlist(sync.tc3()) + #add_tc_2_runlist(sync.tc4()) + #add_tc_2_runlist(sync.tc5()) + #add_tc_2_runlist(sync.tc6()) + #add_tc_2_runlist(sync.tc7()) + + ''' + add_tc_2_runlist(ebmmu.tc1()) + add_tc_2_runlist(ebmmu.tc2()) + add_tc_2_runlist(ebmmu.tc3()) + add_tc_2_runlist(ebmmu.tc4()) + add_tc_2_runlist(ebmmu.tc5()) + add_tc_2_runlist(ebmmu.tc6()) + add_tc_2_runlist(ebmmu.tc7()) + add_tc_2_runlist(ebmmu.tc8()) + add_tc_2_runlist(ebmmu.tc9()) + add_tc_2_runlist(ebmmu.tc10()) + add_tc_2_runlist(ebmmu.tc11()) + add_tc_2_runlist(ebmmu.tc12()) + add_tc_2_runlist(ebmmu.tc13()) + add_tc_2_runlist(ebmmu.tc14()) + add_tc_2_runlist(ebmmu.tc15()) + add_tc_2_runlist(ebmmu.tc16()) + add_tc_2_runlist(ebmmu.tc17()) + add_tc_2_runlist(ebmmu.tc18()) + add_tc_2_runlist(ebmmu.tc19()) + #''' + + #add_tc_2_runlist(watchdog.tc1()) + #add_tc_2_runlist(watchdog.tc2()) + + #add_tc_2_runlist(mac.tc1()) + #add_tc_2_runlist(mac.tc2()) + #add_tc_2_runlist(mac.tc3()) + #add_tc_2_runlist(mac.tc4()) + #add_tc_2_runlist(mac.tc5()) + #add_tc_2_runlist(mac.tc6()) + #add_tc_2_runlist(mac.tc7()) + + environment.teardown() + + gen_tc_runlist() + diff --git a/tb/shinTest/gen_sim_cdr_clk.py b/tb/shinTest/gen_sim_cdr_clk.py index 16bcea2..4220715 100755 --- a/tb/shinTest/gen_sim_cdr_clk.py +++ b/tb/shinTest/gen_sim_cdr_clk.py @@ -1,52 +1,52 @@ -#!/usr/bin/env python -#encoding=utf-8 -import argparse -from pyutils import * - - -def set_cdr_clk(v_ph, v_t): - ph = int(8 * 1000000 * (int(abs(v_ph))%360) / 360.0) - period = int(1000000 + v_t) - code_for_clk = __gen_clk(ph, period) - - genPkt = GenPkt() - genPkt.clean() - gen_file_def = "simCdrClk" - genPkt.addAfterExc(code_for_clk) - genPkt.gen("./generated/SimCDR/%s.vh"%(gen_file_def, ), 1) - -def __gen_clk(ph, period): - slv_code =( - "" - #"\tinitial begin\n" - #+"\t\tforever begin #%d clock%d <= ~clock%d; end\n"%(period * 8, clk, clk) - #+"\tend\n\n" - - +"\tgenerate\n" - +"\tfor( genvar i = 0; i < 16; i = i + 1 ) begin\n" - +"\t\tinitial begin\n" - + "\t\t\t//相位信息\n" - + "\t\t\t#%d\n"%(ph) - + "\t\t\tmultiCLK[i] = 0;\n" - + "\t\t\tfor( integer j = 0; j < i; j = j + 1 ) begin\n" - + "\t\t\t\t#%d\n"%(period, ) - + "\t\t\t\t;\n" - + "\t\t\tend\n" - + "\t\t\tforever begin #%d multiCLK[i] <= ~multiCLK[i]; end\n"%(period * 8, ) - +"\t\tend\n" - +"\tend\n" - +"\tendgenerate\n") - - return slv_code - -if __name__ == '__main__': - - parser = argparse.ArgumentParser() - - # 可选参数 - parser.add_argument("-c", "--clk", nargs=2, type=int, default=[0, 0], help="相位(度)、频率偏差ppm") - - args = parser.parse_args() - - set_cdr_clk(args.clk[0], args.clk[1]); - +#!/usr/bin/env python +#encoding=utf-8 +import argparse +from pyutils import * + + +def set_cdr_clk(v_ph, v_t): + ph = int(8 * 1000000 * (int(abs(v_ph))%360) / 360.0) + period = int(1000000 + v_t) + code_for_clk = __gen_clk(ph, period) + + genPkt = GenPkt() + genPkt.clean() + gen_file_def = "simCdrClk" + genPkt.addAfterExc(code_for_clk) + genPkt.gen("./generated/SimCDR/%s.vh"%(gen_file_def, ), 1) + +def __gen_clk(ph, period): + slv_code =( + "" + #"\tinitial begin\n" + #+"\t\tforever begin #%d clock%d <= ~clock%d; end\n"%(period * 8, clk, clk) + #+"\tend\n\n" + + +"\tgenerate\n" + +"\tfor( genvar i = 0; i < 16; i = i + 1 ) begin\n" + +"\t\tinitial begin\n" + + "\t\t\t//相位信息\n" + + "\t\t\t#%d\n"%(ph) + + "\t\t\tmultiCLK[i] = 0;\n" + + "\t\t\tfor( integer j = 0; j < i; j = j + 1 ) begin\n" + + "\t\t\t\t#%d\n"%(period, ) + + "\t\t\t\t;\n" + + "\t\t\tend\n" + + "\t\t\tforever begin #%d multiCLK[i] <= ~multiCLK[i]; end\n"%(period * 8, ) + +"\t\tend\n" + +"\tend\n" + +"\tendgenerate\n") + + return slv_code + +if __name__ == '__main__': + + parser = argparse.ArgumentParser() + + # 可选参数 + parser.add_argument("-c", "--clk", nargs=2, type=int, default=[0, 0], help="相位(度)、频率偏差ppm") + + args = parser.parse_args() + + set_cdr_clk(args.clk[0], args.clk[1]); + diff --git a/tb/shinTest/pyutils/GenPkt.py b/tb/shinTest/pyutils/GenPkt.py index b95c703..60259d3 100644 --- a/tb/shinTest/pyutils/GenPkt.py +++ b/tb/shinTest/pyutils/GenPkt.py @@ -1,411 +1,411 @@ -#!/usr/bin/env python -#encoding=utf-8 -import copy -import random - -class GenPkt(object): - def __init__(self): - super(GenPkt, self).__init__() - - self.pkt_buf = list() #bytearray(b'\0' * 2048) - self.pkt_type = 0 - self.pkt_sub_pkt = 0 - self.sub_pkt = list() - self.pkt_data = None - - def clean(self): - self.pkt_buf = list() #bytearray(b'\0' * 2048) - self.pkt_type = 0 - self.pkt_sub_pkt = 0 - self.sub_pkt = list() - self.pkt_data = None - - def setPktType(self, type): - if (type != 0) and (type != 1): - print('Error...set type failed:', type) - else: - self.pkt_type = type - - def setPkt(self, type, data = None): - if (type != 0) and (type != 1): - if type == 2: - self.pkt_type = 2 - self.pkt_data = copy.copy(data) - else: - print('Error...set type failed:', type) - else: - self.pkt_type = type - - def addBeforeExc(self, str): - self.sub_pkt.append([1, str]) - - def addAfterExc(self, str): - self.sub_pkt.append([2, str]) - - def addSubPkt(self, dev_idx, ptype, addr, cmd, len, data): - if (len > 2032): - print('Error, bad subpkt len:%d', len) - return - if not (ptype in [0, 2]): - print('Error, bad subpkt type:', ptype) - return - if not (cmd in [0, 1, 2, 0xa, 0xb, 0xc, 0xd, 0xe, 0xf]): - print('Error, bad cmd:', cmd) - return - - self.pkt_sub_pkt = self.pkt_sub_pkt + 1 - self.sub_pkt.append([0, dev_idx, ptype, addr, cmd, len, data]) - - def gen(self, filename="pkt_verilog_test.v", filetype=0, appendgen=False, gen_name=None): - gen_pkt_type = 0 - pkt_len = 4 - for sp in self.sub_pkt: - if sp[0] != 0: - pass - else: - pkt_len = pkt_len + sp[5] + 8 - - if pkt_len > 2044: - print('Error, bad pkt_len:', pkt_len) - return - - i = 4 - if (self.pkt_type == 1): - pkt_len = 4 - ''' - self.pkt_buf[0] = 0 - self.pkt_buf[1] = (self.pkt_type & 0x3) - self.pkt_buf[2] = 0x3f - self.pkt_buf[3] = 0xff - ''' - self.pkt_buf.append(0) - self.pkt_buf.append(self.pkt_type & 0x3) - self.pkt_buf.append(0x3f) - self.pkt_buf.append(0xff) - gen_pkt_type = 1 - elif (self.pkt_type == 2): - pkt_len = len(self.pkt_data) - - for d in self.pkt_data: - self.pkt_buf.append(d) - i = pkt_len - gen_pkt_type = 2 - #print("-----------------------------", filename, self.pkt_type, pkt_len, self.pkt_buf) - else: - #for i in range(pkt_len): - ''' - self.pkt_buf[0] = ((pkt_len - 4) >> 4) & 0xff - self.pkt_buf[1] = (((pkt_len - 4) << 4) & 0xf0) | (self.pkt_type & 0x3) - self.pkt_buf[2] = 0 - self.pkt_buf[3] = 0 - ''' - self.pkt_buf.append(((pkt_len - 4) >> 4) & 0xff) - self.pkt_buf.append((((pkt_len - 4) << 4) & 0xf0) | (self.pkt_type & 0x3)) - self.pkt_buf.append(0) - self.pkt_buf.append(0) - - for sp in self.sub_pkt: - if sp[0] != 0: - pass - #elif sp[0] == 0: - else: - gen_pkt_type = 3 - #设备索引(14bit)+类型(2bit) - temp = ((sp[1] & 0x3fff) << 2) | (sp[2] & 0x3) - - #self.pkt_buf[i] = (temp >> 8) & 0xff - self.pkt_buf.append((temp >> 8) & 0xff) - i = i + 1 - #self.pkt_buf[i] = temp & 0xff - self.pkt_buf.append(temp & 0xff) - i = i + 1 - - #地址 - #self.pkt_buf[i] = (sp[3] >> 8) & 0xff - self.pkt_buf.append((sp[3] >> 8) & 0xff) - i = i + 1 - #self.pkt_buf[i] = sp[3] & 0xff - self.pkt_buf.append(sp[3] & 0xff) - i = i + 1 - - #命令类型(4bit)+长度(12bit) - temp = (sp[4] << 12) | (sp[5] & 0xfff) - - #self.pkt_buf[i] = (temp >> 8) & 0xff - self.pkt_buf.append((temp >> 8) & 0xff) - i = i + 1 - #self.pkt_buf[i] = temp & 0xff - self.pkt_buf.append(temp & 0xff) - i = i + 1 - - #数据 - if sp[6] == None: - #for _k in range(sp[5]): - # #self.pkt_buf[_k + i] = random.randint(0, 255) - # self.pkt_buf.append(random.randint(0, 255)) - temp = list(range(sp[5])) - temp = [(i & 0xff) for i in temp] - self.pkt_buf = self.pkt_buf + temp - else: - for _k in range(sp[5]): - #self.pkt_buf[_k + i] = sp[6][_k] - self.pkt_buf.append(sp[6][_k]) - - i = i + sp[5] - - #工作计数 - #self.pkt_buf[i] = 0 - self.pkt_buf.append(0) - i = i + 1 - #self.pkt_buf[i] = 0 - self.pkt_buf.append(0) - i = i + 1 - - #print("pkt_len:%d, data_len:%d"%(pkt_len, pkt_len - 4)) - open_mode = "wt+" - if appendgen: - open_mode = "at" - f = open(filename, open_mode) - if filetype == 1: - for md in self.sub_pkt: - if md[0] == 1: - f.write("%s\n"%(md[1],)) - define_str = "`define DEF_" - - if appendgen and (gen_name == None): - print("Error, gen_name not define.") - raise "Error, gen_name not define." - - if not appendgen: - pos1 = filename.rfind("/") - if (pos1 < -1): - pos1 = 0 - else: - pos1 = pos1 + 1 - - pos2 = filename.rfind(".") - if (pos1 > pos2): - define_str = define_str + filename[pos1:] - else: - define_str = define_str + filename[pos1:pos2] - else: - define_str = define_str + gen_name - - if gen_pkt_type != 0: - f.write(define_str + "_len \t%d\n"%(pkt_len)) - f.write(define_str + "_sm(array) \\\n\tarray``[`ARRAY_IDX_OFF + %d]=8'h%02X;\\\n\tarray``[`ARRAY_IDX_OFF + %d]=8'h%02X;\n"%( - 0, pkt_len & 0xff, - 1, pkt_len >> 8 - )) - - f.write(define_str + "(array) \\\n") - for _k in range(i): - if _k < (i - 1): - if type(self.pkt_buf[_k]) == int: - f.write("\tarray``[`ARRAY_IDX_OFF + %d]=8'h%02X;\\\n"%(_k, self.pkt_buf[_k])) - else: - f.write("\tarray``[`ARRAY_IDX_OFF + %d]=%s;\\\n"%(_k, self.pkt_buf[_k])) - else: - if type(self.pkt_buf[_k]) == int: - f.write("\tarray``[`ARRAY_IDX_OFF + %d]=8'h%02X;\n"%(_k, self.pkt_buf[_k])) - else: - f.write("\tarray``[`ARRAY_IDX_OFF + %d]=%s;\n"%(_k, self.pkt_buf[_k])) - - for md in self.sub_pkt: - if md[0] == 2: - f.write("%s\n"%(md[1],)) - else: - for _k in range(i): - f.write("txBuf[`ARRAY_IDX_OFF + %d]=8'h%02X;\n"%(_k, self.pkt_buf[_k])) - f.close() - - - -def genWriteTransLenCode(gen_name, sm_idx, wlog=True, dev_idx=0): - return '''\n//写入发送长度\n'''\ - + '''$fdisplay(spidata_file, "--写数据交换长度");\n'''\ - + '''`DEF_%s_sm(txBuf);\n'''%(gen_name, )\ - + '''%s( (`MST_TX%d_LEN_ADDR), (`SPI_WRITE), (2), (`IF_IDX(%d)) );\n'''%("`SPI_TRANS" if wlog else "spi_trans", sm_idx, dev_idx)\ - + '''%s( (`MST_RX%d_LEN_ADDR), (`SPI_WRITE), (2), (`IF_IDX(%d)) );\n'''%("`SPI_TRANS" if wlog else "spi_trans", sm_idx, dev_idx) - -def genWriteTransPktCode(gen_name, sm_idx, wlog=True, dev_idx=0): - return f'''\n$fdisplay(spidata_file, "<<准备发包,使用SM{sm_idx}:");\n'''\ - + '''`DEF_%s(txBuf);\n'''%(gen_name, )\ - + '''%s( (`MST_TX%d_ADDR), (`SPI_WRITE), (`DEF_%s_len), (`IF_IDX(%d)) );\n'''%("`SPI_TRANS" if wlog else "spi_trans", sm_idx, gen_name, dev_idx) - -def genTrgTransPktCode(gen_name, sm_idx, wlog=True, dev_idx=0): - return '''\n//请求发送\n'''\ - + '''$fdisplay(spidata_file, "--请求发送");\n'''\ - + '''txBuf[`ARRAY_IDX_OFF] = `MST_TX_TRIGGER(%d);\n'''%(sm_idx, )\ - + '''%s( (16'h20), (`SPI_WRITE), (1), (`IF_IDX(%d)) );\n'''%("`SPI_TRANS" if wlog else "spi_trans", dev_idx) - -def genReadAckPktCode(gen_name, sm_idx, wlog=True, dev_idx=0): - return '''\n//等待回包\n'''\ - + '''wait_comm_finished(`IF_IDX(%d));\n'''%(dev_idx, )\ - + f'''$fdisplay(spidata_file, ">>读取回包,使用SM{sm_idx}:");\n'''\ - + '''%s( (`MST_RX%d_ADDR), (`SPI_READ), (`DEF_%s_len), (`IF_IDX(%d)) );\n'''%("`SPI_TRANS" if wlog else "spi_trans", sm_idx, gen_name, dev_idx) - -def genEnableInsertTimeCode(pos, enableTime=True, enableDelay=True, wlog=True, dev_idx=0): - data = pos & 0x3fff - if enableTime: - data = data | 0x8000 - if enableDelay: - data = data | 0x4000 - return '''//写入替换时间戳替换地址\n'''\ - + '''$fdisplay(spidata_file, "--增加时间戳插入");\n'''\ - + '''txBuf[`ARRAY_IDX_OFF + 0] = 8'h%x;\n'''%(data & 0xff, )\ - + '''txBuf[`ARRAY_IDX_OFF + 1] = 8'h%x;\n'''%((data >> 8) & 0xff, )\ - + '''%s( (16'h24), (`SPI_WRITE), (2), (`IF_IDX(%d)) );\n'''%("`SPI_TRANS" if wlog else "spi_trans", dev_idx) - -def genDisableInsertTimeCode(wlog=True, dev_idx=0): - return '''\n//清除替换时间戳替换地址\n'''\ - + '''$fdisplay(spidata_file, "--清除时间戳插入");\n'''\ - + '''txBuf[`ARRAY_IDX_OFF + 0] = 8'h00;\n'''\ - + '''txBuf[`ARRAY_IDX_OFF + 1] = 8'h00;\n'''\ - + '''%s( (16'h24), (`SPI_WRITE), (2), (`IF_IDX(%d)) ); //清除替换时间戳替换地址寄存器\n'''%("`SPI_TRANS" if wlog else "spi_trans", dev_idx) - -def genCheckInsertTimeCode(wlog=True, dev_idx=0): - return '''\n//检查替换时间戳替换地址\n'''\ - + '''$fdisplay(spidata_file, "--检查时间戳插入");\n'''\ - + '''%s( (16'h24), (`SPI_READ), (2), (`IF_IDX(%d)) ); //检查替换时间戳替换地址寄存器\n'''%("`SPI_TRANS" if wlog else "spi_trans", dev_idx) - - -def genIFRwDataCode(dev, addr, isWrite = False, data_len=0, data = None, wlog=True, iface=4): - spi_api="IF_IDX" - spi_offset = "`ARRAY_IDX_OFF" - if iface == 0: - spi_api = "IF_IQSPI" - spi_offset = "3" - elif iface == 1: - spi_api = "IF_OSPI" - spi_offset = "3" - elif iface == 2: - spi_api = "IF_OQSPI" - spi_offset = "3" - elif iface == 3: - spi_api = "IF_AQSPI" - spi_offset = "4" - else: - spi_api = "IF_IDX" - spi_offset = "`ARRAY_IDX_OFF" - - if isWrite == True: - if (data == None) or (len(data) == 0): - data=list() - - code = '' - idx = 0 - for item in data: - code = code + '''txBuf[%s+%d]=8'h%02x;\n'''%(spi_offset, idx, item & 0xff) - idx = idx + 1 - - code = code + '''%s( (16'h%04x), (`SPI_WRITE), (%d), (`%s(%d)) );\n'''%("`SPI_TRANS" if wlog else "spi_trans", addr, data_len, spi_api, dev) - return code - else: - code = '' - code = code + '''%s( (16'h%04x), (`SPI_READ), (%d), (`%s(%d)) );\n'''%("`SPI_TRANS" if wlog else "spi_trans", addr, data_len, spi_api, dev) - return code - -def genSlvSMWriteData(dev, sm, data_len, data = None, wlog=True): - smaddr = list() - for i in range(8): - smaddr.append(0x300 + i * 4 + 2) - if not ((sm == 1) or (sm == 3) or (sm == 5) or (sm == 7)): - #写入数据,lvds读;这个空间是lvds写,mcu读 - return '' - if data_len > 2032: - return '' - - if (data != None) and (len(data) != 0) and (len(data) < data_len): - return '' - - if (data == None) or (len(data) == 0): - data = list() - for i in range(data_len): - data.append((i + dev) & 0xff) - - code = '''txBuf[`ARRAY_IDX_OFF + 0] = 8'h%02x;\n'''%(data_len & 0xff, )\ - + '''txBuf[`ARRAY_IDX_OFF + 1] = 8'h%02x;\n'''%(int(data_len/256) & 0xff,)\ - + '''%s((16'h%04x), (`SPI_WRITE), (2), (`IF_IDX(%d)) );\n'''%("`SPI_TRANS" if wlog else "spi_trans", smaddr[sm], dev) - - for i in range(data_len): - code = code + '''txBuf[`ARRAY_IDX_OFF + %d] = 8'h%02x;\n'''%(i, data[i]) - - code = code + '''%s( (16'h%04x), (`SPI_WRITE), (%d), (`IF_IDX(%d)) );\n'''%("`SPI_TRANS" if wlog else "spi_trans", 0x800 + sm * 2048, data_len, dev) - return code - -def genSlvSMReadData(dev, sm, data_len, wlog=True): - if not ((sm == 0) or (sm == 2) or (sm == 4) or (sm == 6)): - #写入数据,lvds读;这个空间是lvds写,mcu读 - return '' - if data_len > 2032: - return '' - - code = f'''$fdisplay(spidata_file, "--读取设备{dev} SM{sm} 中的数据,读取长度{data_len}B");\n''' - code = code + '''%s( (16'h%04x), (`SPI_READ), (%d), (`IF_IDX(%d)) );\n'''%("`SPI_TRANS" if wlog else "spi_trans", 0x800 + sm * 2048, data_len, dev) - - return code - -def setting_ebmmu_regs(regmap, index, vaddr, raddr, size, p, enable): - vaddr = int(vaddr) - raddr = int(raddr) - size = int(size) - p = int(p) - enable = int(enable) - regmap[index * 0xa + 0] = (vaddr >> 0) & 0xff - regmap[index * 0xa + 1] = (vaddr >> 8) & 0xff - regmap[index * 0xa + 2] = (vaddr >> 16) & 0xff - regmap[index * 0xa + 3] = (vaddr >> 24) & 0xff - - regmap[index * 0xa + 4] = (raddr >> 0) & 0xff - regmap[index * 0xa + 5] = (raddr >> 8) & 0xff - - regmap[index * 0xa + 6] = (size >> 0) & 0xff - regmap[index * 0xa + 7] = (size >> 8) & 0xff - - regmap[index * 0xa + 8] = p & 0x3 - regmap[index * 0xa + 9] = enable & 0x1 - - - -__run_list=list() -__pre_include_path='./generated/shin' -__pre_gen_log_path='./generated/log' -def add_tc_2_runlist(filename): - code_f = filename + '.vh' - if code_f in __run_list: - print("Error, Testcase duplicate name") - raise "DUPLICATE NAME" - __run_list.append(code_f) - -def gen_tc_runlist(): - runlist_file = __pre_include_path + '/tc_runlist.vh' - f = open(runlist_file, "wt+") - for tc in __run_list: - f.write(f'\t`include "{tc}"\n') - f.close() - - -def genTcStartFrameCode(tcname, des, vardef="\n"): - upper_name = tcname.upper() - code_str = f'''\tbegin:{upper_name}_TESTCASE\n'''\ - +vardef \ - +f'''\t\t`BEGIN_TESTCASE("{__pre_gen_log_path}/{tcname}_result.log");\n'''\ - +'''\t\t_t_start = $realtime;\n'''\ - +f'''\t\t$fdisplay(spidata_file,"\\n\\n测试用例:{upper_name}");\n''' - - if len(des) > 0: - code_str = code_str + '''\t\t$fdisplay(spidata_file,"''' + '-' * 80 + '''");\n''' - code_str = code_str + f'''\t\t$fdisplay(spidata_file,"{des}");\n''' - code_str = code_str + '''\t\t$fdisplay(spidata_file,"''' + '-' * 80 + '''");\n''' - return code_str - -def genTcEndFrameCode(tcname): - upper_name = tcname.upper() - return f'''\t\t_t_end = $realtime;\n'''\ - +'''\t\t$fdisplay(spidata_file, "该测试用例运行时间:%t\\n", _t_end - _t_start);\n'''\ - +f'''\t\t`END_TESTCASE("{__pre_gen_log_path}/{tcname}_result.log");\n'''\ - +'''\tend\n''' - -def genMessageCode(msg): - return f'''\t\t$fdisplay(spidata_file, "{msg}");\n''' +#!/usr/bin/env python +#encoding=utf-8 +import copy +import random + +class GenPkt(object): + def __init__(self): + super(GenPkt, self).__init__() + + self.pkt_buf = list() #bytearray(b'\0' * 2048) + self.pkt_type = 0 + self.pkt_sub_pkt = 0 + self.sub_pkt = list() + self.pkt_data = None + + def clean(self): + self.pkt_buf = list() #bytearray(b'\0' * 2048) + self.pkt_type = 0 + self.pkt_sub_pkt = 0 + self.sub_pkt = list() + self.pkt_data = None + + def setPktType(self, type): + if (type != 0) and (type != 1): + print('Error...set type failed:', type) + else: + self.pkt_type = type + + def setPkt(self, type, data = None): + if (type != 0) and (type != 1): + if type == 2: + self.pkt_type = 2 + self.pkt_data = copy.copy(data) + else: + print('Error...set type failed:', type) + else: + self.pkt_type = type + + def addBeforeExc(self, str): + self.sub_pkt.append([1, str]) + + def addAfterExc(self, str): + self.sub_pkt.append([2, str]) + + def addSubPkt(self, dev_idx, ptype, addr, cmd, len, data): + if (len > 2032): + print('Error, bad subpkt len:%d', len) + return + if not (ptype in [0, 2]): + print('Error, bad subpkt type:', ptype) + return + if not (cmd in [0, 1, 2, 0xa, 0xb, 0xc, 0xd, 0xe, 0xf]): + print('Error, bad cmd:', cmd) + return + + self.pkt_sub_pkt = self.pkt_sub_pkt + 1 + self.sub_pkt.append([0, dev_idx, ptype, addr, cmd, len, data]) + + def gen(self, filename="pkt_verilog_test.v", filetype=0, appendgen=False, gen_name=None): + gen_pkt_type = 0 + pkt_len = 4 + for sp in self.sub_pkt: + if sp[0] != 0: + pass + else: + pkt_len = pkt_len + sp[5] + 8 + + if pkt_len > 2044: + print('Error, bad pkt_len:', pkt_len) + return + + i = 4 + if (self.pkt_type == 1): + pkt_len = 4 + ''' + self.pkt_buf[0] = 0 + self.pkt_buf[1] = (self.pkt_type & 0x3) + self.pkt_buf[2] = 0x3f + self.pkt_buf[3] = 0xff + ''' + self.pkt_buf.append(0) + self.pkt_buf.append(self.pkt_type & 0x3) + self.pkt_buf.append(0x3f) + self.pkt_buf.append(0xff) + gen_pkt_type = 1 + elif (self.pkt_type == 2): + pkt_len = len(self.pkt_data) + + for d in self.pkt_data: + self.pkt_buf.append(d) + i = pkt_len + gen_pkt_type = 2 + #print("-----------------------------", filename, self.pkt_type, pkt_len, self.pkt_buf) + else: + #for i in range(pkt_len): + ''' + self.pkt_buf[0] = ((pkt_len - 4) >> 4) & 0xff + self.pkt_buf[1] = (((pkt_len - 4) << 4) & 0xf0) | (self.pkt_type & 0x3) + self.pkt_buf[2] = 0 + self.pkt_buf[3] = 0 + ''' + self.pkt_buf.append(((pkt_len - 4) >> 4) & 0xff) + self.pkt_buf.append((((pkt_len - 4) << 4) & 0xf0) | (self.pkt_type & 0x3)) + self.pkt_buf.append(0) + self.pkt_buf.append(0) + + for sp in self.sub_pkt: + if sp[0] != 0: + pass + #elif sp[0] == 0: + else: + gen_pkt_type = 3 + #设备索引(14bit)+类型(2bit) + temp = ((sp[1] & 0x3fff) << 2) | (sp[2] & 0x3) + + #self.pkt_buf[i] = (temp >> 8) & 0xff + self.pkt_buf.append((temp >> 8) & 0xff) + i = i + 1 + #self.pkt_buf[i] = temp & 0xff + self.pkt_buf.append(temp & 0xff) + i = i + 1 + + #地址 + #self.pkt_buf[i] = (sp[3] >> 8) & 0xff + self.pkt_buf.append((sp[3] >> 8) & 0xff) + i = i + 1 + #self.pkt_buf[i] = sp[3] & 0xff + self.pkt_buf.append(sp[3] & 0xff) + i = i + 1 + + #命令类型(4bit)+长度(12bit) + temp = (sp[4] << 12) | (sp[5] & 0xfff) + + #self.pkt_buf[i] = (temp >> 8) & 0xff + self.pkt_buf.append((temp >> 8) & 0xff) + i = i + 1 + #self.pkt_buf[i] = temp & 0xff + self.pkt_buf.append(temp & 0xff) + i = i + 1 + + #数据 + if sp[6] == None: + #for _k in range(sp[5]): + # #self.pkt_buf[_k + i] = random.randint(0, 255) + # self.pkt_buf.append(random.randint(0, 255)) + temp = list(range(sp[5])) + temp = [(i & 0xff) for i in temp] + self.pkt_buf = self.pkt_buf + temp + else: + for _k in range(sp[5]): + #self.pkt_buf[_k + i] = sp[6][_k] + self.pkt_buf.append(sp[6][_k]) + + i = i + sp[5] + + #工作计数 + #self.pkt_buf[i] = 0 + self.pkt_buf.append(0) + i = i + 1 + #self.pkt_buf[i] = 0 + self.pkt_buf.append(0) + i = i + 1 + + #print("pkt_len:%d, data_len:%d"%(pkt_len, pkt_len - 4)) + open_mode = "wt+" + if appendgen: + open_mode = "at" + f = open(filename, open_mode) + if filetype == 1: + for md in self.sub_pkt: + if md[0] == 1: + f.write("%s\n"%(md[1],)) + define_str = "`define DEF_" + + if appendgen and (gen_name == None): + print("Error, gen_name not define.") + raise "Error, gen_name not define." + + if not appendgen: + pos1 = filename.rfind("/") + if (pos1 < -1): + pos1 = 0 + else: + pos1 = pos1 + 1 + + pos2 = filename.rfind(".") + if (pos1 > pos2): + define_str = define_str + filename[pos1:] + else: + define_str = define_str + filename[pos1:pos2] + else: + define_str = define_str + gen_name + + if gen_pkt_type != 0: + f.write(define_str + "_len \t%d\n"%(pkt_len)) + f.write(define_str + "_sm(array) \\\n\tarray``[`ARRAY_IDX_OFF + %d]=8'h%02X;\\\n\tarray``[`ARRAY_IDX_OFF + %d]=8'h%02X;\n"%( + 0, pkt_len & 0xff, + 1, pkt_len >> 8 + )) + + f.write(define_str + "(array) \\\n") + for _k in range(i): + if _k < (i - 1): + if type(self.pkt_buf[_k]) == int: + f.write("\tarray``[`ARRAY_IDX_OFF + %d]=8'h%02X;\\\n"%(_k, self.pkt_buf[_k])) + else: + f.write("\tarray``[`ARRAY_IDX_OFF + %d]=%s;\\\n"%(_k, self.pkt_buf[_k])) + else: + if type(self.pkt_buf[_k]) == int: + f.write("\tarray``[`ARRAY_IDX_OFF + %d]=8'h%02X;\n"%(_k, self.pkt_buf[_k])) + else: + f.write("\tarray``[`ARRAY_IDX_OFF + %d]=%s;\n"%(_k, self.pkt_buf[_k])) + + for md in self.sub_pkt: + if md[0] == 2: + f.write("%s\n"%(md[1],)) + else: + for _k in range(i): + f.write("txBuf[`ARRAY_IDX_OFF + %d]=8'h%02X;\n"%(_k, self.pkt_buf[_k])) + f.close() + + + +def genWriteTransLenCode(gen_name, sm_idx, wlog=True, dev_idx=0): + return '''\n//写入发送长度\n'''\ + + '''$fdisplay(spidata_file, "--写数据交换长度");\n'''\ + + '''`DEF_%s_sm(txBuf);\n'''%(gen_name, )\ + + '''%s( (`MST_TX%d_LEN_ADDR), (`SPI_WRITE), (2), (`IF_IDX(%d)) );\n'''%("`SPI_TRANS" if wlog else "spi_trans", sm_idx, dev_idx)\ + + '''%s( (`MST_RX%d_LEN_ADDR), (`SPI_WRITE), (2), (`IF_IDX(%d)) );\n'''%("`SPI_TRANS" if wlog else "spi_trans", sm_idx, dev_idx) + +def genWriteTransPktCode(gen_name, sm_idx, wlog=True, dev_idx=0): + return f'''\n$fdisplay(spidata_file, "<<准备发包,使用SM{sm_idx}:");\n'''\ + + '''`DEF_%s(txBuf);\n'''%(gen_name, )\ + + '''%s( (`MST_TX%d_ADDR), (`SPI_WRITE), (`DEF_%s_len), (`IF_IDX(%d)) );\n'''%("`SPI_TRANS" if wlog else "spi_trans", sm_idx, gen_name, dev_idx) + +def genTrgTransPktCode(gen_name, sm_idx, wlog=True, dev_idx=0): + return '''\n//请求发送\n'''\ + + '''$fdisplay(spidata_file, "--请求发送");\n'''\ + + '''txBuf[`ARRAY_IDX_OFF] = `MST_TX_TRIGGER(%d);\n'''%(sm_idx, )\ + + '''%s( (16'h20), (`SPI_WRITE), (1), (`IF_IDX(%d)) );\n'''%("`SPI_TRANS" if wlog else "spi_trans", dev_idx) + +def genReadAckPktCode(gen_name, sm_idx, wlog=True, dev_idx=0): + return '''\n//等待回包\n'''\ + + '''wait_comm_finished(`IF_IDX(%d));\n'''%(dev_idx, )\ + + f'''$fdisplay(spidata_file, ">>读取回包,使用SM{sm_idx}:");\n'''\ + + '''%s( (`MST_RX%d_ADDR), (`SPI_READ), (`DEF_%s_len), (`IF_IDX(%d)) );\n'''%("`SPI_TRANS" if wlog else "spi_trans", sm_idx, gen_name, dev_idx) + +def genEnableInsertTimeCode(pos, enableTime=True, enableDelay=True, wlog=True, dev_idx=0): + data = pos & 0x3fff + if enableTime: + data = data | 0x8000 + if enableDelay: + data = data | 0x4000 + return '''//写入替换时间戳替换地址\n'''\ + + '''$fdisplay(spidata_file, "--增加时间戳插入");\n'''\ + + '''txBuf[`ARRAY_IDX_OFF + 0] = 8'h%x;\n'''%(data & 0xff, )\ + + '''txBuf[`ARRAY_IDX_OFF + 1] = 8'h%x;\n'''%((data >> 8) & 0xff, )\ + + '''%s( (16'h24), (`SPI_WRITE), (2), (`IF_IDX(%d)) );\n'''%("`SPI_TRANS" if wlog else "spi_trans", dev_idx) + +def genDisableInsertTimeCode(wlog=True, dev_idx=0): + return '''\n//清除替换时间戳替换地址\n'''\ + + '''$fdisplay(spidata_file, "--清除时间戳插入");\n'''\ + + '''txBuf[`ARRAY_IDX_OFF + 0] = 8'h00;\n'''\ + + '''txBuf[`ARRAY_IDX_OFF + 1] = 8'h00;\n'''\ + + '''%s( (16'h24), (`SPI_WRITE), (2), (`IF_IDX(%d)) ); //清除替换时间戳替换地址寄存器\n'''%("`SPI_TRANS" if wlog else "spi_trans", dev_idx) + +def genCheckInsertTimeCode(wlog=True, dev_idx=0): + return '''\n//检查替换时间戳替换地址\n'''\ + + '''$fdisplay(spidata_file, "--检查时间戳插入");\n'''\ + + '''%s( (16'h24), (`SPI_READ), (2), (`IF_IDX(%d)) ); //检查替换时间戳替换地址寄存器\n'''%("`SPI_TRANS" if wlog else "spi_trans", dev_idx) + + +def genIFRwDataCode(dev, addr, isWrite = False, data_len=0, data = None, wlog=True, iface=4): + spi_api="IF_IDX" + spi_offset = "`ARRAY_IDX_OFF" + if iface == 0: + spi_api = "IF_IQSPI" + spi_offset = "3" + elif iface == 1: + spi_api = "IF_OSPI" + spi_offset = "3" + elif iface == 2: + spi_api = "IF_OQSPI" + spi_offset = "3" + elif iface == 3: + spi_api = "IF_AQSPI" + spi_offset = "4" + else: + spi_api = "IF_IDX" + spi_offset = "`ARRAY_IDX_OFF" + + if isWrite == True: + if (data == None) or (len(data) == 0): + data=list() + + code = '' + idx = 0 + for item in data: + code = code + '''txBuf[%s+%d]=8'h%02x;\n'''%(spi_offset, idx, item & 0xff) + idx = idx + 1 + + code = code + '''%s( (16'h%04x), (`SPI_WRITE), (%d), (`%s(%d)) );\n'''%("`SPI_TRANS" if wlog else "spi_trans", addr, data_len, spi_api, dev) + return code + else: + code = '' + code = code + '''%s( (16'h%04x), (`SPI_READ), (%d), (`%s(%d)) );\n'''%("`SPI_TRANS" if wlog else "spi_trans", addr, data_len, spi_api, dev) + return code + +def genSlvSMWriteData(dev, sm, data_len, data = None, wlog=True): + smaddr = list() + for i in range(8): + smaddr.append(0x300 + i * 4 + 2) + if not ((sm == 1) or (sm == 3) or (sm == 5) or (sm == 7)): + #写入数据,lvds读;这个空间是lvds写,mcu读 + return '' + if data_len > 2032: + return '' + + if (data != None) and (len(data) != 0) and (len(data) < data_len): + return '' + + if (data == None) or (len(data) == 0): + data = list() + for i in range(data_len): + data.append((i + dev) & 0xff) + + code = '''txBuf[`ARRAY_IDX_OFF + 0] = 8'h%02x;\n'''%(data_len & 0xff, )\ + + '''txBuf[`ARRAY_IDX_OFF + 1] = 8'h%02x;\n'''%(int(data_len/256) & 0xff,)\ + + '''%s((16'h%04x), (`SPI_WRITE), (2), (`IF_IDX(%d)) );\n'''%("`SPI_TRANS" if wlog else "spi_trans", smaddr[sm], dev) + + for i in range(data_len): + code = code + '''txBuf[`ARRAY_IDX_OFF + %d] = 8'h%02x;\n'''%(i, data[i]) + + code = code + '''%s( (16'h%04x), (`SPI_WRITE), (%d), (`IF_IDX(%d)) );\n'''%("`SPI_TRANS" if wlog else "spi_trans", 0x800 + sm * 2048, data_len, dev) + return code + +def genSlvSMReadData(dev, sm, data_len, wlog=True): + if not ((sm == 0) or (sm == 2) or (sm == 4) or (sm == 6)): + #写入数据,lvds读;这个空间是lvds写,mcu读 + return '' + if data_len > 2032: + return '' + + code = f'''$fdisplay(spidata_file, "--读取设备{dev} SM{sm} 中的数据,读取长度{data_len}B");\n''' + code = code + '''%s( (16'h%04x), (`SPI_READ), (%d), (`IF_IDX(%d)) );\n'''%("`SPI_TRANS" if wlog else "spi_trans", 0x800 + sm * 2048, data_len, dev) + + return code + +def setting_ebmmu_regs(regmap, index, vaddr, raddr, size, p, enable): + vaddr = int(vaddr) + raddr = int(raddr) + size = int(size) + p = int(p) + enable = int(enable) + regmap[index * 0xa + 0] = (vaddr >> 0) & 0xff + regmap[index * 0xa + 1] = (vaddr >> 8) & 0xff + regmap[index * 0xa + 2] = (vaddr >> 16) & 0xff + regmap[index * 0xa + 3] = (vaddr >> 24) & 0xff + + regmap[index * 0xa + 4] = (raddr >> 0) & 0xff + regmap[index * 0xa + 5] = (raddr >> 8) & 0xff + + regmap[index * 0xa + 6] = (size >> 0) & 0xff + regmap[index * 0xa + 7] = (size >> 8) & 0xff + + regmap[index * 0xa + 8] = p & 0x3 + regmap[index * 0xa + 9] = enable & 0x1 + + + +__run_list=list() +__pre_include_path='./generated/shin' +__pre_gen_log_path='./generated/log' +def add_tc_2_runlist(filename): + code_f = filename + '.vh' + if code_f in __run_list: + print("Error, Testcase duplicate name") + raise "DUPLICATE NAME" + __run_list.append(code_f) + +def gen_tc_runlist(): + runlist_file = __pre_include_path + '/tc_runlist.vh' + f = open(runlist_file, "wt+") + for tc in __run_list: + f.write(f'\t`include "{tc}"\n') + f.close() + + +def genTcStartFrameCode(tcname, des, vardef="\n"): + upper_name = tcname.upper() + code_str = f'''\tbegin:{upper_name}_TESTCASE\n'''\ + +vardef \ + +f'''\t\t`BEGIN_TESTCASE("{__pre_gen_log_path}/{tcname}_result.log");\n'''\ + +'''\t\t_t_start = $realtime;\n'''\ + +f'''\t\t$fdisplay(spidata_file,"\\n\\n测试用例:{upper_name}");\n''' + + if len(des) > 0: + code_str = code_str + '''\t\t$fdisplay(spidata_file,"''' + '-' * 80 + '''");\n''' + code_str = code_str + f'''\t\t$fdisplay(spidata_file,"{des}");\n''' + code_str = code_str + '''\t\t$fdisplay(spidata_file,"''' + '-' * 80 + '''");\n''' + return code_str + +def genTcEndFrameCode(tcname): + upper_name = tcname.upper() + return f'''\t\t_t_end = $realtime;\n'''\ + +'''\t\t$fdisplay(spidata_file, "该测试用例运行时间:%t\\n", _t_end - _t_start);\n'''\ + +f'''\t\t`END_TESTCASE("{__pre_gen_log_path}/{tcname}_result.log");\n'''\ + +'''\tend\n''' + +def genMessageCode(msg): + return f'''\t\t$fdisplay(spidata_file, "{msg}");\n''' diff --git a/tb/shinTest/shinTestClk_vcs.f b/tb/shinTest/shinTestClk_vcs.f index 59d5dfe..e515cd8 100644 --- a/tb/shinTest/shinTestClk_vcs.f +++ b/tb/shinTest/shinTestClk_vcs.f @@ -1,2 +1,2 @@ -+incdir+./generated/shin -./shinTest/ShinTopSpiTb_clk.v ++incdir+./generated/shin +./shinTest/ShinTopSpiTb_clk.v diff --git a/tb/shinTest/shinTest_vcs.f b/tb/shinTest/shinTest_vcs.f index fb9085d..e81fc1f 100644 --- a/tb/shinTest/shinTest_vcs.f +++ b/tb/shinTest/shinTest_vcs.f @@ -1,2 +1,2 @@ -+incdir+./generated/shin -./shinTest/ShinTopSpiTb.v ++incdir+./generated/shin +./shinTest/ShinTopSpiTb.v diff --git a/tb/shinTest/testcase/__init__.py b/tb/shinTest/testcase/__init__.py index 5d86723..68777d6 100644 --- a/tb/shinTest/testcase/__init__.py +++ b/tb/shinTest/testcase/__init__.py @@ -1,10 +1,10 @@ -# testcase/__init__.py -from .rwregs import * -from .ebmmu import * -from .errorPkt import * -from .watchdog import * -from .broadcast import * -from .sync import * -from .environment import * -from .mac import * -from .manydev import * +# testcase/__init__.py +from .rwregs import * +from .ebmmu import * +from .errorPkt import * +from .watchdog import * +from .broadcast import * +from .sync import * +from .environment import * +from .mac import * +from .manydev import * diff --git a/tb/shinTest/testcase/base.py b/tb/shinTest/testcase/base.py index 32e3933..c5d0e1f 100644 --- a/tb/shinTest/testcase/base.py +++ b/tb/shinTest/testcase/base.py @@ -1,3068 +1,3068 @@ -from pyutils import * -from .environment import * - -def tc1(): - genPkt = GenPkt() - - gen_file_def = "base_tc01" - sm_idx = 0 - tc_des = "发送一个包,多个子包,单播读,测试SM1发送数据。检查中断、检查SMx的状态。\\n" - - - #------------------------------------------------------------------------- - #>>>>>>普通数据包 sm1,2个读 - genPkt.clean() - genPkt.setPktType(0) - - #subPkt参数:索引、索引类型、地址、命令、长度、数据 - #genPkt.addSubPkt(0x02, 0, 0x0830, 0x2, 56, None) - genPkt.addSubPkt(0x01, 0, 0x00, 0x0, 64, None) - genPkt.addSubPkt(0x03, 0, 0xc0, 0x0, 64, None) - #genPkt.addSubPkt(10, 2, 0x300, 0x2, 4, None) - #genPkt.addSubPkt(11, 1, 0x300, 0x2, 4, None) - sm_idx = 1 - - genPkt.addBeforeExc(genTcStartFrameCode(gen_file_def, tc_des) - +genMessageCode("--清除中断") - +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - ) - - genPkt.addAfterExc(genWriteTransLenCode(gen_file_def, sm_idx) - +genWriteTransPktCode(gen_file_def, sm_idx) - +genTrgTransPktCode(gen_file_def, sm_idx) - +genReadAckPktCode(gen_file_def, sm_idx) - - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - - +genMessageCode("--清除中断") - +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - - +genTcEndFrameCode(gen_file_def)) - - genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1) - - return gen_file_def - - -def tc2(): - genPkt = GenPkt() - - - gen_file_def = "base_tc02" - sm_idx = 0 - tc_des = "广播读,一次性读取从0x0开始的128个字节的数据。读的时候,报文中的数据和对应的\\n"\ - + "寄存器数据位与后放入报文中。" - - #------------------------------------------------------------------------- - #>>>>>>普通数据包 sm2,广播读 - genPkt.clean() - genPkt.setPktType(0) - - #subPkt参数:索引、索引类型、地址、命令、长度、数据 - genPkt.addSubPkt(0x01, 0, 0x00, 0xd, 128, None) - - sm_idx = 2 - - genPkt.addBeforeExc(genTcStartFrameCode(gen_file_def, tc_des) - +genMessageCode("--清除中断") - +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - ) - - genPkt.addAfterExc(genWriteTransLenCode(gen_file_def, sm_idx) - +genWriteTransPktCode(gen_file_def, sm_idx) - +genTrgTransPktCode(gen_file_def, sm_idx) - +genReadAckPktCode(gen_file_def, sm_idx) - - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - - +genMessageCode("--清除中断") - +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - - +genTcEndFrameCode(gen_file_def)) - genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1) - - return gen_file_def - - - -def tc3(): - genPkt = GenPkt() - - gen_file_def = "base_tc03" - sm_idx = 0 - tc_des = "广播写,发送数据长度到每个设备中;然后再紧跟发送的数据。\\n" \ - + "所有从站接收到相同的数据。" - - #------------------------------------------------------------------------- - #>>>>>>交换数据 SMx, 两个广播写 - genPkt.clean() - genPkt.setPktType(0) - - #subPkt参数:索引、索引类型、地址、命令、长度、数据 - data = bytearray(b"\0" * 10) - data[0] = 16 - data[1] = 0 - genPkt.addSubPkt(1278, 0, 0x0302, 0xe, 2, data) - - data = bytearray(b"\0"*100) - for i in range(100): - data[i] = i + 1 - genPkt.addSubPkt(1188, 0, 0x0800, 0xe, 16, data) - - sm_idx = 3 - - genPkt.addBeforeExc(genTcStartFrameCode(gen_file_def, tc_des) - +genMessageCode("--清除中断") - +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - ) - - genPkt.addAfterExc(genWriteTransLenCode(gen_file_def, sm_idx) - +genWriteTransPktCode(gen_file_def, sm_idx) - +genTrgTransPktCode(gen_file_def, sm_idx) - +genReadAckPktCode(gen_file_def, sm_idx) - - +genMessageCode("--读取广播写入的数据") - +genSlvSMReadData(1, 0, 16) - +genSlvSMReadData(2, 0, 16) - +genSlvSMReadData(3, 0, 16) - +genSlvSMReadData(4, 0, 16) - - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - - +genMessageCode("--清除中断") - +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - - +genTcEndFrameCode(gen_file_def)) - - genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1) - - return gen_file_def - - -def tc4(): - genPkt = GenPkt() - - gen_file_def = "base_tc04" - sm_idx = 0 - tc_des = "发送带有超出系统顺序地址和顺序编号的子包,子包中有写入、有读取;没有处理的包\\n" \ - + "其工作计数应为0。" - #------------------------------------------------------------------------- - #>>>>>>普通数据包,一个读、一个写,增加5个随机包(需要在文件里确认) - genPkt.clean() - genPkt.setPktType(0) - - #subPkt参数:索引、索引类型、地址、命令、长度、数据 - genPkt.addSubPkt(0x01, 0, 0x0840, 0x1, 56, None) - genPkt.addSubPkt(0x03, 0, 0x1040, 0x0, 56, None) - for i in range(5): - genPkt.addSubPkt(3288+i, 0, - 0xDF00+i, 0x0, - 56, None) - - sm_idx = 0 - - genPkt.addBeforeExc(genTcStartFrameCode(gen_file_def, tc_des) - +genMessageCode("--清除中断") - +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - ) - - genPkt.addAfterExc(genWriteTransLenCode(gen_file_def, sm_idx) - +genWriteTransPktCode(gen_file_def, sm_idx) - +genTrgTransPktCode(gen_file_def, sm_idx) - +genReadAckPktCode(gen_file_def, sm_idx) - - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - - +genMessageCode("--清除中断") - +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - - - +genTcEndFrameCode(gen_file_def)) - - genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1) - - return gen_file_def - -def tc5(): - genPkt = GenPkt() - - gen_file_def = "base_tc05" - sm_idx = 0 - tc_des = "发送单播子包,向4个从设备分别写入数据。\\n" - - #------------------------------------------------------------------------- - #>>>>>>普通数据包0,用来操作sync - genPkt.clean() - genPkt.setPktType(0) - - sm_size = 64 - - data = bytearray(b"\0"*100) - data[0] = 0 #0x0300 - data[1] = 0 #0x0301 - data[2] = sm_size #0x302 长度1 - data[3] = 0 #0x303 长度2 - data[4] = 0 - data[5] = 0 - data[6] = sm_size - data[7] = 0 - data[8] = 0 - data[9] = 0 - data[10] = sm_size - data[11] = 0 - data[12] = 0 - data[13] = 0 - data[14] = sm_size - data[15] = 0 - - - #subPkt参数:索引、索引类型、地址、命令、长度、数据 - genPkt.addSubPkt(0x02, 0, 0x0300, 0x1, 4, data) #sm0 - genPkt.addSubPkt(0x01, 0, 0x0308, 0x1, 4, data) #sm2 - genPkt.addSubPkt(0x03, 0, 0x0310, 0x1, 4, data) #sm4 - genPkt.addSubPkt(0x04, 0, 0x0318, 0x1, 4, data) #sm6 - - - data = bytearray(b"\0"*100) - for i in range(sm_size): - data[i] = i - data[10] = ord('B') - data[11] = ord('A') - genPkt.addSubPkt(0x02, 0, 0x0800, 0x1, sm_size, data) - - data = bytearray(b"\0"*100) - for i in range(sm_size): - data[i] = i - data[11] = ord('B') - data[12] = ord('A') - genPkt.addSubPkt(0x01, 0, 0x1800, 0x1, sm_size, data) - - data = bytearray(b"\0"*100) - for i in range(sm_size): - data[i] = i - data[12] = ord('B') - data[13] = ord('A') - genPkt.addSubPkt(0x03, 0, 0x2800, 0x1, sm_size, data) - - data = bytearray(b"\0"*100) - for i in range(sm_size): - data[i] = i - data[13] = ord('B') - data[14] = ord('A') - genPkt.addSubPkt(0x04, 0, 0x3800, 0x1, sm_size, data) - - sm_idx = 0 - - genPkt.addBeforeExc(genTcStartFrameCode(gen_file_def, tc_des) - +genMessageCode("--清除中断") - +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - ) - - genPkt.addAfterExc(genWriteTransLenCode(gen_file_def, sm_idx) - +genWriteTransPktCode(gen_file_def, sm_idx) - +genTrgTransPktCode(gen_file_def, sm_idx) - +genReadAckPktCode(gen_file_def, sm_idx) - - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - - +genMessageCode("--清除中断") - +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - - +genSlvSMReadData(1, 2, sm_size) - +genSlvSMReadData(2, 0, sm_size) - +genSlvSMReadData(3, 4, sm_size) - +genSlvSMReadData(4, 6, sm_size) - - +genTcEndFrameCode(gen_file_def)) - - genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1) - return gen_file_def - - -def tc6(): - genPkt = GenPkt() - - gen_file_def = "base_tc06" - sm_idx = 0 - tc_des = "从4个从站中读取数据,并从对应的位置读取SM1中的数据长度。\\n" - - #------------------------------------------------------------------------- - #>>>>>>普通数据包2 - genPkt.clean() - genPkt.setPktType(0) - - genPkt.addBeforeExc(genTcStartFrameCode(gen_file_def, tc_des) - +genMessageCode("--清除中断") - +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - + genSlvSMWriteData(3, 1, 129) - + genSlvSMWriteData(4, 1, 140) - + genSlvSMWriteData(1, 1, 128) - + genSlvSMWriteData(2, 1, 152)) - - #subPkt参数:索引、索引类型、地址、命令、长度、数据 - genPkt.addSubPkt(3, 0, 0x1000, 0x0, 129, b"\0"*129) - genPkt.addSubPkt(4, 0, 0x1000, 0x0, 140, b"\0"*140) - genPkt.addSubPkt(1, 0, 0x1000, 0x0, 128, b"\0"*128) - genPkt.addSubPkt(2, 0, 0x1000, 0x0, 152, b"\0"*152) - genPkt.addSubPkt(1, 0, 0x0306, 0x0, 2, b"\0"*2) - genPkt.addSubPkt(2, 0, 0x0306, 0x0, 2, b"\0"*2) - genPkt.addSubPkt(3, 0, 0x0306, 0x0, 2, b"\0"*2) - genPkt.addSubPkt(4, 0, 0x0306, 0x0, 2, b"\0"*2) - - sm_idx = 0 - - genPkt.addAfterExc(genWriteTransLenCode(gen_file_def, sm_idx) - +genWriteTransPktCode(gen_file_def, sm_idx) - +genTrgTransPktCode(gen_file_def, sm_idx) - +genReadAckPktCode(gen_file_def, sm_idx) - - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - - +genMessageCode("--清除中断") - +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - - +genTcEndFrameCode(gen_file_def)) - - genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1) - - return gen_file_def - - - -def tc7(): - genPkt = GenPkt() - - gen_file_def = "base_tc07" - sm_idx = 0 - tc_des = "读写命令,写入0x100开始的32B寄存器,这32B寄存器实际上是只读寄存器。\\n" \ - + "检查是否真的写入,读取的值,子报文的状态。由于读写的寄存器是同步寄存器组,\\n"\ - + "数据每次可能因为运行时间的差别,存在差异,需要手工检查。" - - #------------------------------------------------------------------------- - #>>>>>>普通数据包3 - genPkt.clean() - genPkt.setPktType(0) - - #subPkt参数:索引、索引类型、地址、命令、长度、数据 - genPkt.addSubPkt(3, 0, 0x0100, 0x2, 32, b"\0"*129) - genPkt.addSubPkt(4, 0, 0x0100, 0x2, 32, b"\0"*140) - genPkt.addSubPkt(1, 0, 0x0100, 0x2, 32, b"\0"*128) - genPkt.addSubPkt(2, 0, 0x0100, 0x2, 32, b"\0"*152) - - genPkt.addSubPkt(2, 0, 0x0120, 0x2, 2, b"\x05"*32) - - sm_idx = 0 - - genPkt.addBeforeExc(genTcStartFrameCode(gen_file_def, tc_des) - +genMessageCode("--清除中断") - +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - ) - - genPkt.addAfterExc(genWriteTransLenCode(gen_file_def, sm_idx) - +genWriteTransPktCode(gen_file_def, sm_idx) - +genTrgTransPktCode(gen_file_def, sm_idx) - +genReadAckPktCode(gen_file_def, sm_idx) - - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - - +genMessageCode("--清除中断") - +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - - +genTcEndFrameCode(gen_file_def)) - - genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1) - - return gen_file_def - -def tc8(): - genPkt = GenPkt() - - gen_file_def = "base_tc08" - sm_idx = 0 - tc_des = "测试RESET,仅复位主站和2号设备;链路和网络被破坏;发送广播包只能到1,2;3,4收不到。\\n" \ - + "复位后,必须清除中断才能正常工作。通过嗅探包、设置顺序地址命令等重新建立网络。" - - #>>>>>>设置顺序地址 - genPkt.clean() - genPkt.setPktType(0) - - main_dev = [0x01, ] - slave_dev = [0x02, ] - - genPkt.addBeforeExc(genTcStartFrameCode(gen_file_def, tc_des) - +genIFRwDataCode(0, 0x78, False, 4) - - +genIFRwDataCode(0, 0x40, True, 4, [0x01, 0x00, 0x66, 0x79]) - +genIFRwDataCode(2, 0x40, True, 4, [0x01, 0x00, 0x66, 0x79]) - - +"\n#5000\n" - #+genIFRwDataCode(0, 0x09, True, 1, [0, ], False, iface=1) - #+genIFRwDataCode(2, 0x09, True, 1, [0, ], False, iface=1) - +using_proper_workmode(0) - +using_proper_workmode(2) - - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - - +genMessageCode("--设置中断为脉冲模式") - +genIFRwDataCode(0, 0x7c, True, 2, [0x00, 0x81]) - +genIFRwDataCode(2, 0x7c, True, 2, [0x00, 0x81]) - - +genMessageCode("--使能中断") - +genIFRwDataCode(0, 0x70, True, 4, [0x03, 0x00, 0x00, 0xf0]) - +genIFRwDataCode(2, 0x70, True, 4, [0x00, 0x00, 0x00, 0xf0]) - - +genMessageCode("--读取中断使能") - +genIFRwDataCode(0, 0x70, False, 4) - +genIFRwDataCode(2, 0x70, False, 4) - - +genMessageCode("--配置主从站") - +genIFRwDataCode(0, 0x00, True, 1, main_dev) - +genIFRwDataCode(2, 0x00, True, 1, slave_dev) - - +genMessageCode("--清除中断") - +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - ) - - - data = [0,] * 128 - - - #subPkt参数:索引、索引类型、地址、命令、长度、数据 - genPkt.addSubPkt(0x0, 0, 0x0, 0xd, 128, data) - - - sm_idx = 0 - - - genPkt.addAfterExc(genWriteTransLenCode(gen_file_def, sm_idx) - +genWriteTransPktCode(gen_file_def, sm_idx) - +genTrgTransPktCode(gen_file_def, sm_idx) - +genReadAckPktCode(gen_file_def, sm_idx) - - +genMessageCode("--清除中断") - +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - - +genMessageCode("--配置中断模式") - +genIFRwDataCode(0, 0x7c, True, 2, [0x00, 0x81]) - +genIFRwDataCode(2, 0x7c, True, 2, [0x00, 0x81]) - ) - genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1) - - #------------------------------------------------------------------------------ - genPkt.clean() - genPkt.setPktType(1) - - genPkt.addBeforeExc(genIFRwDataCode(1, 0xc0, False, 4) - +genIFRwDataCode(2, 0xc0, False, 4) - +genIFRwDataCode(3, 0xc0, False, 4) - +genIFRwDataCode(4, 0xc0, False, 4) - ) - - gen_file_def_ap = gen_file_def + "_rw01" - sm_idx = 0 - - genPkt.addAfterExc(genWriteTransLenCode(gen_file_def_ap, sm_idx) - +genWriteTransPktCode(gen_file_def_ap, sm_idx) - +genTrgTransPktCode(gen_file_def_ap, sm_idx) - +genReadAckPktCode(gen_file_def_ap, sm_idx) - #+genTcEndFrameCode(gen_file_def) - +genIFRwDataCode(1, 0xc0, False, 4) - +genIFRwDataCode(2, 0xc0, False, 4) - +genIFRwDataCode(3, 0xc0, False, 4) - +genIFRwDataCode(4, 0xc0, False, 4) - - +genMessageCode("--清除中断") - +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - ) - - genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1, True, gen_file_def_ap) - - #------------------------------------------------------------------------------ - genPkt.clean() - genPkt.setPktType(0) - - gen_file_def_ap = gen_file_def + "_rw02" - sm_idx = 0 - - data = [0x3f, 0xff] - genPkt.addSubPkt(0x0, 0, 0x0, 0xb, 2, data) - - genPkt.addAfterExc(genWriteTransLenCode(gen_file_def_ap, sm_idx) - +genWriteTransPktCode(gen_file_def_ap, sm_idx) - +genTrgTransPktCode(gen_file_def_ap, sm_idx) - +genReadAckPktCode(gen_file_def_ap, sm_idx) - - +genMessageCode("--清除中断") - +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - ) - - genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1, True, gen_file_def_ap) - - - #------------------------------------------------------------------------------ - genPkt.clean() - genPkt.setPktType(1) - - genPkt.addBeforeExc(genIFRwDataCode(1, 0xc0, False, 4) - +genIFRwDataCode(2, 0xc0, False, 4) - +genIFRwDataCode(3, 0xc0, False, 4) - +genIFRwDataCode(4, 0xc0, False, 4) - ) - - gen_file_def_ap = gen_file_def + "_rw03" - sm_idx = 0 - - genPkt.addAfterExc(genWriteTransLenCode(gen_file_def_ap, sm_idx) - +genWriteTransPktCode(gen_file_def_ap, sm_idx) - +genTrgTransPktCode(gen_file_def_ap, sm_idx) - +genReadAckPktCode(gen_file_def_ap, sm_idx) - +genIFRwDataCode(1, 0xc0, False, 4) - +genIFRwDataCode(2, 0xc0, False, 4) - +genIFRwDataCode(3, 0xc0, False, 4) - +genIFRwDataCode(4, 0xc0, False, 4) - - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - - +genMessageCode("--清除中断") - +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - - +genTcEndFrameCode(gen_file_def) - ) - - genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1, True, gen_file_def_ap) - - - return gen_file_def - - -def tc9(): - genPkt = GenPkt() - - gen_file_def = "base_tc09" - sm_idx = 0 - tc_des = ("发送超过带有64个子包的读。检查子包的状态、中断、统计等信息。\\n" - "由于读取了0x100同步寄存器组;0x200 eb-mmu寄存器组;0x0300数据缓冲区寄存器组;\\n" - "这些寄存器值和时间相关,不提供对比结果,需要手工检查。" - ) - - #------------------------------------------------------------------------- - #>>>>>>设置顺序地址 - genPkt.clean() - genPkt.setPktType(0) - - data = [0, ] * 32 - #subPkt参数:索引、索引类型、地址、命令、长度、数据 - genPkt.addSubPkt(0x1, 0, 0x0000, 0x0, 4, data) - genPkt.addSubPkt(0x1, 0, 0x0100, 0x0, 8, data) - genPkt.addSubPkt(0x1, 0, 0x0200, 0x0, 16, data) - genPkt.addSubPkt(0x1, 0, 0x0300, 0x0, 4, data) - - genPkt.addSubPkt(0x2, 0, 0x0000, 0x0, 4, data) - genPkt.addSubPkt(0x2, 0, 0x0100, 0x0, 8, data) - genPkt.addSubPkt(0x2, 0, 0x0200, 0x0, 16, data) - genPkt.addSubPkt(0x2, 0, 0x0300, 0x0, 4, data) - - genPkt.addSubPkt(0x3, 0, 0x0000, 0x0, 4, data) - genPkt.addSubPkt(0x3, 0, 0x0100, 0x0, 8, data) - genPkt.addSubPkt(0x3, 0, 0x0200, 0x0, 16, data) - genPkt.addSubPkt(0x3, 0, 0x0300, 0x0, 4, data) - - genPkt.addSubPkt(0x4, 0, 0x0000, 0x0, 4, data) - genPkt.addSubPkt(0x4, 0, 0x0100, 0x0, 8, data) - genPkt.addSubPkt(0x4, 0, 0x0200, 0x0, 16, data) - genPkt.addSubPkt(0x4, 0, 0x0300, 0x0, 4, data) - - genPkt.addSubPkt(0x5, 0, 0x0000, 0x0, 4, data) - genPkt.addSubPkt(0x5, 0, 0x0100, 0x0, 8, data) - genPkt.addSubPkt(0x5, 0, 0x0200, 0x0, 16, data) - genPkt.addSubPkt(0x5, 0, 0x0300, 0x0, 4, data) - - genPkt.addSubPkt(0x6, 0, 0x0000, 0x0, 4, data) - genPkt.addSubPkt(0x6, 0, 0x0100, 0x0, 8, data) - genPkt.addSubPkt(0x6, 0, 0x0200, 0x0, 16, data) - genPkt.addSubPkt(0x6, 0, 0x0300, 0x0, 4, data) - - genPkt.addSubPkt(0x3, 0, 0x0000, 0x0, 4, data) - genPkt.addSubPkt(0x3, 0, 0x0100, 0x0, 8, data) - genPkt.addSubPkt(0x3, 0, 0x0200, 0x0, 16, data) - genPkt.addSubPkt(0x3, 0, 0x0300, 0x0, 4, data) - - genPkt.addSubPkt(0x4, 0, 0x0000, 0x0, 4, data) - genPkt.addSubPkt(0x4, 0, 0x0100, 0x0, 8, data) - genPkt.addSubPkt(0x4, 0, 0x0200, 0x0, 16, data) - genPkt.addSubPkt(0x4, 0, 0x0300, 0x0, 4, data) - - genPkt.addSubPkt(0x1, 0, 0x0000, 0x0, 4, data) - genPkt.addSubPkt(0x1, 0, 0x0100, 0x0, 8, data) - genPkt.addSubPkt(0x1, 0, 0x0200, 0x0, 16, data) - genPkt.addSubPkt(0x1, 0, 0x0300, 0x0, 4, data) - - genPkt.addSubPkt(0x2, 0, 0x0000, 0x0, 4, data) - genPkt.addSubPkt(0x2, 0, 0x0100, 0x0, 8, data) - genPkt.addSubPkt(0x2, 0, 0x0200, 0x0, 16, data) - genPkt.addSubPkt(0x2, 0, 0x0300, 0x0, 4, data) - - genPkt.addSubPkt(0x3, 0, 0x0000, 0x0, 4, data) - genPkt.addSubPkt(0x3, 0, 0x0100, 0x0, 8, data) - genPkt.addSubPkt(0x3, 0, 0x0200, 0x0, 16, data) - genPkt.addSubPkt(0x3, 0, 0x0300, 0x0, 4, data) - - genPkt.addSubPkt(0x4, 0, 0x0000, 0x0, 4, data) - genPkt.addSubPkt(0x4, 0, 0x0100, 0x0, 8, data) - genPkt.addSubPkt(0x4, 0, 0x0200, 0x0, 16, data) - genPkt.addSubPkt(0x4, 0, 0x0300, 0x0, 4, data) - - genPkt.addSubPkt(0x1, 0, 0x0000, 0x0, 4, data) - genPkt.addSubPkt(0x1, 0, 0x0100, 0x0, 8, data) - genPkt.addSubPkt(0x1, 0, 0x0200, 0x0, 16, data) - genPkt.addSubPkt(0x1, 0, 0x0300, 0x0, 4, data) - - genPkt.addSubPkt(0x2, 0, 0x0000, 0x0, 4, data) - genPkt.addSubPkt(0x2, 0, 0x0100, 0x0, 8, data) - genPkt.addSubPkt(0x2, 0, 0x0200, 0x0, 16, data) - genPkt.addSubPkt(0x2, 0, 0x0300, 0x0, 4, data) - - genPkt.addSubPkt(0x3, 0, 0x0000, 0x0, 4, data) - genPkt.addSubPkt(0x3, 0, 0x0100, 0x0, 8, data) - genPkt.addSubPkt(0x3, 0, 0x0200, 0x0, 16, data) - genPkt.addSubPkt(0x3, 0, 0x0300, 0x0, 4, data) - - genPkt.addSubPkt(0x4, 0, 0x0000, 0x0, 4, data) - genPkt.addSubPkt(0x4, 0, 0x0100, 0x0, 8, data) - genPkt.addSubPkt(0x4, 0, 0x0200, 0x0, 16, data) - genPkt.addSubPkt(0x4, 0, 0x0300, 0x0, 4, data) - - data = [0, ] * 128 - genPkt.addSubPkt(0x1, 0, 0x0180, 0x0, 128, data) - genPkt.addSubPkt(0x2, 0, 0x0180, 0x0, 128, data) - genPkt.addSubPkt(0x3, 0, 0x0180, 0x0, 128, data) - genPkt.addSubPkt(0x4, 0, 0x0180, 0x0, 128, data) - - sm_idx = 0 - - custom_data1 = list(range(1, 129)) - custom_data2 = list(range(1*2, 129*2, 2)) - custom_data3 = list(range(1*3, 129*3, 3)) - custom_data4 = list(range(1*4, 129*4, 4)) - genPkt.addBeforeExc(genTcStartFrameCode(gen_file_def, tc_des) - +genMessageCode("--清除中断") - +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(1, 0x180, True, 128, custom_data1) - +genIFRwDataCode(2, 0x180, True, 128, custom_data2) - +genIFRwDataCode(3, 0x180, True, 128, custom_data3) - +genIFRwDataCode(4, 0x180, True, 128, custom_data4) - ) - - genPkt.addAfterExc(genWriteTransLenCode(gen_file_def, sm_idx) - +genWriteTransPktCode(gen_file_def, sm_idx) - +genTrgTransPktCode(gen_file_def, sm_idx) - +genReadAckPktCode(gen_file_def, sm_idx) - - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - - +genMessageCode("--清除中断") - +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - - +genTcEndFrameCode(gen_file_def)) - - genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1) - - return gen_file_def - -def tc10(): - genPkt = GenPkt() - - gen_file_def = "base_tc10" - sm_idx = 0 - tc_des = ("发送超过带有64个子包的写。检查子包的状态、中断、统计等信息。\\n" - "由于访问了统计寄存器,需要手动确认这些寄存器。" - ) - - #------------------------------------------------------------------------- - #>>>>>>设置顺序地址 - genPkt.clean() - genPkt.setPktType(0) - - for i in range(1, 5): - data = [0, ] * 32 - genPkt.addSubPkt(i, 0, 0x0302, 1, 2, [0x40, 0x00]) - genPkt.addSubPkt(i, 0, 0x0800, 1, 4, [i + 1, 2, 3, 4]) - genPkt.addSubPkt(i, 0, 0x0804, 1, 4, [5, 6, 7, 8]) - genPkt.addSubPkt(i, 0, 0x0808, 1, 4, [9, 10, 11, 12]) - genPkt.addSubPkt(i, 0, 0x080c, 1, 4, [13, 14, 15, 16]) - genPkt.addSubPkt(i, 0, 0x0810, 1, 4, [17, 18, 19, 20]) - genPkt.addSubPkt(i, 0, 0x0814, 1, 4, [21, 22, 23, 24]) - genPkt.addSubPkt(i, 0, 0x0818, 1, 4, [25, 26, 27, 28]) - genPkt.addSubPkt(i, 0, 0x081c, 1, 4, [29, 30, 31, 32]) - genPkt.addSubPkt(i, 0, 0x0820, 1, 4, [1, 2, 3, 4]) - genPkt.addSubPkt(i, 0, 0x0824, 1, 4, [5, 6, 7, 8]) - genPkt.addSubPkt(i, 0, 0x0828, 1, 4, [9, 10, 11, 12]) - genPkt.addSubPkt(i, 0, 0x082c, 1, 4, [13, 14, 15, 16]) - genPkt.addSubPkt(i, 0, 0x0830, 1, 4, [17, 18, 19, 20]) - genPkt.addSubPkt(i, 0, 0x0834, 1, 4, [21, 22, 23, 24]) - genPkt.addSubPkt(i, 0, 0x0838, 1, 4, [25, 26, 27, 28]) - genPkt.addSubPkt(i, 0, 0x083c, 1, 4, [29, 30, 31, 32]) - - genPkt.addBeforeExc(genTcStartFrameCode(gen_file_def, tc_des) - +genMessageCode("--清除中断") - +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - ) - - genPkt.addAfterExc(genWriteTransLenCode(gen_file_def, sm_idx) - +genWriteTransPktCode(gen_file_def, sm_idx) - +genTrgTransPktCode(gen_file_def, sm_idx) - +genReadAckPktCode(gen_file_def, sm_idx) - - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - - +genMessageCode("--清除中断") - +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - - +genSlvSMReadData(1, 0, 0x40) - +genSlvSMReadData(2, 0, 0x40) - +genSlvSMReadData(3, 0, 0x40) - +genSlvSMReadData(4, 0, 0x40) - - +genIFRwDataCode(0, 0x80, False, 24) - +genIFRwDataCode(0, 0xa0, False, 24) - +genIFRwDataCode(1, 0x80, False, 24) - +genIFRwDataCode(1, 0xa0, False, 24) - +genIFRwDataCode(2, 0x80, False, 24) - +genIFRwDataCode(3, 0x80, False, 24) - +genIFRwDataCode(4, 0x80, False, 24) - - +genTcEndFrameCode(gen_file_def) - ) - - genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1) - - return gen_file_def - -def tc11(): - genPkt = GenPkt() - - gen_file_def = "base_tc11" - sm_idx = 0 - tc_des = "清除统计信息,从SPI侧清0,清0是失败的。因为统计寄存器对于SPI侧来说是只读寄存器。\\n" - - #------------------------------------------------------------------------- - #>>>>>>设置顺序地址 - genPkt.clean() - genPkt.setPktType(0) - op_size = 24 - - - data = [0, ] * op_size - genPkt.addBeforeExc(genTcStartFrameCode(gen_file_def, tc_des) - +genIFRwDataCode(0, 0x80, True, op_size, data) - +genIFRwDataCode(1, 0x80, True, op_size, data) - +genIFRwDataCode(2, 0x80, True, op_size, data) - +genIFRwDataCode(3, 0x80, True, op_size, data) - +genIFRwDataCode(4, 0x80, True, op_size, data) - ) - - genPkt.addAfterExc( genIFRwDataCode(0, 0x80, False, op_size) - +genIFRwDataCode(1, 0x80, False, op_size) - +genIFRwDataCode(2, 0x80, False, op_size) - +genIFRwDataCode(3, 0x80, False, op_size) - +genIFRwDataCode(4, 0x80, False, op_size) - - +genTcEndFrameCode(gen_file_def) - ) - - genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1) - - return gen_file_def - - -def tc12(): - genPkt = GenPkt() - - gen_file_def = "base_tc12" - sm_idx = 0 - tc_des = "清除统计信息,从LVDS侧清0,清0是成功的。\\n" - - #------------------------------------------------------------------------- - #>>>>>>设置顺序地址 - genPkt.clean() - genPkt.setPktType(0) - op_size = 24 - - - data = [0, ] * op_size - genPkt.addBeforeExc(genTcStartFrameCode(gen_file_def, tc_des) - +genMessageCode("--清除中断") - +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - ) - - genPkt.addSubPkt(0, 0, 0x80, 0xe, op_size, data) - - genPkt.addAfterExc(genWriteTransLenCode(gen_file_def, sm_idx) - +genWriteTransPktCode(gen_file_def, sm_idx) - +genTrgTransPktCode(gen_file_def, sm_idx) - +genReadAckPktCode(gen_file_def, sm_idx) - - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - - +genMessageCode("--清除中断") - +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - - +genIFRwDataCode(0, 0x80, False, op_size) - +genIFRwDataCode(1, 0x80, False, op_size) - +genIFRwDataCode(2, 0x80, False, op_size) - +genIFRwDataCode(3, 0x80, False, op_size) - +genIFRwDataCode(4, 0x80, False, op_size) - - +genTcEndFrameCode(gen_file_def) - ) - - genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1) - - return gen_file_def - - - -def tc13(): - genPkt = GenPkt() - - gen_file_def = "base_tc13" - sm_idx = 0 - tc_des = "测试事件寄存器组。先要同步一下时间,然后测试Latch0、Latch1的锁定。\\n"\ - + "间隔5000ns,以仿真周期算,大概是31~32个clock。需要检查波形文件。\\n"\ - + "latch0、latch1每个设备设置不一样,交替设置,相互印证。" - - - - genPkt.clean() - genPkt.setPktType(0) - - #subPkt参数:索引、索引类型、地址、命令、长度、数据 - genPkt.addSubPkt(0x0, 0, 0x0, 0xc, 12, b'\0'*12) - - - genPkt.addBeforeExc(genTcStartFrameCode(gen_file_def, tc_des) - +genMessageCode("--清除中断") - +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genEnableInsertTimeCode(0xa)) - - sm_idx = 0 - - genPkt.addAfterExc(genWriteTransLenCode(gen_file_def, sm_idx) - +genWriteTransPktCode(gen_file_def, sm_idx) - +genTrgTransPktCode(gen_file_def, sm_idx) - +genReadAckPktCode(gen_file_def, sm_idx) - +genMessageCode("--清除中断") - +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genCheckInsertTimeCode() - ) - - genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1) - #------------------------------------------------------------------------- - #>>>>>>设置顺序地址 - genPkt.clean() - genPkt.setPktType(0) - - gen_file_def_ap = gen_file_def + "_rw01" - genPkt.addBeforeExc(genMessageCode("--读取事件寄存器组") - +genIFRwDataCode(0, 0x500, False, 0x48) - +genIFRwDataCode(1, 0x500, False, 0x48) - +genIFRwDataCode(2, 0x500, False, 0x48) - +genIFRwDataCode(3, 0x500, False, 0x48) - +genIFRwDataCode(4, 0x500, False, 0x48) - - +genMessageCode("--设置事件") - +genIFRwDataCode(1, 0x500, True, 4, [0x0F, 0x00, 0x03, 0x00] ) - +genIFRwDataCode(2, 0x500, True, 4, [0x03, 0x00, 0x0F, 0x00] ) - +genIFRwDataCode(3, 0x500, True, 4, [0x0F, 0x00, 0x03, 0x00] ) - +genIFRwDataCode(4, 0x500, True, 4, [0x03, 0x00, 0x0F, 0x00] ) - - +genMessageCode("--读取事件寄存器组") - +genIFRwDataCode(0, 0x500, False, 0x48) - +genIFRwDataCode(1, 0x500, False, 0x48) - +genIFRwDataCode(2, 0x500, False, 0x48) - +genIFRwDataCode(3, 0x500, False, 0x48) - +genIFRwDataCode(4, 0x500, False, 0x48) - ) - - genPkt.addAfterExc( "latch0 <= 1;\n" - +"latch1 <= 1;\n" - - +"#5000\n" - +"latch0 <= 0;\n" - +"latch1 <= 0;\n" - - +"#5000\n" - +"latch0 <= 1;\n" - +"latch1 <= 1;\n" - - +"#5000\n" - +"latch0 <= 0;\n" - +"latch1 <= 0;\n" - - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - - +genMessageCode("--清除中断") - +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - - +genMessageCode("--读取事件寄存器组") - +genIFRwDataCode(0, 0x500, False, 0x48) - +genIFRwDataCode(1, 0x500, False, 0x48) - +genIFRwDataCode(2, 0x500, False, 0x48) - +genIFRwDataCode(3, 0x500, False, 0x48) - +genIFRwDataCode(4, 0x500, False, 0x48) - - +genTcEndFrameCode(gen_file_def) - ) - - genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1, True, gen_file_def_ap) - - return gen_file_def - - - -def tc14(): - genPkt = GenPkt() - - gen_file_def = "base_tc14" - sm_idx = 0 - tc_des = "测试事件寄存器组。先同步,事件寄存器组会抓取写入SMx、读出SMx的时间;SPI侧读入、写入的时间。\\n"\ - + "需要检查波形文件。" - - - - genPkt.clean() - genPkt.setPktType(0) - - #subPkt参数:索引、索引类型、地址、命令、长度、数据 - genPkt.addSubPkt(0x0, 0, 0x0, 0xc, 12, b'\0'*12) - - - genPkt.addBeforeExc(genTcStartFrameCode(gen_file_def, tc_des) - +genMessageCode("--清除中断") - +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genEnableInsertTimeCode(0xa)) - - sm_idx = 0 - - genPkt.addAfterExc(genWriteTransLenCode(gen_file_def, sm_idx) - +genWriteTransPktCode(gen_file_def, sm_idx) - +genTrgTransPktCode(gen_file_def, sm_idx) - +genReadAckPktCode(gen_file_def, sm_idx) - +genCheckInsertTimeCode() - ) - - genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1) - #------------------------------------------------------------------------- - #>>>>>>设置顺序地址 - genPkt.clean() - genPkt.setPktType(0) - - m2s_size = 8 - s2m_size = 16 - - gen_file_def_ap = gen_file_def + "_rw01" - genPkt.addBeforeExc(genMessageCode("--读取事件寄存器组") - +genIFRwDataCode(0, 0x500, False, 0x48) - +genIFRwDataCode(1, 0x500, False, 0x48) - +genIFRwDataCode(2, 0x500, False, 0x48) - +genIFRwDataCode(3, 0x500, False, 0x48) - +genIFRwDataCode(4, 0x500, False, 0x48) - - +genMessageCode("--清除中断") - +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - - +genSlvSMWriteData(1, 1, s2m_size, list(range(s2m_size))) - +genSlvSMWriteData(2, 1, s2m_size, list(range(s2m_size))) - +genSlvSMWriteData(3, 1, s2m_size, list(range(s2m_size))) - +genSlvSMWriteData(4, 1, s2m_size, list(range(s2m_size))) - ) - - - genPkt.addSubPkt(0, 0, 0x0302, 0xe, 2, [m2s_size, 0]) - genPkt.addSubPkt(0, 0, 0x0800, 0xe, m2s_size, list(range(m2s_size))) - genPkt.addSubPkt(1, 0, 0x1000, 0x0, s2m_size, [0, ] * s2m_size) - genPkt.addSubPkt(2, 0, 0x1000, 0x0, s2m_size, [0, ] * s2m_size) - genPkt.addSubPkt(3, 0, 0x1000, 0x0, s2m_size, [0, ] * s2m_size) - genPkt.addSubPkt(4, 0, 0x1000, 0x0, s2m_size, [0, ] * s2m_size) - - genPkt.addAfterExc(genWriteTransLenCode(gen_file_def_ap, sm_idx) - +genWriteTransPktCode(gen_file_def_ap, sm_idx) - +genTrgTransPktCode(gen_file_def_ap, sm_idx) - +genReadAckPktCode(gen_file_def_ap, sm_idx) - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - - +genMessageCode("--清除中断") - +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - - +genSlvSMReadData(1, 0, m2s_size) - +genSlvSMReadData(2, 0, m2s_size) - +genSlvSMReadData(3, 0, m2s_size) - +genSlvSMReadData(4, 0, m2s_size) - - +genMessageCode("--读取事件寄存器组") - +genIFRwDataCode(0, 0x500, False, 0x48) - +genIFRwDataCode(1, 0x500, False, 0x48) - +genIFRwDataCode(2, 0x500, False, 0x48) - +genIFRwDataCode(3, 0x500, False, 0x48) - +genIFRwDataCode(4, 0x500, False, 0x48) - - +genTcEndFrameCode(gen_file_def) - ) - - genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1, True, gen_file_def_ap) - - return gen_file_def - - -def tc_wr_sm(tc_id, wr_sm_idx): - genPkt = GenPkt() - - gen_file_def = f"base_tc{tc_id}_wr_sm{wr_sm_idx}" - sm_idx = 0 - tc_des = (f"读写SM{wr_sm_idx}缓冲区超过缓冲区的元素上限,期望结果,超出缓冲区的数据不被接收,工作计数不加。\\n" - "检查是否真的写入,子报文的状态。目前即使SM0、2、4、6满了,处于溢出状态,硬件难以判断是否能提交数据。\\n" - "目前只要地址、长度正确,即使无法写入,工作计数也会加1。工作计数不能反应报文与SMx的互动关系。\\n" - "需要手动检查相应数据。" - ) - - #------------------------------------------------------------------------- - #>>>>>>普通数据包3 - genPkt.clean() - genPkt.setPktType(0) - - #subPkt参数:索引、索引类型、地址、命令、长度、数据 - genPkt.addSubPkt(0, 0, 0x0302 + wr_sm_idx * 0x4, 0xe, 2, [32, 0]) - genPkt.addSubPkt(0, 0, 0x0800 + wr_sm_idx * 0x0800, 0xe, 32, list(range(0, 32))) - genPkt.addSubPkt(0, 0, 0x0800 + wr_sm_idx * 0x0800, 0xe, 32, list(range(32, 64))) - genPkt.addSubPkt(0, 0, 0x0800 + wr_sm_idx * 0x0800, 0xe, 32, list(range(64, 96))) - genPkt.addSubPkt(0, 0, 0x0800 + wr_sm_idx * 0x0800, 0xe, 32, list(range(96, 128))) - genPkt.addSubPkt(0, 0, 0x0800 + wr_sm_idx * 0x0800, 0xe, 32, list(range(128, 160))) - genPkt.addSubPkt(0, 0, 0x0800 + wr_sm_idx * 0x0800, 0xe, 32, list(range(160, 192))) - genPkt.addSubPkt(0, 0, 0x0800 + wr_sm_idx * 0x0800, 0xe, 32, list(range(192, 224))) - genPkt.addSubPkt(0, 0, 0x0800 + wr_sm_idx * 0x0800, 0xe, 32, list(range(224, 256))) - - sm_idx = 0 - - genPkt.addBeforeExc(genTcStartFrameCode(gen_file_def, tc_des) - +genMessageCode("--清除中断") - +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - ) - - genPkt.addAfterExc(genWriteTransLenCode(gen_file_def, sm_idx) - +genWriteTransPktCode(gen_file_def, sm_idx) - +genTrgTransPktCode(gen_file_def, sm_idx) - +genReadAckPktCode(gen_file_def, sm_idx) - - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - - +genMessageCode("--清除中断") - +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - - +genMessageCode("--第一次读") - +genIFRwDataCode(1, 0x300 + wr_sm_idx * 0x4, False, 2) - +genIFRwDataCode(2, 0x300 + wr_sm_idx * 0x4, False, 2) - +genIFRwDataCode(3, 0x300 + wr_sm_idx * 0x4, False, 2) - +genIFRwDataCode(4, 0x300 + wr_sm_idx * 0x4, False, 2) - +genSlvSMReadData(1, wr_sm_idx, 32) - +genSlvSMReadData(2, wr_sm_idx, 32) - +genSlvSMReadData(3, wr_sm_idx, 32) - +genSlvSMReadData(4, wr_sm_idx, 32) - - +genMessageCode("--第二次读") - +genIFRwDataCode(1, 0x300 + wr_sm_idx * 0x4, False, 2) - +genIFRwDataCode(2, 0x300 + wr_sm_idx * 0x4, False, 2) - +genIFRwDataCode(3, 0x300 + wr_sm_idx * 0x4, False, 2) - +genIFRwDataCode(4, 0x300 + wr_sm_idx * 0x4, False, 2) - +genSlvSMReadData(1, wr_sm_idx, 32) - +genSlvSMReadData(2, wr_sm_idx, 32) - +genSlvSMReadData(3, wr_sm_idx, 32) - +genSlvSMReadData(4, wr_sm_idx, 32) - - +genMessageCode("--第三次读") - +genIFRwDataCode(1, 0x300 + wr_sm_idx * 0x4, False, 2) - +genIFRwDataCode(2, 0x300 + wr_sm_idx * 0x4, False, 2) - +genIFRwDataCode(3, 0x300 + wr_sm_idx * 0x4, False, 2) - +genIFRwDataCode(4, 0x300 + wr_sm_idx * 0x4, False, 2) - +genSlvSMReadData(1, wr_sm_idx, 32) - +genSlvSMReadData(2, wr_sm_idx, 32) - +genSlvSMReadData(3, wr_sm_idx, 32) - +genSlvSMReadData(4, wr_sm_idx, 32) - - +genMessageCode("--第四次读") - +genIFRwDataCode(1, 0x300 + wr_sm_idx * 0x4, False, 2) - +genIFRwDataCode(2, 0x300 + wr_sm_idx * 0x4, False, 2) - +genIFRwDataCode(3, 0x300 + wr_sm_idx * 0x4, False, 2) - +genIFRwDataCode(4, 0x300 + wr_sm_idx * 0x4, False, 2) - +genSlvSMReadData(1, wr_sm_idx, 32) - +genSlvSMReadData(2, wr_sm_idx, 32) - +genSlvSMReadData(3, wr_sm_idx, 32) - +genSlvSMReadData(4, wr_sm_idx, 32) - - +genMessageCode("--第五次读") - +genIFRwDataCode(1, 0x300 + wr_sm_idx * 0x4, False, 2) - +genIFRwDataCode(2, 0x300 + wr_sm_idx * 0x4, False, 2) - +genIFRwDataCode(3, 0x300 + wr_sm_idx * 0x4, False, 2) - +genIFRwDataCode(4, 0x300 + wr_sm_idx * 0x4, False, 2) - +genSlvSMReadData(1, wr_sm_idx, 32) - +genSlvSMReadData(2, wr_sm_idx, 32) - +genSlvSMReadData(3, wr_sm_idx, 32) - +genSlvSMReadData(4, wr_sm_idx, 32) - +genIFRwDataCode(1, 0x300 + wr_sm_idx * 0x4, False, 2) - +genIFRwDataCode(2, 0x300 + wr_sm_idx * 0x4, False, 2) - +genIFRwDataCode(3, 0x300 + wr_sm_idx * 0x4, False, 2) - +genIFRwDataCode(4, 0x300 + wr_sm_idx * 0x4, False, 2) - - +genTcEndFrameCode(gen_file_def)) - - genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1) - - return gen_file_def - - -def tc_rd_sm(tc_id, rd_sm_idx): - genPkt = GenPkt() - - gen_file_def = f"base_tc{tc_id}_rd_sm{rd_sm_idx}" - sm_idx = 0 - tc_des = (f"读写SM{rd_sm_idx}缓冲区超过缓冲区的元素上限,期望结果,超出缓冲区的数据不被接收,工作计数不加。\\n" - "检查是否真的写入,子报文的状态。目前即使SM1、3、5、7空了,没有数据,硬件难以判断是否存在数据。\\n" - "目前只要地址、长度正确,即使无法读取,工作计数也会加1。工作计数不能反应报文与SMx的互动关系。\\n" - "需要手工检查生成数据。" - ) - - #------------------------------------------------------------------------- - #>>>>>>普通数据包3 - genPkt.clean() - genPkt.setPktType(0) - - #subPkt参数:索引、索引类型、地址、命令、长度、数据 - #genPkt.addSubPkt(0, 0, 0x0302, 0xd, 2, [32, 0]) - genPkt.addSubPkt(0, 0, 0x0800 + rd_sm_idx * 0x0800, 0xd, 32, [0,]*32) - genPkt.addSubPkt(0, 0, 0x0800 + rd_sm_idx * 0x0800, 0xd, 32, [0,]*32) - genPkt.addSubPkt(0, 0, 0x0800 + rd_sm_idx * 0x0800, 0xd, 32, [0,]*32) - genPkt.addSubPkt(0, 0, 0x0800 + rd_sm_idx * 0x0800, 0xd, 32, [0,]*32) - genPkt.addSubPkt(0, 0, 0x0800 + rd_sm_idx * 0x0800, 0xd, 32, [0,]*32) - genPkt.addSubPkt(0, 0, 0x0800 + rd_sm_idx * 0x0800, 0xd, 32, [0,]*32) - genPkt.addSubPkt(0, 0, 0x0800 + rd_sm_idx * 0x0800, 0xd, 32, [0,]*32) - genPkt.addSubPkt(0, 0, 0x0800 + rd_sm_idx * 0x0800, 0xd, 32, [0,]*32) - sm_idx = 0 - - genPkt.addBeforeExc(genTcStartFrameCode(gen_file_def, tc_des) - +genMessageCode("--清除中断") - +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - - +genMessageCode("--设备1的写") - +genIFRwDataCode(1, 0x300 + rd_sm_idx * 0x4, False, 2) - +genSlvSMWriteData(1, rd_sm_idx, 32, list(range(0, 32))) - +genSlvSMWriteData(1, rd_sm_idx, 32, list(range(32, 64))) - +genIFRwDataCode(1, 0x300 + rd_sm_idx * 0x4, False, 2) - +genSlvSMWriteData(1, rd_sm_idx, 32, list(range(64, 96))) - +genSlvSMWriteData(1, rd_sm_idx, 32, list(range(96, 128))) - +genIFRwDataCode(1, 0x300 + rd_sm_idx * 0x4, False, 2) - +genSlvSMWriteData(1, rd_sm_idx, 32, list(range(128, 160))) - +genSlvSMWriteData(1, rd_sm_idx, 32, list(range(160, 192))) - +genSlvSMWriteData(1, rd_sm_idx, 32, list(range(192, 224))) - +genSlvSMWriteData(1, rd_sm_idx, 32, list(range(224, 256))) - +genIFRwDataCode(1, 0x300 + rd_sm_idx * 0x4, False, 2) - - +genMessageCode("--设备2的写") - +genIFRwDataCode(2, 0x300 + rd_sm_idx * 0x4, False, 2) - +genSlvSMWriteData(2, rd_sm_idx, 32, list(range(0, 32))) - +genSlvSMWriteData(2, rd_sm_idx, 32, list(range(32, 64))) - +genIFRwDataCode(2, 0x300 + rd_sm_idx * 0x4, False, 2) - +genSlvSMWriteData(2, rd_sm_idx, 32, list(range(64, 96))) - +genSlvSMWriteData(2, rd_sm_idx, 32, list(range(96, 128))) - +genIFRwDataCode(2, 0x300 + rd_sm_idx * 0x4, False, 2) - +genSlvSMWriteData(2, rd_sm_idx, 32, list(range(128, 160))) - +genSlvSMWriteData(2, rd_sm_idx, 32, list(range(160, 192))) - +genSlvSMWriteData(2, rd_sm_idx, 32, list(range(192, 224))) - +genSlvSMWriteData(2, rd_sm_idx, 32, list(range(224, 256))) - +genIFRwDataCode(2, 0x300 + rd_sm_idx * 0x4, False, 2) - - +genMessageCode("--设备3的写") - +genIFRwDataCode(3, 0x300 + rd_sm_idx * 0x4, False, 2) - +genSlvSMWriteData(3, rd_sm_idx, 32, list(range(0, 32))) - +genSlvSMWriteData(3, rd_sm_idx, 32, list(range(32, 64))) - +genIFRwDataCode(3, 0x300 + rd_sm_idx * 0x4, False, 2) - +genSlvSMWriteData(3, rd_sm_idx, 32, list(range(64, 96))) - +genSlvSMWriteData(3, rd_sm_idx, 32, list(range(96, 128))) - +genIFRwDataCode(3, 0x300 + rd_sm_idx * 0x4, False, 2) - +genSlvSMWriteData(3, rd_sm_idx, 32, list(range(128, 160))) - +genSlvSMWriteData(3, rd_sm_idx, 32, list(range(160, 192))) - +genSlvSMWriteData(3, rd_sm_idx, 32, list(range(192, 224))) - +genSlvSMWriteData(3, rd_sm_idx, 32, list(range(224, 256))) - +genIFRwDataCode(3, 0x300 + rd_sm_idx * 0x4, False, 2) - - +genMessageCode("--设备4的写") - +genIFRwDataCode(4, 0x300 + rd_sm_idx * 0x4, False, 2) - +genSlvSMWriteData(4, rd_sm_idx, 32, list(range(0, 32))) - +genSlvSMWriteData(4, rd_sm_idx, 32, list(range(32, 64))) - +genIFRwDataCode(4, 0x300 + rd_sm_idx * 0x4, False, 2) - +genSlvSMWriteData(4, rd_sm_idx, 32, list(range(64, 96))) - +genSlvSMWriteData(4, rd_sm_idx, 32, list(range(96, 128))) - +genIFRwDataCode(4, 0x300 + rd_sm_idx * 0x4, False, 2) - +genSlvSMWriteData(4, rd_sm_idx, 32, list(range(128, 160))) - +genSlvSMWriteData(4, rd_sm_idx, 32, list(range(160, 192))) - +genSlvSMWriteData(4, rd_sm_idx, 32, list(range(192, 224))) - +genSlvSMWriteData(4, rd_sm_idx, 32, list(range(224, 256))) - +genIFRwDataCode(4, 0x300 + rd_sm_idx * 0x4, False, 2) - ) - - genPkt.addAfterExc(genWriteTransLenCode(gen_file_def, sm_idx) - +genWriteTransPktCode(gen_file_def, sm_idx) - +genTrgTransPktCode(gen_file_def, sm_idx) - +genReadAckPktCode(gen_file_def, sm_idx) - - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - - +genMessageCode("--清除中断") - +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - - +genTcEndFrameCode(gen_file_def)) - - genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1) - - return gen_file_def - - -def tc15(): - return tc_wr_sm(15, 0) - -def tc16(): - return tc_rd_sm(16, 1) - -def tc17(): - return tc_wr_sm(17, 2) - -def tc18(): - return tc_rd_sm(18, 3) - -def tc19(): - return tc_wr_sm(19, 4) - -def tc20(): - return tc_rd_sm(20, 5) - -def tc21(): - return tc_wr_sm(21, 6) - -def tc22(): - return tc_rd_sm(22, 7) - -def tc23(): - genPkt = GenPkt() - - gen_file_def = "base_tc23" - sm_idx = 0 - tc_des = "使用广播读写命令,读取SM0的长度寄存器;测试工作计数。\\n" - - #------------------------------------------------------------------------- - #>>>>>>普通数据包2 - genPkt.clean() - genPkt.setPktType(0) - - genPkt.addBeforeExc(genTcStartFrameCode(gen_file_def, tc_des) - +genMessageCode("--清除中断") - +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - ) - - #subPkt参数:索引、索引类型、地址、命令、长度、数据 - genPkt.addSubPkt(0, 0, 0x0302, 0xf, 2, [32, 0]) - - sm_idx = 0 - - genPkt.addAfterExc(genWriteTransLenCode(gen_file_def, sm_idx) - +genWriteTransPktCode(gen_file_def, sm_idx) - +genTrgTransPktCode(gen_file_def, sm_idx) - +genReadAckPktCode(gen_file_def, sm_idx) - - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - - +genMessageCode("--清除中断") - +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - - +genTcEndFrameCode(gen_file_def)) - - genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1) - - return gen_file_def - -def tc24(): - genPkt = GenPkt() - - gen_file_def = "base_tc24" - sm_idx = 0 - tc_des = ("同步后,SYNC信号采用脉冲触发,4个设备,4个周期;先用广播包发送公共周期;然后3,4,\\n" - "2设备单独指定周期。该同步数据之前没有补广播包。如果紧跟嗅探包而不是普通包之后,可能会影响同步。\\n" - "期望是无论前面发送得是什么包,都不会影响同步的效果。一段时间后,重新同步,期望不要打断sync\\n" - "信号的输出。需要在波形文件里查看具体的效果。" - ) - - - #------------------------------------------------------------------------- - genPkt.clean() - genPkt.setPktType(1) - - genPkt.addBeforeExc(genTcStartFrameCode(gen_file_def, tc_des) - +genMessageCode("--清除中断") - +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - #+genIFRwDataCode(2, 0x40, True, 4, [0x01, 0x00, 0x66, 0x79]) - #+genIFRwDataCode(3, 0x40, True, 4, [0x01, 0x00, 0x66, 0x79]) - #+genIFRwDataCode(4, 0x40, True, 4, [0x01, 0x00, 0x66, 0x79]) - ) - - - genPkt.addAfterExc(genWriteTransLenCode(gen_file_def, sm_idx) - +genWriteTransPktCode(gen_file_def, sm_idx) - +genTrgTransPktCode(gen_file_def, sm_idx) - +genReadAckPktCode(gen_file_def, sm_idx) - +genMessageCode("--清除中断") - +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - ) - - genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1) - - genPkt.clean() - genPkt.setPktType(0) - sm_idx = 0 - - data = [0x3f, 0xff] - genPkt.addSubPkt(0x0, 0, 0x0, 0xb, 2, data) - - gen_file_def_ap = gen_file_def + "_rwFF" - genPkt.addAfterExc(genWriteTransLenCode(gen_file_def_ap, sm_idx) - +genWriteTransPktCode(gen_file_def_ap, sm_idx) - +genTrgTransPktCode(gen_file_def_ap, sm_idx) - +genReadAckPktCode(gen_file_def_ap, sm_idx) - - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - - +genMessageCode("--清除中断") - +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - ) - - genPkt.gen("./generated/shin/%s.vh"%(gen_file_def,), 1, True, gen_file_def_ap) - - - #------------------------------------------------------------------------- - #>>>>>>设置同步信号的数据包 - genPkt.clean() - genPkt.setPktType(0) - sm_idx = 0 - - genPkt.addBeforeExc(genEnableInsertTimeCode(0xa) - + '''spi_trans( (16'h0100), (`SPI_READ), (8), (`IF_IDX(0)));\n''' - + '''_temp_time = rxBuf[`ARRAY_IDX_OFF] + (rxBuf[`ARRAY_IDX_OFF+1] << 8) + (rxBuf[`ARRAY_IDX_OFF+2] << 16) + (rxBuf[`ARRAY_IDX_OFF+3] << 24) + (rxBuf[`ARRAY_IDX_OFF+4] << 32) + (rxBuf[`ARRAY_IDX_OFF+5] << 40) + (rxBuf[`ARRAY_IDX_OFF+6] << 48) + (rxBuf[`ARRAY_IDX_OFF+7] << 56);\n''' - + '''_temp_time = _temp_time + 32'h3000;\n\n''') - - genPkt.addSubPkt(0x0, 0, 0x0, 0xc, 12, b'\0'*12) - - genPkt.addSubPkt(0x0, 0, 0x0, 0xd, 200, [0, ] * 200) - - #subPkt参数:索引、索引类型、地址、命令、长度、数据 - data = [0,] * 100 #bytearray(b"\0" * 100) - data[0] = 0x0f #地址0x120 - data[2] = 0xa - data[4] = 0xa - data[6] = 0xa - data[8] = 0xa - - data[16] = '''(_temp_time & 8'hff)''' #地址0x130, sync同步点 - data[17] = '''(_temp_time >> 8) & 8'hff''' #地址0x131 - data[18] = '''(_temp_time >> 16) & 8'hff''' - data[19] = '''(_temp_time >> 24) & 8'hff''' - - data[24] = 0x80 #地址0x138, sync周期 4B - data[25] = 0x00 #地址0x139 - - data[28] = 0x0 #sync1偏移 - data[29] = 0x0 - - data[36] = 0x0#sync3偏移 - data[37] = 0x0 - - genPkt.addSubPkt(0, 0, 0x120, 0xe, 0x28, data) - - data = [0,] * 100 #bytearray(b"\0" * 100) - data[0] = 0x0f #地址0x120 - data[2] = 0xa - data[4] = 0xa - data[6] = 0xa - data[8] = 0xa - - data[16] = '''(_temp_time & 8'hff)''' #地址0x130, sync同步点 - data[17] = '''(_temp_time >> 8) & 8'hff''' #地址0x131 - data[18] = '''(_temp_time >> 16) & 8'hff''' - data[19] = '''(_temp_time >> 24) & 8'hff''' - - data[24] = 0x00 #地址0x138, sync周期 4B - data[25] = 0x01 #地址0x139 - - data[28] = 0x0 #sync1偏移 - data[29] = 0x0 - - data[36] = 0x0 #sync3偏移 - data[37] = 0x0 - - genPkt.addSubPkt(3, 0, 0x120, 0x1, 0x28, data) - - data = [0,] * 100 #bytearray(b"\0" * 100) - data[0] = 0x0f #地址0x120 - data[2] = 0xa - data[4] = 0xa - data[6] = 0xa - data[8] = 0xa - - data[16] = '''(_temp_time & 8'hff)''' #地址0x130, sync同步点 - data[17] = '''(_temp_time >> 8) & 8'hff''' #地址0x131 - data[18] = '''(_temp_time >> 16) & 8'hff''' - data[19] = '''(_temp_time >> 24) & 8'hff''' - - data[24] = 0x00 #地址0x138, sync周期 4B - data[25] = 0x02 #地址0x139 - - data[28] = 0x0 #sync1偏移 - data[29] = 0x0 - - data[36] = 0x0 #sync3偏移 - data[37] = 0x0 - - genPkt.addSubPkt(4, 0, 0x120, 0x1, 0x28, data) - - data = [0,] * 100 #bytearray(b"\0" * 100) - data[0] = 0x0f #地址0x120 - data[2] = 0xa - data[4] = 0xa - data[6] = 0xa - data[8] = 0xa - - data[16] = '''(_temp_time & 8'hff)''' #地址0x130, sync同步点 - data[17] = '''(_temp_time >> 8) & 8'hff''' #地址0x131 - data[18] = '''(_temp_time >> 16) & 8'hff''' - data[19] = '''(_temp_time >> 24) & 8'hff''' - - data[24] = 0x00 #地址0x138, sync周期 4B - data[25] = 0x04 #地址0x139genPkt.addBeforeExc( - - data[28] = 0x0 #sync1偏移 - data[29] = 0x0 - - data[36] = 0x0 #sync3偏移 - data[37] = 0x0 - - genPkt.addSubPkt(2, 0, 0x120, 0x1, 0x28, data) - - gen_file_def_ap = gen_file_def + "_rw00" - genPkt.addAfterExc(genWriteTransLenCode(gen_file_def_ap, sm_idx) - +genWriteTransPktCode(gen_file_def_ap, sm_idx) - +genTrgTransPktCode(gen_file_def_ap, sm_idx) - +genReadAckPktCode(gen_file_def_ap, sm_idx) - - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - - +genMessageCode("--清除中断") - +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - ) - - genPkt.gen("./generated/shin/%s.vh"%(gen_file_def,), 1, True, gen_file_def_ap) - - #>>>>>>同步数据包 - genPkt.clean() - genPkt.setPktType(0) - - #subPkt参数:索引、索引类型、地址、命令、长度、数据 - genPkt.addSubPkt(0x0, 0, 0x0, 0xc, 12, [0, ] * 12) - genPkt.addSubPkt(0x0, 0, 0x0, 0xd, 10, [0, ] * 10) - genPkt.addSubPkt(0x0, 0, 0x0, 0xd, 10, [0, ] * 10) - - - - - genPkt.addBeforeExc(genEnableInsertTimeCode(0xa))# + 18 + 18)) - - sm_idx = 0 - - gen_file_def_ap = gen_file_def + "_rw02" - - genPkt.addAfterExc(genWriteTransLenCode(gen_file_def_ap, sm_idx) - +genWriteTransPktCode(gen_file_def_ap, sm_idx) - +genTrgTransPktCode(gen_file_def_ap, sm_idx) - +genReadAckPktCode(gen_file_def_ap, sm_idx) - +genCheckInsertTimeCode() - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - - +genMessageCode("--清除中断") - +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - +genTcEndFrameCode(gen_file_def)) #+genDisableInsertTimeCode()) - - - genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1, True, gen_file_def_ap) - return gen_file_def - - -def tc25(): - genPkt = GenPkt() - - gen_file_def = "base_tc25" - sm_idx = 0 - tc_des = "发送一个包,内涵多个子包,包括所有的命令。\\n" - - - #------------------------------------------------------------------------- - #>>>>>>普通数据包 sm1,2个读 - genPkt.clean() - genPkt.setPktType(0) - - #subPkt参数:索引、索引类型、地址、命令、长度、数据 - genPkt.addSubPkt(0x00, 0, 0x00, 0xc, 12, [0, ] * 12) - genPkt.addSubPkt(0x01, 0, 0x00, 0x0, 32, [0, ] * 32) - genPkt.addSubPkt(0x02, 0, 0x302, 0x1, 2, [0x10, 0]) - genPkt.addSubPkt(0x02, 0, 0x800, 0x1, 0x10, list(range(0x10))) - genPkt.addSubPkt(0x01, 0, 0x302, 0x2, 2, [0x20, 0]) - genPkt.addSubPkt(0x02, 0, 0x00, 0xb, 2, [0x00, 0x00]) - genPkt.addSubPkt(0x00, 0, 0x70, 0xd, 4, [0, 0, 0, 0]) - genPkt.addSubPkt(0x00, 0, 0x30a, 0xe, 2, [0x20, 0x00]) - genPkt.addSubPkt(0x00, 0, 0xc0, 0xf, 2, [0x00, 0x00]) - - - sm_idx = 1 - genPkt.addBeforeExc(genTcStartFrameCode(gen_file_def, tc_des) - +genMessageCode("--清除中断") - +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genEnableInsertTimeCode(0xa)) - - genPkt.addAfterExc(genWriteTransLenCode(gen_file_def, sm_idx) - +genWriteTransPktCode(gen_file_def, sm_idx) - +genTrgTransPktCode(gen_file_def, sm_idx) - +genReadAckPktCode(gen_file_def, sm_idx) - - +genIFRwDataCode(2, 0x800, False, 0x10) - - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - - +genMessageCode("--清除中断") - +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - - +genTcEndFrameCode(gen_file_def)) - - genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1) - - return gen_file_def - - -def tc26(): - genPkt = GenPkt() - - gen_file_def = "base_tc26" - sm_idx = 0 - tc_des = "读取内部的时钟,看看是否有进位问题,导致读取的错误或不可靠。\\n" - - - #------------------------------------------------------------------------- - #>>>>>>普通数据包 sm1,2个读 - genPkt.clean() - genPkt.setPktType(0) - - #subPkt参数:索引、索引类型、地址、命令、长度、数据 - genPkt.addSubPkt(0x00, 0, 0x00, 0xc, 12, [0, ] * 12) - - - sm_idx = 1 - genPkt.addBeforeExc(genTcStartFrameCode(gen_file_def, tc_des) - +genMessageCode("--清除中断") - +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genEnableInsertTimeCode(0xa)) - - genPkt.addAfterExc(genWriteTransLenCode(gen_file_def, sm_idx) - +genWriteTransPktCode(gen_file_def, sm_idx) - +genTrgTransPktCode(gen_file_def, sm_idx) - +genReadAckPktCode(gen_file_def, sm_idx) - - +genIFRwDataCode(2, 0x800, False, 0x10) - - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - - +genMessageCode("--清除中断") - +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - - +genMessageCode("--读取时间1") - +genIFRwDataCode(0, 0x100, False, 32) - +genIFRwDataCode(1, 0x100, False, 32) - +genIFRwDataCode(2, 0x100, False, 32) - +genIFRwDataCode(3, 0x100, False, 32) - +genIFRwDataCode(4, 0x100, False, 32) - - - +"#8000\n" - +genMessageCode("--读取时间2") - +genIFRwDataCode(0, 0x100, False, 32) - +genIFRwDataCode(1, 0x100, False, 32) - +genIFRwDataCode(2, 0x100, False, 32) - +genIFRwDataCode(3, 0x100, False, 32) - +genIFRwDataCode(4, 0x100, False, 32) - - - +genMessageCode("--读取时间3") - +genIFRwDataCode(0, 0x100, False, 8) - +genIFRwDataCode(0, 0x118, False, 8) - +genIFRwDataCode(1, 0x118, False, 8) - +genIFRwDataCode(2, 0x118, False, 8) - +genIFRwDataCode(3, 0x118, False, 8) - +genIFRwDataCode(4, 0x118, False, 8) - - - +genTcEndFrameCode(gen_file_def)) - - genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1) - - return gen_file_def - -def tc27(): - genPkt = GenPkt() - - gen_file_def = "base_tc27" - sm_idx = 0 - tc_des = "测试主站并行输出。在SM0工作的情况下,操作SM1,SM2,SM3,然后看是否正常。\\n" - - - #------------------------------------------------------------------------- - #>>>>>>普通数据包 sm1,2个读 - genPkt.clean() - genPkt.setPktType(0) - - #subPkt参数:索引、索引类型、地址、命令、长度、数据 - genPkt.addSubPkt(0x01, 0, 0x302, 0x1, 2, [0x00, 0x03]) - genPkt.addSubPkt(0x02, 0, 0x302, 0x1, 2, [0x00, 0x01]) - genPkt.addSubPkt(0x03, 0, 0x302, 0x1, 2, [0x00, 0x01]) - genPkt.addSubPkt(0x04, 0, 0x302, 0x1, 2, [0x00, 0x01]) - - - sm_idx = 0 - genPkt.addBeforeExc(genTcStartFrameCode(gen_file_def, tc_des) - +genMessageCode("--清除中断") - +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - ) - - genPkt.addAfterExc(genWriteTransLenCode(gen_file_def, sm_idx) - +genWriteTransPktCode(gen_file_def, sm_idx) - +genTrgTransPktCode(gen_file_def, sm_idx) - +genReadAckPktCode(gen_file_def, sm_idx) - +genMessageCode("--清除中断") - +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - ) - - - - #+genTcEndFrameCode(gen_file_def)) - - genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1) - - genPkt.clean() - genPkt.setPktType(0) - - #subPkt参数:索引、索引类型、地址、命令、长度、数据 - genPkt.addSubPkt(0x01, 0, 0x800, 0x1, 768, - list(range(256)) + list(range(255, -1, -1)) + list(range(256))) - - - - gen_file_def_ap01 = gen_file_def + "_rw01" - genPkt.addAfterExc(genWriteTransLenCode(gen_file_def_ap01, 1) - +genWriteTransPktCode(gen_file_def_ap01, 1) - +genTrgTransPktCode(gen_file_def_ap01, 1) - ) - genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1, True, gen_file_def_ap01) - - genPkt.clean() - genPkt.setPktType(0) - - #subPkt参数:索引、索引类型、地址、命令、长度、数据 - genPkt.addSubPkt(0x02, 0, 0x800, 0x1, 256, list(range(128)) + list(range(128))) - - - - gen_file_def_ap02 = gen_file_def + "_rw02" - sm_idx = 2 - genPkt.addAfterExc(genWriteTransLenCode(gen_file_def_ap02, 2) - +genWriteTransPktCode(gen_file_def_ap02, 2) - ) - genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1, True, gen_file_def_ap02) - - - - genPkt.clean() - genPkt.setPktType(0) - - #subPkt参数:索引、索引类型、地址、命令、长度、数据 - genPkt.addSubPkt(0x03, 0, 0x800, 0x1, 256, list(range(64)) + list(range(64)) + list(range(64)) + list(range(64))) - - - - gen_file_def_ap03 = gen_file_def + "_rw03" - sm_idx = 3 - genPkt.addAfterExc(genWriteTransLenCode(gen_file_def_ap03, 3) - +genWriteTransPktCode(gen_file_def_ap03, 3) - +genReadAckPktCode(gen_file_def_ap01, 1) - - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - - +genMessageCode("--清除中断") - +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - - +genTrgTransPktCode(gen_file_def_ap02, 2) - +genReadAckPktCode(gen_file_def_ap02, 2) - - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - - +genMessageCode("--清除中断") - +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - - +genTrgTransPktCode(gen_file_def_ap03, 3) - +genReadAckPktCode(gen_file_def_ap03, 3) - - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - - +genMessageCode("--清除中断") - +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - - - +genIFRwDataCode(1, 0x800, False, 768) - +genIFRwDataCode(2, 0x800, False, 256) - +genIFRwDataCode(3, 0x800, False, 256) - - +genTcEndFrameCode(gen_file_def) - ) - genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1, True, gen_file_def_ap03) - - - return gen_file_def - -def tc28(): - genPkt = GenPkt() - - - gen_file_def = "base_tc28" - sm_idx = 0 - tc_des = ("测试IO交换特性,为环网通信做准备。\\n" - ) - - genPkt.clean() - genPkt.setPktType(0) - - genPkt.addBeforeExc(genTcStartFrameCode(gen_file_def, tc_des) - +genIFRwDataCode(0, 0x40, True, 4, [0x01, 0x00, 0x66, 0x79]) - +genIFRwDataCode(4, 0x40, True, 4, [0x01, 0x00, 0x66, 0x79]) - +"#5000" - #+genIFRwDataCode(0, 0x09, True, 1, [0, ], False, iface=1) - #+genIFRwDataCode(4, 0x09, True, 1, [0, ], False, iface=1) - +using_proper_workmode(0) - +using_proper_workmode(4) - - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - - +genMessageCode("--读取中断使能") - +genIFRwDataCode(0, 0x70, False, 4) - +genIFRwDataCode(4, 0x70, False, 4) - - +genMessageCode("--配置主从站") - +genIFRwDataCode(0, 0x00, True, 1, [0x02, ]) - +genIFRwDataCode(4, 0x00, True, 1, [0x01, ]) - ) - - genPkt.addAfterExc(genIFRwDataCode(0, 0x4a, False, 2) - +genIFRwDataCode(1, 0x4a, False, 2) - +genIFRwDataCode(2, 0x4a, False, 2) - +genIFRwDataCode(3, 0x4a, False, 2) - +genIFRwDataCode(4, 0x4a, False, 2) - - +genIFRwDataCode(0, 0x4a, True, 2, [1, 0x58]) - +genIFRwDataCode(1, 0x4a, True, 2, [1, 0x58]) - +genIFRwDataCode(2, 0x4a, True, 2, [1, 0x58]) - +genIFRwDataCode(3, 0x4a, True, 2, [1, 0x58]) - +genIFRwDataCode(4, 0x4a, True, 2, [1, 0x58]) - - +genIFRwDataCode(0, 0, False, 1) - +genIFRwDataCode(1, 0, False, 1) - +genIFRwDataCode(2, 0, False, 1) - +genIFRwDataCode(3, 0, False, 1) - +genIFRwDataCode(4, 0, False, 1) - #genWriteTransLenCode(gen_file_def, sm_idx) - #+genWriteTransPktCode(gen_file_def, sm_idx) - #+genTrgTransPktCode(gen_file_def, sm_idx) - #+genReadAckPktCode(gen_file_def, sm_idx) - - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - - +genMessageCode("--清除中断") - +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - - #+genTcEndFrameCode(gen_file_def) - ) - genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1) - - genPkt.clean() - genPkt.setPktType(1) - - gen_file_def_ap = gen_file_def + "_rw01" - sm_idx = 0 - genPkt.addAfterExc(genWriteTransLenCode(gen_file_def_ap, sm_idx, dev_idx=4) - +genWriteTransPktCode(gen_file_def_ap, sm_idx, dev_idx=4) - +genTrgTransPktCode(gen_file_def_ap, sm_idx, dev_idx=4) - +genReadAckPktCode(gen_file_def_ap, sm_idx, dev_idx=4) - - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - - +genMessageCode("--清除中断") - +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - - #+genTcEndFrameCode(gen_file_def) - ) - genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1, True, gen_file_def_ap) - - genPkt.clean() - genPkt.setPktType(0) - - - data = [0x3f, 0xff] - genPkt.addSubPkt(0x0, 0, 0x0, 0xb, 2, data) - - gen_file_def_ap = gen_file_def + "_rw02" - sm_idx = 0 - genPkt.addAfterExc(genWriteTransLenCode(gen_file_def_ap, sm_idx, dev_idx=4) - +genWriteTransPktCode(gen_file_def_ap, sm_idx, dev_idx=4) - +genTrgTransPktCode(gen_file_def_ap, sm_idx, dev_idx=4) - +genReadAckPktCode(gen_file_def_ap, sm_idx, dev_idx=4) - - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - - +genMessageCode("--清除中断") - +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - - #+genTcEndFrameCode(gen_file_def) - ) - genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1, True, gen_file_def_ap) - - - genPkt.clean() - genPkt.setPktType(1) - - gen_file_def_ap = gen_file_def + "_rw03" - sm_idx = 0 - genPkt.addAfterExc(genWriteTransLenCode(gen_file_def_ap, sm_idx, dev_idx=4) - +genWriteTransPktCode(gen_file_def_ap, sm_idx, dev_idx=4) - +genTrgTransPktCode(gen_file_def_ap, sm_idx, dev_idx=4) - +genReadAckPktCode(gen_file_def_ap, sm_idx, dev_idx=4) - - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - - +genMessageCode("--清除中断") - +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - - #+genTcEndFrameCode(gen_file_def) - ) - genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1, True, gen_file_def_ap) - - - genPkt.clean() - genPkt.setPktType(0) - - genPkt.addSubPkt(0x1, 0, 0x180, 0, 32, [0, ]*32) - genPkt.addSubPkt(0x2, 0, 0x180, 0, 32, [0, ]*32) - genPkt.addSubPkt(0x3, 0, 0x180, 0, 32, [0, ]*32) - genPkt.addSubPkt(0x4, 0, 0x180, 0, 32, [0, ]*32) - - gen_file_def_ap = gen_file_def + "_rw04" - sm_idx = 0 - genPkt.addAfterExc(genWriteTransLenCode(gen_file_def_ap, sm_idx, dev_idx=4) - +genWriteTransPktCode(gen_file_def_ap, sm_idx, dev_idx=4) - +genTrgTransPktCode(gen_file_def_ap, sm_idx, dev_idx=4) - +genReadAckPktCode(gen_file_def_ap, sm_idx, dev_idx=4) - - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - - +genMessageCode("--清除中断") - +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - - - +genIFRwDataCode(0, 0x40, True, 4, [0x01, 0x00, 0x66, 0x79]) - +genIFRwDataCode(4, 0x40, True, 4, [0x01, 0x00, 0x66, 0x79]) - +"#5000" - #+genIFRwDataCode(0, 0x09, True, 1, [0, ], False, iface=1) - #+genIFRwDataCode(4, 0x09, True, 1, [0, ], False, iface=1) - +using_proper_workmode(0) - +using_proper_workmode(4) - - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - - +genMessageCode("--配置中断") - #+genIFRwDataCode(0, 0x70, False, 4) - #+genIFRwDataCode(4, 0x70, False, 4) - +genIFRwDataCode(0, 0x70, True, 4, [0x03, 0x00, 0x00, 0xf0]) - +genIFRwDataCode(4, 0x70, True, 4, [0x00, 0x00, 0x00, 0xf0]) - +genIFRwDataCode(0, 0x7c, True, 2, [0x10, 0x80]) - +genIFRwDataCode(4, 0x7c, True, 2, [0x10, 0x80]) - - +genMessageCode("--配置主从站") - +genIFRwDataCode(0, 0x00, True, 1, [0x01, ]) - +genIFRwDataCode(4, 0x00, True, 1, [0x02, ]) - - +genIFRwDataCode(0, 0x4a, False, 2) - +genIFRwDataCode(1, 0x4a, False, 2) - +genIFRwDataCode(2, 0x4a, False, 2) - +genIFRwDataCode(3, 0x4a, False, 2) - +genIFRwDataCode(4, 0x4a, False, 2) - - +genIFRwDataCode(0, 0x4a, True, 2, [0, 0x58]) - +genIFRwDataCode(1, 0x4a, True, 2, [0, 0x58]) - +genIFRwDataCode(2, 0x4a, True, 2, [0, 0x58]) - +genIFRwDataCode(3, 0x4a, True, 2, [0, 0x58]) - +genIFRwDataCode(4, 0x4a, True, 2, [0, 0x58]) - - +genIFRwDataCode(0, 0, False, 1) - +genIFRwDataCode(1, 0, False, 1) - +genIFRwDataCode(2, 0, False, 1) - +genIFRwDataCode(3, 0, False, 1) - +genIFRwDataCode(4, 0, False, 1) - - #+genTcEndFrameCode(gen_file_def) - ) - genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1, True, gen_file_def_ap) - - genPkt.clean() - genPkt.setPktType(1) - - gen_file_def_ap = gen_file_def + "_rw05" - sm_idx = 0 - genPkt.addAfterExc(genWriteTransLenCode(gen_file_def_ap, sm_idx, dev_idx=0) - +genWriteTransPktCode(gen_file_def_ap, sm_idx, dev_idx=0) - +genTrgTransPktCode(gen_file_def_ap, sm_idx, dev_idx=0) - +genReadAckPktCode(gen_file_def_ap, sm_idx, dev_idx=0) - - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - - +genMessageCode("--清除中断") - +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - - #+genTcEndFrameCode(gen_file_def) - ) - genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1, True, gen_file_def_ap) - - genPkt.clean() - genPkt.setPktType(0) - - - data = [0x3f, 0xff] - genPkt.addSubPkt(0x0, 0, 0x0, 0xb, 2, data) - - gen_file_def_ap = gen_file_def + "_rw06" - sm_idx = 0 - genPkt.addAfterExc(genWriteTransLenCode(gen_file_def_ap, sm_idx, dev_idx=0) - +genWriteTransPktCode(gen_file_def_ap, sm_idx, dev_idx=0) - +genTrgTransPktCode(gen_file_def_ap, sm_idx, dev_idx=0) - +genReadAckPktCode(gen_file_def_ap, sm_idx, dev_idx=0) - - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - - +genMessageCode("--清除中断") - +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - - +genTcEndFrameCode(gen_file_def) - ) - genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1, True, gen_file_def_ap) - - return gen_file_def - -def tc29(): - genPkt = GenPkt() - - - gen_file_def = "base_tc29" - sm_idx = 0 - tc_des = ("读,单次通讯2048个字节。每个子包包含数据128个字节,最多15个子包。 \\n" - +"(128 + 8) * 15 + 4(HEAD) + 4(CRC) = 2048\\n" - +"可以通过屏蔽子包的方式,增大或者缩小发送的数据量。最大的数据量不超过2048个字节。" - ) - - #------------------------------------------------------------------------- - #>>>>>>普通数据包 sm2,广播读 - genPkt.clean() - genPkt.setPktType(0) - - #subPkt参数:索引、索引类型、地址、命令、长度、数据 - genPkt.addSubPkt(0x01, 0, 0x180, 0x0, 128, None) - genPkt.addSubPkt(0x02, 0, 0x180, 0x0, 128, None) - genPkt.addSubPkt(0x03, 0, 0x180, 0x0, 128, None) - genPkt.addSubPkt(0x04, 0, 0x180, 0x0, 128, None) - - genPkt.addSubPkt(0x01, 0, 0x180, 0x0, 128, None) - genPkt.addSubPkt(0x02, 0, 0x180, 0x0, 128, None) - genPkt.addSubPkt(0x03, 0, 0x180, 0x0, 128, None) - genPkt.addSubPkt(0x04, 0, 0x180, 0x0, 128, None) - - genPkt.addSubPkt(0x01, 0, 0x180, 0x0, 128, None) - genPkt.addSubPkt(0x02, 0, 0x180, 0x0, 128, None) - genPkt.addSubPkt(0x03, 0, 0x180, 0x0, 128, None) - genPkt.addSubPkt(0x04, 0, 0x180, 0x0, 128, None) - - genPkt.addSubPkt(0x01, 0, 0x180, 0x0, 128, None) - genPkt.addSubPkt(0x02, 0, 0x180, 0x0, 128, None) - genPkt.addSubPkt(0x03, 0, 0x180, 0x0, 128, None) - - sm_idx = 2 - - genPkt.addBeforeExc(genTcStartFrameCode(gen_file_def, tc_des) - +genMessageCode("--清除中断") - +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - - +genIFRwDataCode(1, 0x180, True, 128, list(range(128))) - +genIFRwDataCode(2, 0x180, True, 128, list(range(4, 128 + 4))) - +genIFRwDataCode(3, 0x180, True, 128, list(range(8, 128 + 8))) - +genIFRwDataCode(4, 0x180, True, 128, list(range(16, 128 + 16))) - ) - - genPkt.addAfterExc(genWriteTransLenCode(gen_file_def, sm_idx) - +genWriteTransPktCode(gen_file_def, sm_idx) - +genTrgTransPktCode(gen_file_def, sm_idx) - +genReadAckPktCode(gen_file_def, sm_idx) - - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - - +genMessageCode("--清除中断") - +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - - +genTcEndFrameCode(gen_file_def)) - genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1) - - return gen_file_def - - -def tc30(): - genPkt = GenPkt() - - - gen_file_def = "base_tc30" - sm_idx = 0 - tc_des = ("写,单次通讯2048个字节。每个子包包含数据502个字节,最多4个子包。 \\n" - +"(502 + 8) * 4 + 4(HEAD) + 4(CRC) = 2048\\n" - +"可以通过屏蔽子包的方式,增大或者缩小发送的数据量。最大的数据量不超过2048个字节。" - ) - - #------------------------------------------------------------------------- - #>>>>>>普通数据包 sm2,广播读 - genPkt.clean() - genPkt.setPktType(0) - data_len = 502 - data_len_wr = [(data_len & 0xff), ((data_len >> 8) & 0xff)] - #genPkt.addSubPkt(0x00, 0, 0x302, 0xe, 2, data_len_wr) #500 - #subPkt参数:索引、索引类型、地址、命令、长度、数据 - genPkt.addSubPkt(0x01, 0, 0x800, 0x1, data_len, list(range(256)) + list(range(256))) - genPkt.addSubPkt(0x02, 0, 0x800, 0x1, data_len, list(range(256)) + list(range(256))) - genPkt.addSubPkt(0x03, 0, 0x800, 0x1, data_len, list(range(256)) + list(range(256))) - genPkt.addSubPkt(0x04, 0, 0x800, 0x1, data_len, list(range(256)) + list(range(256))) - - sm_idx = 2 - - - genPkt.addBeforeExc(genTcStartFrameCode(gen_file_def, tc_des) - +genMessageCode("--清除中断") - +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(1, 0x0302, True, 2, data_len_wr) - +genIFRwDataCode(2, 0x0302, True, 2, data_len_wr) - +genIFRwDataCode(3, 0x0302, True, 2, data_len_wr) - +genIFRwDataCode(4, 0x0302, True, 2, data_len_wr) - ) - - genPkt.addAfterExc(genWriteTransLenCode(gen_file_def, sm_idx) - +genWriteTransPktCode(gen_file_def, sm_idx) - +genTrgTransPktCode(gen_file_def, sm_idx) - +genReadAckPktCode(gen_file_def, sm_idx) - - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - - +genMessageCode("--清除中断") - +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - - +genMessageCode("--读取数据") - +genIFRwDataCode(1, 0x800, False, data_len) - +genIFRwDataCode(2, 0x800, False, data_len) - +genIFRwDataCode(3, 0x800, False, data_len) - +genIFRwDataCode(4, 0x800, False, data_len) - - +genTcEndFrameCode(gen_file_def)) - genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1) - - return gen_file_def - -def tc31(): - genPkt = GenPkt() - - gen_file_def = "base_tc31" - sm_idx = 0 - tc_des = "测试主站之间的同步,利用latch信号进行主站间的同步。\\n" - - genPkt.clean() - genPkt.setPktType(1) - - #subPkt参数:索引、索引类型、地址、命令、长度、数据 - #genPkt.addSubPkt(0x0, 0, 0x0, 0xc, 12, b'\0'*12) - - - genPkt.addBeforeExc(genTcStartFrameCode(gen_file_def, tc_des, "reg [63:0] latch_t1;\n reg [63:0] latch_t2;\n") - +genMessageCode("--清除中断") - +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genMessageCode("--复位4号设备") - +genIFRwDataCode(4, 0x40, True, 4, [0x01, 0x00, 0x66, 0x79]) - +"#5000" - #+genIFRwDataCode(4, 0x09, True, 1, [0, ], False, iface=1) - +using_proper_workmode(4) - +genIFRwDataCode(4, 0x0, True, 1, [1, ]) - +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - #+genEnableInsertTimeCode(0xa) - ) - - sm_idx = 0 - - genPkt.addAfterExc(genWriteTransLenCode(gen_file_def, sm_idx) - +genWriteTransPktCode(gen_file_def, sm_idx) - +genTrgTransPktCode(gen_file_def, sm_idx) - +genReadAckPktCode(gen_file_def, sm_idx) - +genMessageCode("--清除中断") - +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - ) - - genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1) - #------------------------------------------------------------------------- - genPkt.clean() - genPkt.setPktType(0) - - gen_file_def_ap = gen_file_def + "_rw01" - genPkt.addBeforeExc(genMessageCode("--读取事件寄存器组") - +genIFRwDataCode(0, 0x500, False, 0x48) - +genIFRwDataCode(1, 0x500, False, 0x48) - +genIFRwDataCode(2, 0x500, False, 0x48) - +genIFRwDataCode(3, 0x500, False, 0x48) - +genIFRwDataCode(4, 0x500, False, 0x48) - - +genMessageCode("--设置事件") - +genIFRwDataCode(0, 0x500, True, 4, [0x03, 0x00, 0x0F, 0x00] ) - +genIFRwDataCode(1, 0x500, True, 4, [0x0F, 0x00, 0x03, 0x00] ) - +genIFRwDataCode(2, 0x500, True, 4, [0x03, 0x00, 0x0F, 0x00] ) - +genIFRwDataCode(3, 0x500, True, 4, [0x0F, 0x00, 0x03, 0x00] ) - +genIFRwDataCode(4, 0x500, True, 4, [0x03, 0x00, 0x0F, 0x00] ) - - +genMessageCode("--读取事件寄存器组") - +genIFRwDataCode(0, 0x500, False, 0x48) - +genIFRwDataCode(1, 0x500, False, 0x48) - +genIFRwDataCode(2, 0x500, False, 0x48) - +genIFRwDataCode(3, 0x500, False, 0x48) - +genIFRwDataCode(4, 0x500, False, 0x48) - - +genIFRwDataCode(0, 0x148, True, 8, [0,] * 8) - +genIFRwDataCode(4, 0x148, True, 8, [0,] * 8) - ) - - genPkt.addAfterExc( "latch0 <= 1;\n" - +"latch1 <= 1;\n" - - +"#5000\n" - +"latch0 <= 0;\n" - +"latch1 <= 0;\n" - - +"#5000\n" - +"latch0 <= 1;\n" - +"latch1 <= 1;\n" - - +"#5000\n" - +"latch0 <= 0;\n" - +"latch1 <= 0;\n" - - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - - +genMessageCode("--清除中断") - +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - - +genMessageCode("--读取事件寄存器组") - +genIFRwDataCode(0, 0x500, False, 0x48) - +genIFRwDataCode(1, 0x500, False, 0x48) - +genIFRwDataCode(2, 0x500, False, 0x48) - +genIFRwDataCode(3, 0x500, False, 0x48) - +genIFRwDataCode(4, 0x500, False, 0x48) - - + '''spi_trans( (16'h0518), (`SPI_READ), (8), (`IF_IDX(0)));\n''' - #+ '''_temp_time = rxBuf[3] + (rxBuf[4] << 8) + (rxBuf[5] << 16) + (rxBuf[6] << 24) + (rxBuf[7] << 32) + (rxBuf[8] << 40) + (rxBuf[9] << 48) + (rxBuf[10] << 56);\n''' - + '''_temp_time = rxBuf[`ARRAY_IDX_OFF] + (rxBuf[`ARRAY_IDX_OFF+1] << 8) + (rxBuf[`ARRAY_IDX_OFF+2] << 16) + (rxBuf[`ARRAY_IDX_OFF+3] << 24) + (rxBuf[`ARRAY_IDX_OFF+4] << 32) + (rxBuf[`ARRAY_IDX_OFF+5] << 40) + (rxBuf[`ARRAY_IDX_OFF+6] << 48) + (rxBuf[`ARRAY_IDX_OFF+7] << 56);\n''' - + '''latch_t1 = _temp_time;\n\n''' - - + '''spi_trans( (16'h0518), (`SPI_READ), (8), (`IF_IDX(4)));\n''' - #+ '''_temp_time = rxBuf[3] + (rxBuf[4] << 8) + (rxBuf[5] << 16) + (rxBuf[6] << 24) + (rxBuf[7] << 32) + (rxBuf[8] << 40) + (rxBuf[9] << 48) + (rxBuf[10] << 56);\n''' - + '''_temp_time = rxBuf[`ARRAY_IDX_OFF] + (rxBuf[`ARRAY_IDX_OFF+1] << 8) + (rxBuf[`ARRAY_IDX_OFF+2] << 16) + (rxBuf[`ARRAY_IDX_OFF+3] << 24) + (rxBuf[`ARRAY_IDX_OFF+4] << 32) + (rxBuf[`ARRAY_IDX_OFF+5] << 40) + (rxBuf[`ARRAY_IDX_OFF+6] << 48) + (rxBuf[`ARRAY_IDX_OFF+7] << 56);\n''' - + '''latch_t2 = _temp_time;\n''' - + '''_temp_time = latch_t1 - latch_t2;\n\n''' - - + '''txBuf[`ARRAY_IDX_OFF] = _temp_time[7:0];\n''' - + '''txBuf[`ARRAY_IDX_OFF+1] = _temp_time[15:8];\n''' - + '''txBuf[`ARRAY_IDX_OFF+2] = _temp_time[23:16];\n''' - + '''txBuf[`ARRAY_IDX_OFF+3] = _temp_time[31:24];\n''' - + '''txBuf[`ARRAY_IDX_OFF+4] = _temp_time[39:32];\n''' - + '''txBuf[`ARRAY_IDX_OFF+5] = _temp_time[47:40];\n''' - + '''txBuf[`ARRAY_IDX_OFF+6] = _temp_time[55:48];\n''' - + '''txBuf[`ARRAY_IDX_OFF+7] = _temp_time[63:56];\n''' - + '''spi_trans( (16'h0148), (`SPI_WRITE), (8), (`IF_IDX(4)));\n''' - ) - - genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1, True, gen_file_def_ap) - - - #------------------------------------------------------------------------- - genPkt.clean() - genPkt.setPktType(0) - - gen_file_def_ap = gen_file_def + "_rw02" - genPkt.addBeforeExc(genMessageCode("--读取事件寄存器组") - +genIFRwDataCode(0, 0x500, False, 0x48) - +genIFRwDataCode(1, 0x500, False, 0x48) - +genIFRwDataCode(2, 0x500, False, 0x48) - +genIFRwDataCode(3, 0x500, False, 0x48) - +genIFRwDataCode(4, 0x500, False, 0x48) - - +genMessageCode("--设置事件") - +genIFRwDataCode(0, 0x500, True, 4, [0x03, 0x00, 0x0F, 0x00] ) - +genIFRwDataCode(1, 0x500, True, 4, [0x0F, 0x00, 0x03, 0x00] ) - +genIFRwDataCode(2, 0x500, True, 4, [0x03, 0x00, 0x0F, 0x00] ) - +genIFRwDataCode(3, 0x500, True, 4, [0x0F, 0x00, 0x03, 0x00] ) - +genIFRwDataCode(4, 0x500, True, 4, [0x03, 0x00, 0x0F, 0x00] ) - - +genMessageCode("--读取事件寄存器组") - +genIFRwDataCode(0, 0x500, False, 0x48) - +genIFRwDataCode(1, 0x500, False, 0x48) - +genIFRwDataCode(2, 0x500, False, 0x48) - +genIFRwDataCode(3, 0x500, False, 0x48) - +genIFRwDataCode(4, 0x500, False, 0x48) - ) - - genPkt.addAfterExc( "latch0 <= 1;\n" - +"latch1 <= 1;\n" - - +"#5000\n" - +"latch0 <= 0;\n" - +"latch1 <= 0;\n" - - +"#5000\n" - +"latch0 <= 1;\n" - +"latch1 <= 1;\n" - - +"#5000\n" - +"latch0 <= 0;\n" - +"latch1 <= 0;\n" - - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - - +genMessageCode("--清除中断") - +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - - +genMessageCode("--读取事件寄存器组") - +genIFRwDataCode(0, 0x500, False, 0x48) - +genIFRwDataCode(1, 0x500, False, 0x48) - +genIFRwDataCode(2, 0x500, False, 0x48) - +genIFRwDataCode(3, 0x500, False, 0x48) - +genIFRwDataCode(4, 0x500, False, 0x48) - ) - - genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1, True, gen_file_def_ap) - - #-------------------------------------------------------------------- - genPkt.clean() - genPkt.setPktType(0) - - gen_file_def_ap = gen_file_def + "_rw03" - genPkt.addBeforeExc(genMessageCode("--复位0号设备") - +"#100000\n" - +genIFRwDataCode(0, 0x40, True, 4, [0x01, 0x00, 0x66, 0x79]) - +"#5000\n" - #+genIFRwDataCode(0, 0x09, True, 1, [0, ], False, iface=1) - +using_proper_workmode(0) - +genIFRwDataCode(0, 0x0, True, 1, [1, ]) - +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(0, 0x7c, True, 2, [0x10, 0x80]) - +genIFRwDataCode(0, 0x70, True, 4, [0x03, 0x00, 0x00, 0xf0]) - - +genMessageCode("--读取事件寄存器组") - +genIFRwDataCode(0, 0x500, False, 0x48) - +genIFRwDataCode(1, 0x500, False, 0x48) - +genIFRwDataCode(2, 0x500, False, 0x48) - +genIFRwDataCode(3, 0x500, False, 0x48) - +genIFRwDataCode(4, 0x500, False, 0x48) - - +genMessageCode("--设置事件") - +genIFRwDataCode(0, 0x500, True, 4, [0x03, 0x00, 0x0F, 0x00] ) - +genIFRwDataCode(1, 0x500, True, 4, [0x0F, 0x00, 0x03, 0x00] ) - +genIFRwDataCode(2, 0x500, True, 4, [0x03, 0x00, 0x0F, 0x00] ) - +genIFRwDataCode(3, 0x500, True, 4, [0x0F, 0x00, 0x03, 0x00] ) - +genIFRwDataCode(4, 0x500, True, 4, [0x03, 0x00, 0x0F, 0x00] ) - - +genMessageCode("--读取事件寄存器组") - +genIFRwDataCode(0, 0x500, False, 0x48) - +genIFRwDataCode(1, 0x500, False, 0x48) - +genIFRwDataCode(2, 0x500, False, 0x48) - +genIFRwDataCode(3, 0x500, False, 0x48) - +genIFRwDataCode(4, 0x500, False, 0x48) - - +genIFRwDataCode(0, 0x148, True, 8, [0,] * 8) - +genIFRwDataCode(4, 0x148, True, 8, [0,] * 8) - ) - - genPkt.addAfterExc( "latch0 <= 1;\n" - +"latch1 <= 1;\n" - - +"#5000\n" - +"latch0 <= 0;\n" - +"latch1 <= 0;\n" - - +"#5000\n" - +"latch0 <= 1;\n" - +"latch1 <= 1;\n" - - +"#5000\n" - +"latch0 <= 0;\n" - +"latch1 <= 0;\n" - - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - - +genMessageCode("--清除中断") - +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - - +genMessageCode("--读取事件寄存器组") - +genIFRwDataCode(0, 0x500, False, 0x48) - +genIFRwDataCode(1, 0x500, False, 0x48) - +genIFRwDataCode(2, 0x500, False, 0x48) - +genIFRwDataCode(3, 0x500, False, 0x48) - +genIFRwDataCode(4, 0x500, False, 0x48) - - + '''spi_trans( (16'h0518), (`SPI_READ), (8), (`IF_IDX(0)));\n''' - #+ '''_temp_time = rxBuf[3] + (rxBuf[4] << 8) + (rxBuf[5] << 16) + (rxBuf[6] << 24) + (rxBuf[7] << 32) + (rxBuf[8] << 40) + (rxBuf[9] << 48) + (rxBuf[10] << 56);\n''' - + '''_temp_time = rxBuf[`ARRAY_IDX_OFF] + (rxBuf[`ARRAY_IDX_OFF+1] << 8) + (rxBuf[`ARRAY_IDX_OFF+2] << 16) + (rxBuf[`ARRAY_IDX_OFF+3] << 24) + (rxBuf[`ARRAY_IDX_OFF+4] << 32) + (rxBuf[`ARRAY_IDX_OFF+5] << 40) + (rxBuf[`ARRAY_IDX_OFF+6] << 48) + (rxBuf[`ARRAY_IDX_OFF+7] << 56);\n''' - + '''latch_t1 = _temp_time;\n\n''' - - + '''spi_trans( (16'h0518), (`SPI_READ), (8), (`IF_IDX(4)));\n''' - #+ '''_temp_time = rxBuf[3] + (rxBuf[4] << 8) + (rxBuf[5] << 16) + (rxBuf[6] << 24) + (rxBuf[7] << 32) + (rxBuf[8] << 40) + (rxBuf[9] << 48) + (rxBuf[10] << 56);\n''' - + '''_temp_time = rxBuf[`ARRAY_IDX_OFF] + (rxBuf[`ARRAY_IDX_OFF+1] << 8) + (rxBuf[`ARRAY_IDX_OFF+2] << 16) + (rxBuf[`ARRAY_IDX_OFF+3] << 24) + (rxBuf[`ARRAY_IDX_OFF+4] << 32) + (rxBuf[`ARRAY_IDX_OFF+5] << 40) + (rxBuf[`ARRAY_IDX_OFF+6] << 48) + (rxBuf[`ARRAY_IDX_OFF+7] << 56);\n''' - + '''latch_t2 = _temp_time;\n''' - + '''_temp_time = latch_t1 - latch_t2;\n\n''' - - + '''txBuf[`ARRAY_IDX_OFF] = _temp_time[7:0];\n''' - + '''txBuf[`ARRAY_IDX_OFF+1] = _temp_time[15:8];\n''' - + '''txBuf[`ARRAY_IDX_OFF+2] = _temp_time[23:16];\n''' - + '''txBuf[`ARRAY_IDX_OFF+3] = _temp_time[31:24];\n''' - + '''txBuf[`ARRAY_IDX_OFF+4] = _temp_time[39:32];\n''' - + '''txBuf[`ARRAY_IDX_OFF+5] = _temp_time[47:40];\n''' - + '''txBuf[`ARRAY_IDX_OFF+6] = _temp_time[55:48];\n''' - + '''txBuf[`ARRAY_IDX_OFF+7] = _temp_time[63:56];\n''' - + '''spi_trans( (16'h0148), (`SPI_WRITE), (8), (`IF_IDX(4)));\n''' - ) - - genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1, True, gen_file_def_ap) - - - #------------------------------------------------------------------------- - genPkt.clean() - genPkt.setPktType(0) - - gen_file_def_ap = gen_file_def + "_rw04" - genPkt.addBeforeExc(genMessageCode("--读取事件寄存器组") - +genIFRwDataCode(0, 0x500, False, 0x48) - +genIFRwDataCode(1, 0x500, False, 0x48) - +genIFRwDataCode(2, 0x500, False, 0x48) - +genIFRwDataCode(3, 0x500, False, 0x48) - +genIFRwDataCode(4, 0x500, False, 0x48) - - +genMessageCode("--设置事件") - +genIFRwDataCode(0, 0x500, True, 4, [0x03, 0x00, 0x0F, 0x00] ) - +genIFRwDataCode(1, 0x500, True, 4, [0x0F, 0x00, 0x03, 0x00] ) - +genIFRwDataCode(2, 0x500, True, 4, [0x03, 0x00, 0x0F, 0x00] ) - +genIFRwDataCode(3, 0x500, True, 4, [0x0F, 0x00, 0x03, 0x00] ) - +genIFRwDataCode(4, 0x500, True, 4, [0x03, 0x00, 0x0F, 0x00] ) - - +genMessageCode("--读取事件寄存器组") - +genIFRwDataCode(0, 0x500, False, 0x48) - +genIFRwDataCode(1, 0x500, False, 0x48) - +genIFRwDataCode(2, 0x500, False, 0x48) - +genIFRwDataCode(3, 0x500, False, 0x48) - +genIFRwDataCode(4, 0x500, False, 0x48) - ) - - genPkt.addAfterExc( "latch0 <= 1;\n" - +"latch1 <= 1;\n" - - +"#5000\n" - +"latch0 <= 0;\n" - +"latch1 <= 0;\n" - - +"#5000\n" - +"latch0 <= 1;\n" - +"latch1 <= 1;\n" - - +"#5000\n" - +"latch0 <= 0;\n" - +"latch1 <= 0;\n" - - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - - +genMessageCode("--清除中断") - +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - - +genMessageCode("--读取事件寄存器组") - +genIFRwDataCode(0, 0x500, False, 0x48) - +genIFRwDataCode(1, 0x500, False, 0x48) - +genIFRwDataCode(2, 0x500, False, 0x48) - +genIFRwDataCode(3, 0x500, False, 0x48) - +genIFRwDataCode(4, 0x500, False, 0x48) - ) - - genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1, True, gen_file_def_ap) - - - #-------------------------------------------------------------------- - #恢复系统 - genPkt.clean() - genPkt.setPktType(1) - gen_file_def_ap = gen_file_def+"_rw05" - sm_idx = 0 - - genPkt.addBeforeExc(genMessageCode("--恢复系统") - +genIFRwDataCode(4, 0x40, True, 4, [0x01, 0x00, 0x66, 0x79]) - +"#5000" - #+genIFRwDataCode(4, 0x09, True, 1, [0, ], False, iface=1) - +using_proper_workmode(4) - +genIFRwDataCode(4, 0x00, True, 1, [2, ]) - +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - ) - - genPkt.addAfterExc(genWriteTransLenCode(gen_file_def_ap, sm_idx) - +genWriteTransPktCode(gen_file_def_ap, sm_idx) - +genTrgTransPktCode(gen_file_def_ap, sm_idx) - +genReadAckPktCode(gen_file_def_ap, sm_idx) - - - +genMessageCode("--清除主中断") - +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - ) - genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1, True, gen_file_def_ap) - - genPkt.clean() - genPkt.setPktType(0) - gen_file_def_ap = gen_file_def+"_rw06" - sm_idx = 0 - - #genPkt.addBeforeExc(genMessageCode("--设置环境,进行第一次嗅探")) - - genPkt.addSubPkt(0x0, 0, 0x0, 0xb, 2, [0x3f, 0xff]) - - genPkt.addAfterExc(genWriteTransLenCode(gen_file_def_ap, sm_idx) - +genWriteTransPktCode(gen_file_def_ap, sm_idx) - +genTrgTransPktCode(gen_file_def_ap, sm_idx) - +genReadAckPktCode(gen_file_def_ap, sm_idx) - - - +genMessageCode("--清除主中断") - +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - ) - genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1, True, gen_file_def_ap) - - - genPkt.clean() - genPkt.setPktType(1) - gen_file_def_ap = gen_file_def+"_rw07" - sm_idx = 0 - - - genPkt.addAfterExc(genWriteTransLenCode(gen_file_def_ap, sm_idx) - +genWriteTransPktCode(gen_file_def_ap, sm_idx) - +genTrgTransPktCode(gen_file_def_ap, sm_idx) - +genReadAckPktCode(gen_file_def_ap, sm_idx) - - - +genMessageCode("--清除主中断") - +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genTcEndFrameCode(gen_file_def) - ) - genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1, True, gen_file_def_ap) - - return gen_file_def - +from pyutils import * +from .environment import * + +def tc1(): + genPkt = GenPkt() + + gen_file_def = "base_tc01" + sm_idx = 0 + tc_des = "发送一个包,多个子包,单播读,测试SM1发送数据。检查中断、检查SMx的状态。\\n" + + + #------------------------------------------------------------------------- + #>>>>>>普通数据包 sm1,2个读 + genPkt.clean() + genPkt.setPktType(0) + + #subPkt参数:索引、索引类型、地址、命令、长度、数据 + #genPkt.addSubPkt(0x02, 0, 0x0830, 0x2, 56, None) + genPkt.addSubPkt(0x01, 0, 0x00, 0x0, 64, None) + genPkt.addSubPkt(0x03, 0, 0xc0, 0x0, 64, None) + #genPkt.addSubPkt(10, 2, 0x300, 0x2, 4, None) + #genPkt.addSubPkt(11, 1, 0x300, 0x2, 4, None) + sm_idx = 1 + + genPkt.addBeforeExc(genTcStartFrameCode(gen_file_def, tc_des) + +genMessageCode("--清除中断") + +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + ) + + genPkt.addAfterExc(genWriteTransLenCode(gen_file_def, sm_idx) + +genWriteTransPktCode(gen_file_def, sm_idx) + +genTrgTransPktCode(gen_file_def, sm_idx) + +genReadAckPktCode(gen_file_def, sm_idx) + + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + + +genMessageCode("--清除中断") + +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + + +genTcEndFrameCode(gen_file_def)) + + genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1) + + return gen_file_def + + +def tc2(): + genPkt = GenPkt() + + + gen_file_def = "base_tc02" + sm_idx = 0 + tc_des = "广播读,一次性读取从0x0开始的128个字节的数据。读的时候,报文中的数据和对应的\\n"\ + + "寄存器数据位与后放入报文中。" + + #------------------------------------------------------------------------- + #>>>>>>普通数据包 sm2,广播读 + genPkt.clean() + genPkt.setPktType(0) + + #subPkt参数:索引、索引类型、地址、命令、长度、数据 + genPkt.addSubPkt(0x01, 0, 0x00, 0xd, 128, None) + + sm_idx = 2 + + genPkt.addBeforeExc(genTcStartFrameCode(gen_file_def, tc_des) + +genMessageCode("--清除中断") + +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + ) + + genPkt.addAfterExc(genWriteTransLenCode(gen_file_def, sm_idx) + +genWriteTransPktCode(gen_file_def, sm_idx) + +genTrgTransPktCode(gen_file_def, sm_idx) + +genReadAckPktCode(gen_file_def, sm_idx) + + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + + +genMessageCode("--清除中断") + +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + + +genTcEndFrameCode(gen_file_def)) + genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1) + + return gen_file_def + + + +def tc3(): + genPkt = GenPkt() + + gen_file_def = "base_tc03" + sm_idx = 0 + tc_des = "广播写,发送数据长度到每个设备中;然后再紧跟发送的数据。\\n" \ + + "所有从站接收到相同的数据。" + + #------------------------------------------------------------------------- + #>>>>>>交换数据 SMx, 两个广播写 + genPkt.clean() + genPkt.setPktType(0) + + #subPkt参数:索引、索引类型、地址、命令、长度、数据 + data = bytearray(b"\0" * 10) + data[0] = 16 + data[1] = 0 + genPkt.addSubPkt(1278, 0, 0x0302, 0xe, 2, data) + + data = bytearray(b"\0"*100) + for i in range(100): + data[i] = i + 1 + genPkt.addSubPkt(1188, 0, 0x0800, 0xe, 16, data) + + sm_idx = 3 + + genPkt.addBeforeExc(genTcStartFrameCode(gen_file_def, tc_des) + +genMessageCode("--清除中断") + +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + ) + + genPkt.addAfterExc(genWriteTransLenCode(gen_file_def, sm_idx) + +genWriteTransPktCode(gen_file_def, sm_idx) + +genTrgTransPktCode(gen_file_def, sm_idx) + +genReadAckPktCode(gen_file_def, sm_idx) + + +genMessageCode("--读取广播写入的数据") + +genSlvSMReadData(1, 0, 16) + +genSlvSMReadData(2, 0, 16) + +genSlvSMReadData(3, 0, 16) + +genSlvSMReadData(4, 0, 16) + + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + + +genMessageCode("--清除中断") + +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + + +genTcEndFrameCode(gen_file_def)) + + genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1) + + return gen_file_def + + +def tc4(): + genPkt = GenPkt() + + gen_file_def = "base_tc04" + sm_idx = 0 + tc_des = "发送带有超出系统顺序地址和顺序编号的子包,子包中有写入、有读取;没有处理的包\\n" \ + + "其工作计数应为0。" + #------------------------------------------------------------------------- + #>>>>>>普通数据包,一个读、一个写,增加5个随机包(需要在文件里确认) + genPkt.clean() + genPkt.setPktType(0) + + #subPkt参数:索引、索引类型、地址、命令、长度、数据 + genPkt.addSubPkt(0x01, 0, 0x0840, 0x1, 56, None) + genPkt.addSubPkt(0x03, 0, 0x1040, 0x0, 56, None) + for i in range(5): + genPkt.addSubPkt(3288+i, 0, + 0xDF00+i, 0x0, + 56, None) + + sm_idx = 0 + + genPkt.addBeforeExc(genTcStartFrameCode(gen_file_def, tc_des) + +genMessageCode("--清除中断") + +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + ) + + genPkt.addAfterExc(genWriteTransLenCode(gen_file_def, sm_idx) + +genWriteTransPktCode(gen_file_def, sm_idx) + +genTrgTransPktCode(gen_file_def, sm_idx) + +genReadAckPktCode(gen_file_def, sm_idx) + + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + + +genMessageCode("--清除中断") + +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + + + +genTcEndFrameCode(gen_file_def)) + + genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1) + + return gen_file_def + +def tc5(): + genPkt = GenPkt() + + gen_file_def = "base_tc05" + sm_idx = 0 + tc_des = "发送单播子包,向4个从设备分别写入数据。\\n" + + #------------------------------------------------------------------------- + #>>>>>>普通数据包0,用来操作sync + genPkt.clean() + genPkt.setPktType(0) + + sm_size = 64 + + data = bytearray(b"\0"*100) + data[0] = 0 #0x0300 + data[1] = 0 #0x0301 + data[2] = sm_size #0x302 长度1 + data[3] = 0 #0x303 长度2 + data[4] = 0 + data[5] = 0 + data[6] = sm_size + data[7] = 0 + data[8] = 0 + data[9] = 0 + data[10] = sm_size + data[11] = 0 + data[12] = 0 + data[13] = 0 + data[14] = sm_size + data[15] = 0 + + + #subPkt参数:索引、索引类型、地址、命令、长度、数据 + genPkt.addSubPkt(0x02, 0, 0x0300, 0x1, 4, data) #sm0 + genPkt.addSubPkt(0x01, 0, 0x0308, 0x1, 4, data) #sm2 + genPkt.addSubPkt(0x03, 0, 0x0310, 0x1, 4, data) #sm4 + genPkt.addSubPkt(0x04, 0, 0x0318, 0x1, 4, data) #sm6 + + + data = bytearray(b"\0"*100) + for i in range(sm_size): + data[i] = i + data[10] = ord('B') + data[11] = ord('A') + genPkt.addSubPkt(0x02, 0, 0x0800, 0x1, sm_size, data) + + data = bytearray(b"\0"*100) + for i in range(sm_size): + data[i] = i + data[11] = ord('B') + data[12] = ord('A') + genPkt.addSubPkt(0x01, 0, 0x1800, 0x1, sm_size, data) + + data = bytearray(b"\0"*100) + for i in range(sm_size): + data[i] = i + data[12] = ord('B') + data[13] = ord('A') + genPkt.addSubPkt(0x03, 0, 0x2800, 0x1, sm_size, data) + + data = bytearray(b"\0"*100) + for i in range(sm_size): + data[i] = i + data[13] = ord('B') + data[14] = ord('A') + genPkt.addSubPkt(0x04, 0, 0x3800, 0x1, sm_size, data) + + sm_idx = 0 + + genPkt.addBeforeExc(genTcStartFrameCode(gen_file_def, tc_des) + +genMessageCode("--清除中断") + +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + ) + + genPkt.addAfterExc(genWriteTransLenCode(gen_file_def, sm_idx) + +genWriteTransPktCode(gen_file_def, sm_idx) + +genTrgTransPktCode(gen_file_def, sm_idx) + +genReadAckPktCode(gen_file_def, sm_idx) + + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + + +genMessageCode("--清除中断") + +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + + +genSlvSMReadData(1, 2, sm_size) + +genSlvSMReadData(2, 0, sm_size) + +genSlvSMReadData(3, 4, sm_size) + +genSlvSMReadData(4, 6, sm_size) + + +genTcEndFrameCode(gen_file_def)) + + genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1) + return gen_file_def + + +def tc6(): + genPkt = GenPkt() + + gen_file_def = "base_tc06" + sm_idx = 0 + tc_des = "从4个从站中读取数据,并从对应的位置读取SM1中的数据长度。\\n" + + #------------------------------------------------------------------------- + #>>>>>>普通数据包2 + genPkt.clean() + genPkt.setPktType(0) + + genPkt.addBeforeExc(genTcStartFrameCode(gen_file_def, tc_des) + +genMessageCode("--清除中断") + +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + + genSlvSMWriteData(3, 1, 129) + + genSlvSMWriteData(4, 1, 140) + + genSlvSMWriteData(1, 1, 128) + + genSlvSMWriteData(2, 1, 152)) + + #subPkt参数:索引、索引类型、地址、命令、长度、数据 + genPkt.addSubPkt(3, 0, 0x1000, 0x0, 129, b"\0"*129) + genPkt.addSubPkt(4, 0, 0x1000, 0x0, 140, b"\0"*140) + genPkt.addSubPkt(1, 0, 0x1000, 0x0, 128, b"\0"*128) + genPkt.addSubPkt(2, 0, 0x1000, 0x0, 152, b"\0"*152) + genPkt.addSubPkt(1, 0, 0x0306, 0x0, 2, b"\0"*2) + genPkt.addSubPkt(2, 0, 0x0306, 0x0, 2, b"\0"*2) + genPkt.addSubPkt(3, 0, 0x0306, 0x0, 2, b"\0"*2) + genPkt.addSubPkt(4, 0, 0x0306, 0x0, 2, b"\0"*2) + + sm_idx = 0 + + genPkt.addAfterExc(genWriteTransLenCode(gen_file_def, sm_idx) + +genWriteTransPktCode(gen_file_def, sm_idx) + +genTrgTransPktCode(gen_file_def, sm_idx) + +genReadAckPktCode(gen_file_def, sm_idx) + + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + + +genMessageCode("--清除中断") + +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + + +genTcEndFrameCode(gen_file_def)) + + genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1) + + return gen_file_def + + + +def tc7(): + genPkt = GenPkt() + + gen_file_def = "base_tc07" + sm_idx = 0 + tc_des = "读写命令,写入0x100开始的32B寄存器,这32B寄存器实际上是只读寄存器。\\n" \ + + "检查是否真的写入,读取的值,子报文的状态。由于读写的寄存器是同步寄存器组,\\n"\ + + "数据每次可能因为运行时间的差别,存在差异,需要手工检查。" + + #------------------------------------------------------------------------- + #>>>>>>普通数据包3 + genPkt.clean() + genPkt.setPktType(0) + + #subPkt参数:索引、索引类型、地址、命令、长度、数据 + genPkt.addSubPkt(3, 0, 0x0100, 0x2, 32, b"\0"*129) + genPkt.addSubPkt(4, 0, 0x0100, 0x2, 32, b"\0"*140) + genPkt.addSubPkt(1, 0, 0x0100, 0x2, 32, b"\0"*128) + genPkt.addSubPkt(2, 0, 0x0100, 0x2, 32, b"\0"*152) + + genPkt.addSubPkt(2, 0, 0x0120, 0x2, 2, b"\x05"*32) + + sm_idx = 0 + + genPkt.addBeforeExc(genTcStartFrameCode(gen_file_def, tc_des) + +genMessageCode("--清除中断") + +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + ) + + genPkt.addAfterExc(genWriteTransLenCode(gen_file_def, sm_idx) + +genWriteTransPktCode(gen_file_def, sm_idx) + +genTrgTransPktCode(gen_file_def, sm_idx) + +genReadAckPktCode(gen_file_def, sm_idx) + + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + + +genMessageCode("--清除中断") + +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + + +genTcEndFrameCode(gen_file_def)) + + genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1) + + return gen_file_def + +def tc8(): + genPkt = GenPkt() + + gen_file_def = "base_tc08" + sm_idx = 0 + tc_des = "测试RESET,仅复位主站和2号设备;链路和网络被破坏;发送广播包只能到1,2;3,4收不到。\\n" \ + + "复位后,必须清除中断才能正常工作。通过嗅探包、设置顺序地址命令等重新建立网络。" + + #>>>>>>设置顺序地址 + genPkt.clean() + genPkt.setPktType(0) + + main_dev = [0x01, ] + slave_dev = [0x02, ] + + genPkt.addBeforeExc(genTcStartFrameCode(gen_file_def, tc_des) + +genIFRwDataCode(0, 0x78, False, 4) + + +genIFRwDataCode(0, 0x40, True, 4, [0x01, 0x00, 0x66, 0x79]) + +genIFRwDataCode(2, 0x40, True, 4, [0x01, 0x00, 0x66, 0x79]) + + +"\n#5000\n" + #+genIFRwDataCode(0, 0x09, True, 1, [0, ], False, iface=1) + #+genIFRwDataCode(2, 0x09, True, 1, [0, ], False, iface=1) + +using_proper_workmode(0) + +using_proper_workmode(2) + + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + + +genMessageCode("--设置中断为脉冲模式") + +genIFRwDataCode(0, 0x7c, True, 2, [0x00, 0x81]) + +genIFRwDataCode(2, 0x7c, True, 2, [0x00, 0x81]) + + +genMessageCode("--使能中断") + +genIFRwDataCode(0, 0x70, True, 4, [0x03, 0x00, 0x00, 0xf0]) + +genIFRwDataCode(2, 0x70, True, 4, [0x00, 0x00, 0x00, 0xf0]) + + +genMessageCode("--读取中断使能") + +genIFRwDataCode(0, 0x70, False, 4) + +genIFRwDataCode(2, 0x70, False, 4) + + +genMessageCode("--配置主从站") + +genIFRwDataCode(0, 0x00, True, 1, main_dev) + +genIFRwDataCode(2, 0x00, True, 1, slave_dev) + + +genMessageCode("--清除中断") + +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + ) + + + data = [0,] * 128 + + + #subPkt参数:索引、索引类型、地址、命令、长度、数据 + genPkt.addSubPkt(0x0, 0, 0x0, 0xd, 128, data) + + + sm_idx = 0 + + + genPkt.addAfterExc(genWriteTransLenCode(gen_file_def, sm_idx) + +genWriteTransPktCode(gen_file_def, sm_idx) + +genTrgTransPktCode(gen_file_def, sm_idx) + +genReadAckPktCode(gen_file_def, sm_idx) + + +genMessageCode("--清除中断") + +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + + +genMessageCode("--配置中断模式") + +genIFRwDataCode(0, 0x7c, True, 2, [0x00, 0x81]) + +genIFRwDataCode(2, 0x7c, True, 2, [0x00, 0x81]) + ) + genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1) + + #------------------------------------------------------------------------------ + genPkt.clean() + genPkt.setPktType(1) + + genPkt.addBeforeExc(genIFRwDataCode(1, 0xc0, False, 4) + +genIFRwDataCode(2, 0xc0, False, 4) + +genIFRwDataCode(3, 0xc0, False, 4) + +genIFRwDataCode(4, 0xc0, False, 4) + ) + + gen_file_def_ap = gen_file_def + "_rw01" + sm_idx = 0 + + genPkt.addAfterExc(genWriteTransLenCode(gen_file_def_ap, sm_idx) + +genWriteTransPktCode(gen_file_def_ap, sm_idx) + +genTrgTransPktCode(gen_file_def_ap, sm_idx) + +genReadAckPktCode(gen_file_def_ap, sm_idx) + #+genTcEndFrameCode(gen_file_def) + +genIFRwDataCode(1, 0xc0, False, 4) + +genIFRwDataCode(2, 0xc0, False, 4) + +genIFRwDataCode(3, 0xc0, False, 4) + +genIFRwDataCode(4, 0xc0, False, 4) + + +genMessageCode("--清除中断") + +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + ) + + genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1, True, gen_file_def_ap) + + #------------------------------------------------------------------------------ + genPkt.clean() + genPkt.setPktType(0) + + gen_file_def_ap = gen_file_def + "_rw02" + sm_idx = 0 + + data = [0x3f, 0xff] + genPkt.addSubPkt(0x0, 0, 0x0, 0xb, 2, data) + + genPkt.addAfterExc(genWriteTransLenCode(gen_file_def_ap, sm_idx) + +genWriteTransPktCode(gen_file_def_ap, sm_idx) + +genTrgTransPktCode(gen_file_def_ap, sm_idx) + +genReadAckPktCode(gen_file_def_ap, sm_idx) + + +genMessageCode("--清除中断") + +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + ) + + genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1, True, gen_file_def_ap) + + + #------------------------------------------------------------------------------ + genPkt.clean() + genPkt.setPktType(1) + + genPkt.addBeforeExc(genIFRwDataCode(1, 0xc0, False, 4) + +genIFRwDataCode(2, 0xc0, False, 4) + +genIFRwDataCode(3, 0xc0, False, 4) + +genIFRwDataCode(4, 0xc0, False, 4) + ) + + gen_file_def_ap = gen_file_def + "_rw03" + sm_idx = 0 + + genPkt.addAfterExc(genWriteTransLenCode(gen_file_def_ap, sm_idx) + +genWriteTransPktCode(gen_file_def_ap, sm_idx) + +genTrgTransPktCode(gen_file_def_ap, sm_idx) + +genReadAckPktCode(gen_file_def_ap, sm_idx) + +genIFRwDataCode(1, 0xc0, False, 4) + +genIFRwDataCode(2, 0xc0, False, 4) + +genIFRwDataCode(3, 0xc0, False, 4) + +genIFRwDataCode(4, 0xc0, False, 4) + + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + + +genMessageCode("--清除中断") + +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + + +genTcEndFrameCode(gen_file_def) + ) + + genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1, True, gen_file_def_ap) + + + return gen_file_def + + +def tc9(): + genPkt = GenPkt() + + gen_file_def = "base_tc09" + sm_idx = 0 + tc_des = ("发送超过带有64个子包的读。检查子包的状态、中断、统计等信息。\\n" + "由于读取了0x100同步寄存器组;0x200 eb-mmu寄存器组;0x0300数据缓冲区寄存器组;\\n" + "这些寄存器值和时间相关,不提供对比结果,需要手工检查。" + ) + + #------------------------------------------------------------------------- + #>>>>>>设置顺序地址 + genPkt.clean() + genPkt.setPktType(0) + + data = [0, ] * 32 + #subPkt参数:索引、索引类型、地址、命令、长度、数据 + genPkt.addSubPkt(0x1, 0, 0x0000, 0x0, 4, data) + genPkt.addSubPkt(0x1, 0, 0x0100, 0x0, 8, data) + genPkt.addSubPkt(0x1, 0, 0x0200, 0x0, 16, data) + genPkt.addSubPkt(0x1, 0, 0x0300, 0x0, 4, data) + + genPkt.addSubPkt(0x2, 0, 0x0000, 0x0, 4, data) + genPkt.addSubPkt(0x2, 0, 0x0100, 0x0, 8, data) + genPkt.addSubPkt(0x2, 0, 0x0200, 0x0, 16, data) + genPkt.addSubPkt(0x2, 0, 0x0300, 0x0, 4, data) + + genPkt.addSubPkt(0x3, 0, 0x0000, 0x0, 4, data) + genPkt.addSubPkt(0x3, 0, 0x0100, 0x0, 8, data) + genPkt.addSubPkt(0x3, 0, 0x0200, 0x0, 16, data) + genPkt.addSubPkt(0x3, 0, 0x0300, 0x0, 4, data) + + genPkt.addSubPkt(0x4, 0, 0x0000, 0x0, 4, data) + genPkt.addSubPkt(0x4, 0, 0x0100, 0x0, 8, data) + genPkt.addSubPkt(0x4, 0, 0x0200, 0x0, 16, data) + genPkt.addSubPkt(0x4, 0, 0x0300, 0x0, 4, data) + + genPkt.addSubPkt(0x5, 0, 0x0000, 0x0, 4, data) + genPkt.addSubPkt(0x5, 0, 0x0100, 0x0, 8, data) + genPkt.addSubPkt(0x5, 0, 0x0200, 0x0, 16, data) + genPkt.addSubPkt(0x5, 0, 0x0300, 0x0, 4, data) + + genPkt.addSubPkt(0x6, 0, 0x0000, 0x0, 4, data) + genPkt.addSubPkt(0x6, 0, 0x0100, 0x0, 8, data) + genPkt.addSubPkt(0x6, 0, 0x0200, 0x0, 16, data) + genPkt.addSubPkt(0x6, 0, 0x0300, 0x0, 4, data) + + genPkt.addSubPkt(0x3, 0, 0x0000, 0x0, 4, data) + genPkt.addSubPkt(0x3, 0, 0x0100, 0x0, 8, data) + genPkt.addSubPkt(0x3, 0, 0x0200, 0x0, 16, data) + genPkt.addSubPkt(0x3, 0, 0x0300, 0x0, 4, data) + + genPkt.addSubPkt(0x4, 0, 0x0000, 0x0, 4, data) + genPkt.addSubPkt(0x4, 0, 0x0100, 0x0, 8, data) + genPkt.addSubPkt(0x4, 0, 0x0200, 0x0, 16, data) + genPkt.addSubPkt(0x4, 0, 0x0300, 0x0, 4, data) + + genPkt.addSubPkt(0x1, 0, 0x0000, 0x0, 4, data) + genPkt.addSubPkt(0x1, 0, 0x0100, 0x0, 8, data) + genPkt.addSubPkt(0x1, 0, 0x0200, 0x0, 16, data) + genPkt.addSubPkt(0x1, 0, 0x0300, 0x0, 4, data) + + genPkt.addSubPkt(0x2, 0, 0x0000, 0x0, 4, data) + genPkt.addSubPkt(0x2, 0, 0x0100, 0x0, 8, data) + genPkt.addSubPkt(0x2, 0, 0x0200, 0x0, 16, data) + genPkt.addSubPkt(0x2, 0, 0x0300, 0x0, 4, data) + + genPkt.addSubPkt(0x3, 0, 0x0000, 0x0, 4, data) + genPkt.addSubPkt(0x3, 0, 0x0100, 0x0, 8, data) + genPkt.addSubPkt(0x3, 0, 0x0200, 0x0, 16, data) + genPkt.addSubPkt(0x3, 0, 0x0300, 0x0, 4, data) + + genPkt.addSubPkt(0x4, 0, 0x0000, 0x0, 4, data) + genPkt.addSubPkt(0x4, 0, 0x0100, 0x0, 8, data) + genPkt.addSubPkt(0x4, 0, 0x0200, 0x0, 16, data) + genPkt.addSubPkt(0x4, 0, 0x0300, 0x0, 4, data) + + genPkt.addSubPkt(0x1, 0, 0x0000, 0x0, 4, data) + genPkt.addSubPkt(0x1, 0, 0x0100, 0x0, 8, data) + genPkt.addSubPkt(0x1, 0, 0x0200, 0x0, 16, data) + genPkt.addSubPkt(0x1, 0, 0x0300, 0x0, 4, data) + + genPkt.addSubPkt(0x2, 0, 0x0000, 0x0, 4, data) + genPkt.addSubPkt(0x2, 0, 0x0100, 0x0, 8, data) + genPkt.addSubPkt(0x2, 0, 0x0200, 0x0, 16, data) + genPkt.addSubPkt(0x2, 0, 0x0300, 0x0, 4, data) + + genPkt.addSubPkt(0x3, 0, 0x0000, 0x0, 4, data) + genPkt.addSubPkt(0x3, 0, 0x0100, 0x0, 8, data) + genPkt.addSubPkt(0x3, 0, 0x0200, 0x0, 16, data) + genPkt.addSubPkt(0x3, 0, 0x0300, 0x0, 4, data) + + genPkt.addSubPkt(0x4, 0, 0x0000, 0x0, 4, data) + genPkt.addSubPkt(0x4, 0, 0x0100, 0x0, 8, data) + genPkt.addSubPkt(0x4, 0, 0x0200, 0x0, 16, data) + genPkt.addSubPkt(0x4, 0, 0x0300, 0x0, 4, data) + + data = [0, ] * 128 + genPkt.addSubPkt(0x1, 0, 0x0180, 0x0, 128, data) + genPkt.addSubPkt(0x2, 0, 0x0180, 0x0, 128, data) + genPkt.addSubPkt(0x3, 0, 0x0180, 0x0, 128, data) + genPkt.addSubPkt(0x4, 0, 0x0180, 0x0, 128, data) + + sm_idx = 0 + + custom_data1 = list(range(1, 129)) + custom_data2 = list(range(1*2, 129*2, 2)) + custom_data3 = list(range(1*3, 129*3, 3)) + custom_data4 = list(range(1*4, 129*4, 4)) + genPkt.addBeforeExc(genTcStartFrameCode(gen_file_def, tc_des) + +genMessageCode("--清除中断") + +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(1, 0x180, True, 128, custom_data1) + +genIFRwDataCode(2, 0x180, True, 128, custom_data2) + +genIFRwDataCode(3, 0x180, True, 128, custom_data3) + +genIFRwDataCode(4, 0x180, True, 128, custom_data4) + ) + + genPkt.addAfterExc(genWriteTransLenCode(gen_file_def, sm_idx) + +genWriteTransPktCode(gen_file_def, sm_idx) + +genTrgTransPktCode(gen_file_def, sm_idx) + +genReadAckPktCode(gen_file_def, sm_idx) + + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + + +genMessageCode("--清除中断") + +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + + +genTcEndFrameCode(gen_file_def)) + + genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1) + + return gen_file_def + +def tc10(): + genPkt = GenPkt() + + gen_file_def = "base_tc10" + sm_idx = 0 + tc_des = ("发送超过带有64个子包的写。检查子包的状态、中断、统计等信息。\\n" + "由于访问了统计寄存器,需要手动确认这些寄存器。" + ) + + #------------------------------------------------------------------------- + #>>>>>>设置顺序地址 + genPkt.clean() + genPkt.setPktType(0) + + for i in range(1, 5): + data = [0, ] * 32 + genPkt.addSubPkt(i, 0, 0x0302, 1, 2, [0x40, 0x00]) + genPkt.addSubPkt(i, 0, 0x0800, 1, 4, [i + 1, 2, 3, 4]) + genPkt.addSubPkt(i, 0, 0x0804, 1, 4, [5, 6, 7, 8]) + genPkt.addSubPkt(i, 0, 0x0808, 1, 4, [9, 10, 11, 12]) + genPkt.addSubPkt(i, 0, 0x080c, 1, 4, [13, 14, 15, 16]) + genPkt.addSubPkt(i, 0, 0x0810, 1, 4, [17, 18, 19, 20]) + genPkt.addSubPkt(i, 0, 0x0814, 1, 4, [21, 22, 23, 24]) + genPkt.addSubPkt(i, 0, 0x0818, 1, 4, [25, 26, 27, 28]) + genPkt.addSubPkt(i, 0, 0x081c, 1, 4, [29, 30, 31, 32]) + genPkt.addSubPkt(i, 0, 0x0820, 1, 4, [1, 2, 3, 4]) + genPkt.addSubPkt(i, 0, 0x0824, 1, 4, [5, 6, 7, 8]) + genPkt.addSubPkt(i, 0, 0x0828, 1, 4, [9, 10, 11, 12]) + genPkt.addSubPkt(i, 0, 0x082c, 1, 4, [13, 14, 15, 16]) + genPkt.addSubPkt(i, 0, 0x0830, 1, 4, [17, 18, 19, 20]) + genPkt.addSubPkt(i, 0, 0x0834, 1, 4, [21, 22, 23, 24]) + genPkt.addSubPkt(i, 0, 0x0838, 1, 4, [25, 26, 27, 28]) + genPkt.addSubPkt(i, 0, 0x083c, 1, 4, [29, 30, 31, 32]) + + genPkt.addBeforeExc(genTcStartFrameCode(gen_file_def, tc_des) + +genMessageCode("--清除中断") + +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + ) + + genPkt.addAfterExc(genWriteTransLenCode(gen_file_def, sm_idx) + +genWriteTransPktCode(gen_file_def, sm_idx) + +genTrgTransPktCode(gen_file_def, sm_idx) + +genReadAckPktCode(gen_file_def, sm_idx) + + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + + +genMessageCode("--清除中断") + +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + + +genSlvSMReadData(1, 0, 0x40) + +genSlvSMReadData(2, 0, 0x40) + +genSlvSMReadData(3, 0, 0x40) + +genSlvSMReadData(4, 0, 0x40) + + +genIFRwDataCode(0, 0x80, False, 24) + +genIFRwDataCode(0, 0xa0, False, 24) + +genIFRwDataCode(1, 0x80, False, 24) + +genIFRwDataCode(1, 0xa0, False, 24) + +genIFRwDataCode(2, 0x80, False, 24) + +genIFRwDataCode(3, 0x80, False, 24) + +genIFRwDataCode(4, 0x80, False, 24) + + +genTcEndFrameCode(gen_file_def) + ) + + genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1) + + return gen_file_def + +def tc11(): + genPkt = GenPkt() + + gen_file_def = "base_tc11" + sm_idx = 0 + tc_des = "清除统计信息,从SPI侧清0,清0是失败的。因为统计寄存器对于SPI侧来说是只读寄存器。\\n" + + #------------------------------------------------------------------------- + #>>>>>>设置顺序地址 + genPkt.clean() + genPkt.setPktType(0) + op_size = 24 + + + data = [0, ] * op_size + genPkt.addBeforeExc(genTcStartFrameCode(gen_file_def, tc_des) + +genIFRwDataCode(0, 0x80, True, op_size, data) + +genIFRwDataCode(1, 0x80, True, op_size, data) + +genIFRwDataCode(2, 0x80, True, op_size, data) + +genIFRwDataCode(3, 0x80, True, op_size, data) + +genIFRwDataCode(4, 0x80, True, op_size, data) + ) + + genPkt.addAfterExc( genIFRwDataCode(0, 0x80, False, op_size) + +genIFRwDataCode(1, 0x80, False, op_size) + +genIFRwDataCode(2, 0x80, False, op_size) + +genIFRwDataCode(3, 0x80, False, op_size) + +genIFRwDataCode(4, 0x80, False, op_size) + + +genTcEndFrameCode(gen_file_def) + ) + + genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1) + + return gen_file_def + + +def tc12(): + genPkt = GenPkt() + + gen_file_def = "base_tc12" + sm_idx = 0 + tc_des = "清除统计信息,从LVDS侧清0,清0是成功的。\\n" + + #------------------------------------------------------------------------- + #>>>>>>设置顺序地址 + genPkt.clean() + genPkt.setPktType(0) + op_size = 24 + + + data = [0, ] * op_size + genPkt.addBeforeExc(genTcStartFrameCode(gen_file_def, tc_des) + +genMessageCode("--清除中断") + +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + ) + + genPkt.addSubPkt(0, 0, 0x80, 0xe, op_size, data) + + genPkt.addAfterExc(genWriteTransLenCode(gen_file_def, sm_idx) + +genWriteTransPktCode(gen_file_def, sm_idx) + +genTrgTransPktCode(gen_file_def, sm_idx) + +genReadAckPktCode(gen_file_def, sm_idx) + + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + + +genMessageCode("--清除中断") + +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + + +genIFRwDataCode(0, 0x80, False, op_size) + +genIFRwDataCode(1, 0x80, False, op_size) + +genIFRwDataCode(2, 0x80, False, op_size) + +genIFRwDataCode(3, 0x80, False, op_size) + +genIFRwDataCode(4, 0x80, False, op_size) + + +genTcEndFrameCode(gen_file_def) + ) + + genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1) + + return gen_file_def + + + +def tc13(): + genPkt = GenPkt() + + gen_file_def = "base_tc13" + sm_idx = 0 + tc_des = "测试事件寄存器组。先要同步一下时间,然后测试Latch0、Latch1的锁定。\\n"\ + + "间隔5000ns,以仿真周期算,大概是31~32个clock。需要检查波形文件。\\n"\ + + "latch0、latch1每个设备设置不一样,交替设置,相互印证。" + + + + genPkt.clean() + genPkt.setPktType(0) + + #subPkt参数:索引、索引类型、地址、命令、长度、数据 + genPkt.addSubPkt(0x0, 0, 0x0, 0xc, 12, b'\0'*12) + + + genPkt.addBeforeExc(genTcStartFrameCode(gen_file_def, tc_des) + +genMessageCode("--清除中断") + +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genEnableInsertTimeCode(0xa)) + + sm_idx = 0 + + genPkt.addAfterExc(genWriteTransLenCode(gen_file_def, sm_idx) + +genWriteTransPktCode(gen_file_def, sm_idx) + +genTrgTransPktCode(gen_file_def, sm_idx) + +genReadAckPktCode(gen_file_def, sm_idx) + +genMessageCode("--清除中断") + +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genCheckInsertTimeCode() + ) + + genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1) + #------------------------------------------------------------------------- + #>>>>>>设置顺序地址 + genPkt.clean() + genPkt.setPktType(0) + + gen_file_def_ap = gen_file_def + "_rw01" + genPkt.addBeforeExc(genMessageCode("--读取事件寄存器组") + +genIFRwDataCode(0, 0x500, False, 0x48) + +genIFRwDataCode(1, 0x500, False, 0x48) + +genIFRwDataCode(2, 0x500, False, 0x48) + +genIFRwDataCode(3, 0x500, False, 0x48) + +genIFRwDataCode(4, 0x500, False, 0x48) + + +genMessageCode("--设置事件") + +genIFRwDataCode(1, 0x500, True, 4, [0x0F, 0x00, 0x03, 0x00] ) + +genIFRwDataCode(2, 0x500, True, 4, [0x03, 0x00, 0x0F, 0x00] ) + +genIFRwDataCode(3, 0x500, True, 4, [0x0F, 0x00, 0x03, 0x00] ) + +genIFRwDataCode(4, 0x500, True, 4, [0x03, 0x00, 0x0F, 0x00] ) + + +genMessageCode("--读取事件寄存器组") + +genIFRwDataCode(0, 0x500, False, 0x48) + +genIFRwDataCode(1, 0x500, False, 0x48) + +genIFRwDataCode(2, 0x500, False, 0x48) + +genIFRwDataCode(3, 0x500, False, 0x48) + +genIFRwDataCode(4, 0x500, False, 0x48) + ) + + genPkt.addAfterExc( "latch0 <= 1;\n" + +"latch1 <= 1;\n" + + +"#5000\n" + +"latch0 <= 0;\n" + +"latch1 <= 0;\n" + + +"#5000\n" + +"latch0 <= 1;\n" + +"latch1 <= 1;\n" + + +"#5000\n" + +"latch0 <= 0;\n" + +"latch1 <= 0;\n" + + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + + +genMessageCode("--清除中断") + +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + + +genMessageCode("--读取事件寄存器组") + +genIFRwDataCode(0, 0x500, False, 0x48) + +genIFRwDataCode(1, 0x500, False, 0x48) + +genIFRwDataCode(2, 0x500, False, 0x48) + +genIFRwDataCode(3, 0x500, False, 0x48) + +genIFRwDataCode(4, 0x500, False, 0x48) + + +genTcEndFrameCode(gen_file_def) + ) + + genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1, True, gen_file_def_ap) + + return gen_file_def + + + +def tc14(): + genPkt = GenPkt() + + gen_file_def = "base_tc14" + sm_idx = 0 + tc_des = "测试事件寄存器组。先同步,事件寄存器组会抓取写入SMx、读出SMx的时间;SPI侧读入、写入的时间。\\n"\ + + "需要检查波形文件。" + + + + genPkt.clean() + genPkt.setPktType(0) + + #subPkt参数:索引、索引类型、地址、命令、长度、数据 + genPkt.addSubPkt(0x0, 0, 0x0, 0xc, 12, b'\0'*12) + + + genPkt.addBeforeExc(genTcStartFrameCode(gen_file_def, tc_des) + +genMessageCode("--清除中断") + +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genEnableInsertTimeCode(0xa)) + + sm_idx = 0 + + genPkt.addAfterExc(genWriteTransLenCode(gen_file_def, sm_idx) + +genWriteTransPktCode(gen_file_def, sm_idx) + +genTrgTransPktCode(gen_file_def, sm_idx) + +genReadAckPktCode(gen_file_def, sm_idx) + +genCheckInsertTimeCode() + ) + + genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1) + #------------------------------------------------------------------------- + #>>>>>>设置顺序地址 + genPkt.clean() + genPkt.setPktType(0) + + m2s_size = 8 + s2m_size = 16 + + gen_file_def_ap = gen_file_def + "_rw01" + genPkt.addBeforeExc(genMessageCode("--读取事件寄存器组") + +genIFRwDataCode(0, 0x500, False, 0x48) + +genIFRwDataCode(1, 0x500, False, 0x48) + +genIFRwDataCode(2, 0x500, False, 0x48) + +genIFRwDataCode(3, 0x500, False, 0x48) + +genIFRwDataCode(4, 0x500, False, 0x48) + + +genMessageCode("--清除中断") + +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + + +genSlvSMWriteData(1, 1, s2m_size, list(range(s2m_size))) + +genSlvSMWriteData(2, 1, s2m_size, list(range(s2m_size))) + +genSlvSMWriteData(3, 1, s2m_size, list(range(s2m_size))) + +genSlvSMWriteData(4, 1, s2m_size, list(range(s2m_size))) + ) + + + genPkt.addSubPkt(0, 0, 0x0302, 0xe, 2, [m2s_size, 0]) + genPkt.addSubPkt(0, 0, 0x0800, 0xe, m2s_size, list(range(m2s_size))) + genPkt.addSubPkt(1, 0, 0x1000, 0x0, s2m_size, [0, ] * s2m_size) + genPkt.addSubPkt(2, 0, 0x1000, 0x0, s2m_size, [0, ] * s2m_size) + genPkt.addSubPkt(3, 0, 0x1000, 0x0, s2m_size, [0, ] * s2m_size) + genPkt.addSubPkt(4, 0, 0x1000, 0x0, s2m_size, [0, ] * s2m_size) + + genPkt.addAfterExc(genWriteTransLenCode(gen_file_def_ap, sm_idx) + +genWriteTransPktCode(gen_file_def_ap, sm_idx) + +genTrgTransPktCode(gen_file_def_ap, sm_idx) + +genReadAckPktCode(gen_file_def_ap, sm_idx) + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + + +genMessageCode("--清除中断") + +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + + +genSlvSMReadData(1, 0, m2s_size) + +genSlvSMReadData(2, 0, m2s_size) + +genSlvSMReadData(3, 0, m2s_size) + +genSlvSMReadData(4, 0, m2s_size) + + +genMessageCode("--读取事件寄存器组") + +genIFRwDataCode(0, 0x500, False, 0x48) + +genIFRwDataCode(1, 0x500, False, 0x48) + +genIFRwDataCode(2, 0x500, False, 0x48) + +genIFRwDataCode(3, 0x500, False, 0x48) + +genIFRwDataCode(4, 0x500, False, 0x48) + + +genTcEndFrameCode(gen_file_def) + ) + + genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1, True, gen_file_def_ap) + + return gen_file_def + + +def tc_wr_sm(tc_id, wr_sm_idx): + genPkt = GenPkt() + + gen_file_def = f"base_tc{tc_id}_wr_sm{wr_sm_idx}" + sm_idx = 0 + tc_des = (f"读写SM{wr_sm_idx}缓冲区超过缓冲区的元素上限,期望结果,超出缓冲区的数据不被接收,工作计数不加。\\n" + "检查是否真的写入,子报文的状态。目前即使SM0、2、4、6满了,处于溢出状态,硬件难以判断是否能提交数据。\\n" + "目前只要地址、长度正确,即使无法写入,工作计数也会加1。工作计数不能反应报文与SMx的互动关系。\\n" + "需要手动检查相应数据。" + ) + + #------------------------------------------------------------------------- + #>>>>>>普通数据包3 + genPkt.clean() + genPkt.setPktType(0) + + #subPkt参数:索引、索引类型、地址、命令、长度、数据 + genPkt.addSubPkt(0, 0, 0x0302 + wr_sm_idx * 0x4, 0xe, 2, [32, 0]) + genPkt.addSubPkt(0, 0, 0x0800 + wr_sm_idx * 0x0800, 0xe, 32, list(range(0, 32))) + genPkt.addSubPkt(0, 0, 0x0800 + wr_sm_idx * 0x0800, 0xe, 32, list(range(32, 64))) + genPkt.addSubPkt(0, 0, 0x0800 + wr_sm_idx * 0x0800, 0xe, 32, list(range(64, 96))) + genPkt.addSubPkt(0, 0, 0x0800 + wr_sm_idx * 0x0800, 0xe, 32, list(range(96, 128))) + genPkt.addSubPkt(0, 0, 0x0800 + wr_sm_idx * 0x0800, 0xe, 32, list(range(128, 160))) + genPkt.addSubPkt(0, 0, 0x0800 + wr_sm_idx * 0x0800, 0xe, 32, list(range(160, 192))) + genPkt.addSubPkt(0, 0, 0x0800 + wr_sm_idx * 0x0800, 0xe, 32, list(range(192, 224))) + genPkt.addSubPkt(0, 0, 0x0800 + wr_sm_idx * 0x0800, 0xe, 32, list(range(224, 256))) + + sm_idx = 0 + + genPkt.addBeforeExc(genTcStartFrameCode(gen_file_def, tc_des) + +genMessageCode("--清除中断") + +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + ) + + genPkt.addAfterExc(genWriteTransLenCode(gen_file_def, sm_idx) + +genWriteTransPktCode(gen_file_def, sm_idx) + +genTrgTransPktCode(gen_file_def, sm_idx) + +genReadAckPktCode(gen_file_def, sm_idx) + + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + + +genMessageCode("--清除中断") + +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + + +genMessageCode("--第一次读") + +genIFRwDataCode(1, 0x300 + wr_sm_idx * 0x4, False, 2) + +genIFRwDataCode(2, 0x300 + wr_sm_idx * 0x4, False, 2) + +genIFRwDataCode(3, 0x300 + wr_sm_idx * 0x4, False, 2) + +genIFRwDataCode(4, 0x300 + wr_sm_idx * 0x4, False, 2) + +genSlvSMReadData(1, wr_sm_idx, 32) + +genSlvSMReadData(2, wr_sm_idx, 32) + +genSlvSMReadData(3, wr_sm_idx, 32) + +genSlvSMReadData(4, wr_sm_idx, 32) + + +genMessageCode("--第二次读") + +genIFRwDataCode(1, 0x300 + wr_sm_idx * 0x4, False, 2) + +genIFRwDataCode(2, 0x300 + wr_sm_idx * 0x4, False, 2) + +genIFRwDataCode(3, 0x300 + wr_sm_idx * 0x4, False, 2) + +genIFRwDataCode(4, 0x300 + wr_sm_idx * 0x4, False, 2) + +genSlvSMReadData(1, wr_sm_idx, 32) + +genSlvSMReadData(2, wr_sm_idx, 32) + +genSlvSMReadData(3, wr_sm_idx, 32) + +genSlvSMReadData(4, wr_sm_idx, 32) + + +genMessageCode("--第三次读") + +genIFRwDataCode(1, 0x300 + wr_sm_idx * 0x4, False, 2) + +genIFRwDataCode(2, 0x300 + wr_sm_idx * 0x4, False, 2) + +genIFRwDataCode(3, 0x300 + wr_sm_idx * 0x4, False, 2) + +genIFRwDataCode(4, 0x300 + wr_sm_idx * 0x4, False, 2) + +genSlvSMReadData(1, wr_sm_idx, 32) + +genSlvSMReadData(2, wr_sm_idx, 32) + +genSlvSMReadData(3, wr_sm_idx, 32) + +genSlvSMReadData(4, wr_sm_idx, 32) + + +genMessageCode("--第四次读") + +genIFRwDataCode(1, 0x300 + wr_sm_idx * 0x4, False, 2) + +genIFRwDataCode(2, 0x300 + wr_sm_idx * 0x4, False, 2) + +genIFRwDataCode(3, 0x300 + wr_sm_idx * 0x4, False, 2) + +genIFRwDataCode(4, 0x300 + wr_sm_idx * 0x4, False, 2) + +genSlvSMReadData(1, wr_sm_idx, 32) + +genSlvSMReadData(2, wr_sm_idx, 32) + +genSlvSMReadData(3, wr_sm_idx, 32) + +genSlvSMReadData(4, wr_sm_idx, 32) + + +genMessageCode("--第五次读") + +genIFRwDataCode(1, 0x300 + wr_sm_idx * 0x4, False, 2) + +genIFRwDataCode(2, 0x300 + wr_sm_idx * 0x4, False, 2) + +genIFRwDataCode(3, 0x300 + wr_sm_idx * 0x4, False, 2) + +genIFRwDataCode(4, 0x300 + wr_sm_idx * 0x4, False, 2) + +genSlvSMReadData(1, wr_sm_idx, 32) + +genSlvSMReadData(2, wr_sm_idx, 32) + +genSlvSMReadData(3, wr_sm_idx, 32) + +genSlvSMReadData(4, wr_sm_idx, 32) + +genIFRwDataCode(1, 0x300 + wr_sm_idx * 0x4, False, 2) + +genIFRwDataCode(2, 0x300 + wr_sm_idx * 0x4, False, 2) + +genIFRwDataCode(3, 0x300 + wr_sm_idx * 0x4, False, 2) + +genIFRwDataCode(4, 0x300 + wr_sm_idx * 0x4, False, 2) + + +genTcEndFrameCode(gen_file_def)) + + genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1) + + return gen_file_def + + +def tc_rd_sm(tc_id, rd_sm_idx): + genPkt = GenPkt() + + gen_file_def = f"base_tc{tc_id}_rd_sm{rd_sm_idx}" + sm_idx = 0 + tc_des = (f"读写SM{rd_sm_idx}缓冲区超过缓冲区的元素上限,期望结果,超出缓冲区的数据不被接收,工作计数不加。\\n" + "检查是否真的写入,子报文的状态。目前即使SM1、3、5、7空了,没有数据,硬件难以判断是否存在数据。\\n" + "目前只要地址、长度正确,即使无法读取,工作计数也会加1。工作计数不能反应报文与SMx的互动关系。\\n" + "需要手工检查生成数据。" + ) + + #------------------------------------------------------------------------- + #>>>>>>普通数据包3 + genPkt.clean() + genPkt.setPktType(0) + + #subPkt参数:索引、索引类型、地址、命令、长度、数据 + #genPkt.addSubPkt(0, 0, 0x0302, 0xd, 2, [32, 0]) + genPkt.addSubPkt(0, 0, 0x0800 + rd_sm_idx * 0x0800, 0xd, 32, [0,]*32) + genPkt.addSubPkt(0, 0, 0x0800 + rd_sm_idx * 0x0800, 0xd, 32, [0,]*32) + genPkt.addSubPkt(0, 0, 0x0800 + rd_sm_idx * 0x0800, 0xd, 32, [0,]*32) + genPkt.addSubPkt(0, 0, 0x0800 + rd_sm_idx * 0x0800, 0xd, 32, [0,]*32) + genPkt.addSubPkt(0, 0, 0x0800 + rd_sm_idx * 0x0800, 0xd, 32, [0,]*32) + genPkt.addSubPkt(0, 0, 0x0800 + rd_sm_idx * 0x0800, 0xd, 32, [0,]*32) + genPkt.addSubPkt(0, 0, 0x0800 + rd_sm_idx * 0x0800, 0xd, 32, [0,]*32) + genPkt.addSubPkt(0, 0, 0x0800 + rd_sm_idx * 0x0800, 0xd, 32, [0,]*32) + sm_idx = 0 + + genPkt.addBeforeExc(genTcStartFrameCode(gen_file_def, tc_des) + +genMessageCode("--清除中断") + +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + + +genMessageCode("--设备1的写") + +genIFRwDataCode(1, 0x300 + rd_sm_idx * 0x4, False, 2) + +genSlvSMWriteData(1, rd_sm_idx, 32, list(range(0, 32))) + +genSlvSMWriteData(1, rd_sm_idx, 32, list(range(32, 64))) + +genIFRwDataCode(1, 0x300 + rd_sm_idx * 0x4, False, 2) + +genSlvSMWriteData(1, rd_sm_idx, 32, list(range(64, 96))) + +genSlvSMWriteData(1, rd_sm_idx, 32, list(range(96, 128))) + +genIFRwDataCode(1, 0x300 + rd_sm_idx * 0x4, False, 2) + +genSlvSMWriteData(1, rd_sm_idx, 32, list(range(128, 160))) + +genSlvSMWriteData(1, rd_sm_idx, 32, list(range(160, 192))) + +genSlvSMWriteData(1, rd_sm_idx, 32, list(range(192, 224))) + +genSlvSMWriteData(1, rd_sm_idx, 32, list(range(224, 256))) + +genIFRwDataCode(1, 0x300 + rd_sm_idx * 0x4, False, 2) + + +genMessageCode("--设备2的写") + +genIFRwDataCode(2, 0x300 + rd_sm_idx * 0x4, False, 2) + +genSlvSMWriteData(2, rd_sm_idx, 32, list(range(0, 32))) + +genSlvSMWriteData(2, rd_sm_idx, 32, list(range(32, 64))) + +genIFRwDataCode(2, 0x300 + rd_sm_idx * 0x4, False, 2) + +genSlvSMWriteData(2, rd_sm_idx, 32, list(range(64, 96))) + +genSlvSMWriteData(2, rd_sm_idx, 32, list(range(96, 128))) + +genIFRwDataCode(2, 0x300 + rd_sm_idx * 0x4, False, 2) + +genSlvSMWriteData(2, rd_sm_idx, 32, list(range(128, 160))) + +genSlvSMWriteData(2, rd_sm_idx, 32, list(range(160, 192))) + +genSlvSMWriteData(2, rd_sm_idx, 32, list(range(192, 224))) + +genSlvSMWriteData(2, rd_sm_idx, 32, list(range(224, 256))) + +genIFRwDataCode(2, 0x300 + rd_sm_idx * 0x4, False, 2) + + +genMessageCode("--设备3的写") + +genIFRwDataCode(3, 0x300 + rd_sm_idx * 0x4, False, 2) + +genSlvSMWriteData(3, rd_sm_idx, 32, list(range(0, 32))) + +genSlvSMWriteData(3, rd_sm_idx, 32, list(range(32, 64))) + +genIFRwDataCode(3, 0x300 + rd_sm_idx * 0x4, False, 2) + +genSlvSMWriteData(3, rd_sm_idx, 32, list(range(64, 96))) + +genSlvSMWriteData(3, rd_sm_idx, 32, list(range(96, 128))) + +genIFRwDataCode(3, 0x300 + rd_sm_idx * 0x4, False, 2) + +genSlvSMWriteData(3, rd_sm_idx, 32, list(range(128, 160))) + +genSlvSMWriteData(3, rd_sm_idx, 32, list(range(160, 192))) + +genSlvSMWriteData(3, rd_sm_idx, 32, list(range(192, 224))) + +genSlvSMWriteData(3, rd_sm_idx, 32, list(range(224, 256))) + +genIFRwDataCode(3, 0x300 + rd_sm_idx * 0x4, False, 2) + + +genMessageCode("--设备4的写") + +genIFRwDataCode(4, 0x300 + rd_sm_idx * 0x4, False, 2) + +genSlvSMWriteData(4, rd_sm_idx, 32, list(range(0, 32))) + +genSlvSMWriteData(4, rd_sm_idx, 32, list(range(32, 64))) + +genIFRwDataCode(4, 0x300 + rd_sm_idx * 0x4, False, 2) + +genSlvSMWriteData(4, rd_sm_idx, 32, list(range(64, 96))) + +genSlvSMWriteData(4, rd_sm_idx, 32, list(range(96, 128))) + +genIFRwDataCode(4, 0x300 + rd_sm_idx * 0x4, False, 2) + +genSlvSMWriteData(4, rd_sm_idx, 32, list(range(128, 160))) + +genSlvSMWriteData(4, rd_sm_idx, 32, list(range(160, 192))) + +genSlvSMWriteData(4, rd_sm_idx, 32, list(range(192, 224))) + +genSlvSMWriteData(4, rd_sm_idx, 32, list(range(224, 256))) + +genIFRwDataCode(4, 0x300 + rd_sm_idx * 0x4, False, 2) + ) + + genPkt.addAfterExc(genWriteTransLenCode(gen_file_def, sm_idx) + +genWriteTransPktCode(gen_file_def, sm_idx) + +genTrgTransPktCode(gen_file_def, sm_idx) + +genReadAckPktCode(gen_file_def, sm_idx) + + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + + +genMessageCode("--清除中断") + +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + + +genTcEndFrameCode(gen_file_def)) + + genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1) + + return gen_file_def + + +def tc15(): + return tc_wr_sm(15, 0) + +def tc16(): + return tc_rd_sm(16, 1) + +def tc17(): + return tc_wr_sm(17, 2) + +def tc18(): + return tc_rd_sm(18, 3) + +def tc19(): + return tc_wr_sm(19, 4) + +def tc20(): + return tc_rd_sm(20, 5) + +def tc21(): + return tc_wr_sm(21, 6) + +def tc22(): + return tc_rd_sm(22, 7) + +def tc23(): + genPkt = GenPkt() + + gen_file_def = "base_tc23" + sm_idx = 0 + tc_des = "使用广播读写命令,读取SM0的长度寄存器;测试工作计数。\\n" + + #------------------------------------------------------------------------- + #>>>>>>普通数据包2 + genPkt.clean() + genPkt.setPktType(0) + + genPkt.addBeforeExc(genTcStartFrameCode(gen_file_def, tc_des) + +genMessageCode("--清除中断") + +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + ) + + #subPkt参数:索引、索引类型、地址、命令、长度、数据 + genPkt.addSubPkt(0, 0, 0x0302, 0xf, 2, [32, 0]) + + sm_idx = 0 + + genPkt.addAfterExc(genWriteTransLenCode(gen_file_def, sm_idx) + +genWriteTransPktCode(gen_file_def, sm_idx) + +genTrgTransPktCode(gen_file_def, sm_idx) + +genReadAckPktCode(gen_file_def, sm_idx) + + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + + +genMessageCode("--清除中断") + +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + + +genTcEndFrameCode(gen_file_def)) + + genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1) + + return gen_file_def + +def tc24(): + genPkt = GenPkt() + + gen_file_def = "base_tc24" + sm_idx = 0 + tc_des = ("同步后,SYNC信号采用脉冲触发,4个设备,4个周期;先用广播包发送公共周期;然后3,4,\\n" + "2设备单独指定周期。该同步数据之前没有补广播包。如果紧跟嗅探包而不是普通包之后,可能会影响同步。\\n" + "期望是无论前面发送得是什么包,都不会影响同步的效果。一段时间后,重新同步,期望不要打断sync\\n" + "信号的输出。需要在波形文件里查看具体的效果。" + ) + + + #------------------------------------------------------------------------- + genPkt.clean() + genPkt.setPktType(1) + + genPkt.addBeforeExc(genTcStartFrameCode(gen_file_def, tc_des) + +genMessageCode("--清除中断") + +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + #+genIFRwDataCode(2, 0x40, True, 4, [0x01, 0x00, 0x66, 0x79]) + #+genIFRwDataCode(3, 0x40, True, 4, [0x01, 0x00, 0x66, 0x79]) + #+genIFRwDataCode(4, 0x40, True, 4, [0x01, 0x00, 0x66, 0x79]) + ) + + + genPkt.addAfterExc(genWriteTransLenCode(gen_file_def, sm_idx) + +genWriteTransPktCode(gen_file_def, sm_idx) + +genTrgTransPktCode(gen_file_def, sm_idx) + +genReadAckPktCode(gen_file_def, sm_idx) + +genMessageCode("--清除中断") + +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + ) + + genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1) + + genPkt.clean() + genPkt.setPktType(0) + sm_idx = 0 + + data = [0x3f, 0xff] + genPkt.addSubPkt(0x0, 0, 0x0, 0xb, 2, data) + + gen_file_def_ap = gen_file_def + "_rwFF" + genPkt.addAfterExc(genWriteTransLenCode(gen_file_def_ap, sm_idx) + +genWriteTransPktCode(gen_file_def_ap, sm_idx) + +genTrgTransPktCode(gen_file_def_ap, sm_idx) + +genReadAckPktCode(gen_file_def_ap, sm_idx) + + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + + +genMessageCode("--清除中断") + +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + ) + + genPkt.gen("./generated/shin/%s.vh"%(gen_file_def,), 1, True, gen_file_def_ap) + + + #------------------------------------------------------------------------- + #>>>>>>设置同步信号的数据包 + genPkt.clean() + genPkt.setPktType(0) + sm_idx = 0 + + genPkt.addBeforeExc(genEnableInsertTimeCode(0xa) + + '''spi_trans( (16'h0100), (`SPI_READ), (8), (`IF_IDX(0)));\n''' + + '''_temp_time = rxBuf[`ARRAY_IDX_OFF] + (rxBuf[`ARRAY_IDX_OFF+1] << 8) + (rxBuf[`ARRAY_IDX_OFF+2] << 16) + (rxBuf[`ARRAY_IDX_OFF+3] << 24) + (rxBuf[`ARRAY_IDX_OFF+4] << 32) + (rxBuf[`ARRAY_IDX_OFF+5] << 40) + (rxBuf[`ARRAY_IDX_OFF+6] << 48) + (rxBuf[`ARRAY_IDX_OFF+7] << 56);\n''' + + '''_temp_time = _temp_time + 32'h3000;\n\n''') + + genPkt.addSubPkt(0x0, 0, 0x0, 0xc, 12, b'\0'*12) + + genPkt.addSubPkt(0x0, 0, 0x0, 0xd, 200, [0, ] * 200) + + #subPkt参数:索引、索引类型、地址、命令、长度、数据 + data = [0,] * 100 #bytearray(b"\0" * 100) + data[0] = 0x0f #地址0x120 + data[2] = 0xa + data[4] = 0xa + data[6] = 0xa + data[8] = 0xa + + data[16] = '''(_temp_time & 8'hff)''' #地址0x130, sync同步点 + data[17] = '''(_temp_time >> 8) & 8'hff''' #地址0x131 + data[18] = '''(_temp_time >> 16) & 8'hff''' + data[19] = '''(_temp_time >> 24) & 8'hff''' + + data[24] = 0x80 #地址0x138, sync周期 4B + data[25] = 0x00 #地址0x139 + + data[28] = 0x0 #sync1偏移 + data[29] = 0x0 + + data[36] = 0x0#sync3偏移 + data[37] = 0x0 + + genPkt.addSubPkt(0, 0, 0x120, 0xe, 0x28, data) + + data = [0,] * 100 #bytearray(b"\0" * 100) + data[0] = 0x0f #地址0x120 + data[2] = 0xa + data[4] = 0xa + data[6] = 0xa + data[8] = 0xa + + data[16] = '''(_temp_time & 8'hff)''' #地址0x130, sync同步点 + data[17] = '''(_temp_time >> 8) & 8'hff''' #地址0x131 + data[18] = '''(_temp_time >> 16) & 8'hff''' + data[19] = '''(_temp_time >> 24) & 8'hff''' + + data[24] = 0x00 #地址0x138, sync周期 4B + data[25] = 0x01 #地址0x139 + + data[28] = 0x0 #sync1偏移 + data[29] = 0x0 + + data[36] = 0x0 #sync3偏移 + data[37] = 0x0 + + genPkt.addSubPkt(3, 0, 0x120, 0x1, 0x28, data) + + data = [0,] * 100 #bytearray(b"\0" * 100) + data[0] = 0x0f #地址0x120 + data[2] = 0xa + data[4] = 0xa + data[6] = 0xa + data[8] = 0xa + + data[16] = '''(_temp_time & 8'hff)''' #地址0x130, sync同步点 + data[17] = '''(_temp_time >> 8) & 8'hff''' #地址0x131 + data[18] = '''(_temp_time >> 16) & 8'hff''' + data[19] = '''(_temp_time >> 24) & 8'hff''' + + data[24] = 0x00 #地址0x138, sync周期 4B + data[25] = 0x02 #地址0x139 + + data[28] = 0x0 #sync1偏移 + data[29] = 0x0 + + data[36] = 0x0 #sync3偏移 + data[37] = 0x0 + + genPkt.addSubPkt(4, 0, 0x120, 0x1, 0x28, data) + + data = [0,] * 100 #bytearray(b"\0" * 100) + data[0] = 0x0f #地址0x120 + data[2] = 0xa + data[4] = 0xa + data[6] = 0xa + data[8] = 0xa + + data[16] = '''(_temp_time & 8'hff)''' #地址0x130, sync同步点 + data[17] = '''(_temp_time >> 8) & 8'hff''' #地址0x131 + data[18] = '''(_temp_time >> 16) & 8'hff''' + data[19] = '''(_temp_time >> 24) & 8'hff''' + + data[24] = 0x00 #地址0x138, sync周期 4B + data[25] = 0x04 #地址0x139genPkt.addBeforeExc( + + data[28] = 0x0 #sync1偏移 + data[29] = 0x0 + + data[36] = 0x0 #sync3偏移 + data[37] = 0x0 + + genPkt.addSubPkt(2, 0, 0x120, 0x1, 0x28, data) + + gen_file_def_ap = gen_file_def + "_rw00" + genPkt.addAfterExc(genWriteTransLenCode(gen_file_def_ap, sm_idx) + +genWriteTransPktCode(gen_file_def_ap, sm_idx) + +genTrgTransPktCode(gen_file_def_ap, sm_idx) + +genReadAckPktCode(gen_file_def_ap, sm_idx) + + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + + +genMessageCode("--清除中断") + +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + ) + + genPkt.gen("./generated/shin/%s.vh"%(gen_file_def,), 1, True, gen_file_def_ap) + + #>>>>>>同步数据包 + genPkt.clean() + genPkt.setPktType(0) + + #subPkt参数:索引、索引类型、地址、命令、长度、数据 + genPkt.addSubPkt(0x0, 0, 0x0, 0xc, 12, [0, ] * 12) + genPkt.addSubPkt(0x0, 0, 0x0, 0xd, 10, [0, ] * 10) + genPkt.addSubPkt(0x0, 0, 0x0, 0xd, 10, [0, ] * 10) + + + + + genPkt.addBeforeExc(genEnableInsertTimeCode(0xa))# + 18 + 18)) + + sm_idx = 0 + + gen_file_def_ap = gen_file_def + "_rw02" + + genPkt.addAfterExc(genWriteTransLenCode(gen_file_def_ap, sm_idx) + +genWriteTransPktCode(gen_file_def_ap, sm_idx) + +genTrgTransPktCode(gen_file_def_ap, sm_idx) + +genReadAckPktCode(gen_file_def_ap, sm_idx) + +genCheckInsertTimeCode() + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + + +genMessageCode("--清除中断") + +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + +genTcEndFrameCode(gen_file_def)) #+genDisableInsertTimeCode()) + + + genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1, True, gen_file_def_ap) + return gen_file_def + + +def tc25(): + genPkt = GenPkt() + + gen_file_def = "base_tc25" + sm_idx = 0 + tc_des = "发送一个包,内涵多个子包,包括所有的命令。\\n" + + + #------------------------------------------------------------------------- + #>>>>>>普通数据包 sm1,2个读 + genPkt.clean() + genPkt.setPktType(0) + + #subPkt参数:索引、索引类型、地址、命令、长度、数据 + genPkt.addSubPkt(0x00, 0, 0x00, 0xc, 12, [0, ] * 12) + genPkt.addSubPkt(0x01, 0, 0x00, 0x0, 32, [0, ] * 32) + genPkt.addSubPkt(0x02, 0, 0x302, 0x1, 2, [0x10, 0]) + genPkt.addSubPkt(0x02, 0, 0x800, 0x1, 0x10, list(range(0x10))) + genPkt.addSubPkt(0x01, 0, 0x302, 0x2, 2, [0x20, 0]) + genPkt.addSubPkt(0x02, 0, 0x00, 0xb, 2, [0x00, 0x00]) + genPkt.addSubPkt(0x00, 0, 0x70, 0xd, 4, [0, 0, 0, 0]) + genPkt.addSubPkt(0x00, 0, 0x30a, 0xe, 2, [0x20, 0x00]) + genPkt.addSubPkt(0x00, 0, 0xc0, 0xf, 2, [0x00, 0x00]) + + + sm_idx = 1 + genPkt.addBeforeExc(genTcStartFrameCode(gen_file_def, tc_des) + +genMessageCode("--清除中断") + +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genEnableInsertTimeCode(0xa)) + + genPkt.addAfterExc(genWriteTransLenCode(gen_file_def, sm_idx) + +genWriteTransPktCode(gen_file_def, sm_idx) + +genTrgTransPktCode(gen_file_def, sm_idx) + +genReadAckPktCode(gen_file_def, sm_idx) + + +genIFRwDataCode(2, 0x800, False, 0x10) + + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + + +genMessageCode("--清除中断") + +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + + +genTcEndFrameCode(gen_file_def)) + + genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1) + + return gen_file_def + + +def tc26(): + genPkt = GenPkt() + + gen_file_def = "base_tc26" + sm_idx = 0 + tc_des = "读取内部的时钟,看看是否有进位问题,导致读取的错误或不可靠。\\n" + + + #------------------------------------------------------------------------- + #>>>>>>普通数据包 sm1,2个读 + genPkt.clean() + genPkt.setPktType(0) + + #subPkt参数:索引、索引类型、地址、命令、长度、数据 + genPkt.addSubPkt(0x00, 0, 0x00, 0xc, 12, [0, ] * 12) + + + sm_idx = 1 + genPkt.addBeforeExc(genTcStartFrameCode(gen_file_def, tc_des) + +genMessageCode("--清除中断") + +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genEnableInsertTimeCode(0xa)) + + genPkt.addAfterExc(genWriteTransLenCode(gen_file_def, sm_idx) + +genWriteTransPktCode(gen_file_def, sm_idx) + +genTrgTransPktCode(gen_file_def, sm_idx) + +genReadAckPktCode(gen_file_def, sm_idx) + + +genIFRwDataCode(2, 0x800, False, 0x10) + + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + + +genMessageCode("--清除中断") + +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + + +genMessageCode("--读取时间1") + +genIFRwDataCode(0, 0x100, False, 32) + +genIFRwDataCode(1, 0x100, False, 32) + +genIFRwDataCode(2, 0x100, False, 32) + +genIFRwDataCode(3, 0x100, False, 32) + +genIFRwDataCode(4, 0x100, False, 32) + + + +"#8000\n" + +genMessageCode("--读取时间2") + +genIFRwDataCode(0, 0x100, False, 32) + +genIFRwDataCode(1, 0x100, False, 32) + +genIFRwDataCode(2, 0x100, False, 32) + +genIFRwDataCode(3, 0x100, False, 32) + +genIFRwDataCode(4, 0x100, False, 32) + + + +genMessageCode("--读取时间3") + +genIFRwDataCode(0, 0x100, False, 8) + +genIFRwDataCode(0, 0x118, False, 8) + +genIFRwDataCode(1, 0x118, False, 8) + +genIFRwDataCode(2, 0x118, False, 8) + +genIFRwDataCode(3, 0x118, False, 8) + +genIFRwDataCode(4, 0x118, False, 8) + + + +genTcEndFrameCode(gen_file_def)) + + genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1) + + return gen_file_def + +def tc27(): + genPkt = GenPkt() + + gen_file_def = "base_tc27" + sm_idx = 0 + tc_des = "测试主站并行输出。在SM0工作的情况下,操作SM1,SM2,SM3,然后看是否正常。\\n" + + + #------------------------------------------------------------------------- + #>>>>>>普通数据包 sm1,2个读 + genPkt.clean() + genPkt.setPktType(0) + + #subPkt参数:索引、索引类型、地址、命令、长度、数据 + genPkt.addSubPkt(0x01, 0, 0x302, 0x1, 2, [0x00, 0x03]) + genPkt.addSubPkt(0x02, 0, 0x302, 0x1, 2, [0x00, 0x01]) + genPkt.addSubPkt(0x03, 0, 0x302, 0x1, 2, [0x00, 0x01]) + genPkt.addSubPkt(0x04, 0, 0x302, 0x1, 2, [0x00, 0x01]) + + + sm_idx = 0 + genPkt.addBeforeExc(genTcStartFrameCode(gen_file_def, tc_des) + +genMessageCode("--清除中断") + +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + ) + + genPkt.addAfterExc(genWriteTransLenCode(gen_file_def, sm_idx) + +genWriteTransPktCode(gen_file_def, sm_idx) + +genTrgTransPktCode(gen_file_def, sm_idx) + +genReadAckPktCode(gen_file_def, sm_idx) + +genMessageCode("--清除中断") + +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + ) + + + + #+genTcEndFrameCode(gen_file_def)) + + genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1) + + genPkt.clean() + genPkt.setPktType(0) + + #subPkt参数:索引、索引类型、地址、命令、长度、数据 + genPkt.addSubPkt(0x01, 0, 0x800, 0x1, 768, + list(range(256)) + list(range(255, -1, -1)) + list(range(256))) + + + + gen_file_def_ap01 = gen_file_def + "_rw01" + genPkt.addAfterExc(genWriteTransLenCode(gen_file_def_ap01, 1) + +genWriteTransPktCode(gen_file_def_ap01, 1) + +genTrgTransPktCode(gen_file_def_ap01, 1) + ) + genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1, True, gen_file_def_ap01) + + genPkt.clean() + genPkt.setPktType(0) + + #subPkt参数:索引、索引类型、地址、命令、长度、数据 + genPkt.addSubPkt(0x02, 0, 0x800, 0x1, 256, list(range(128)) + list(range(128))) + + + + gen_file_def_ap02 = gen_file_def + "_rw02" + sm_idx = 2 + genPkt.addAfterExc(genWriteTransLenCode(gen_file_def_ap02, 2) + +genWriteTransPktCode(gen_file_def_ap02, 2) + ) + genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1, True, gen_file_def_ap02) + + + + genPkt.clean() + genPkt.setPktType(0) + + #subPkt参数:索引、索引类型、地址、命令、长度、数据 + genPkt.addSubPkt(0x03, 0, 0x800, 0x1, 256, list(range(64)) + list(range(64)) + list(range(64)) + list(range(64))) + + + + gen_file_def_ap03 = gen_file_def + "_rw03" + sm_idx = 3 + genPkt.addAfterExc(genWriteTransLenCode(gen_file_def_ap03, 3) + +genWriteTransPktCode(gen_file_def_ap03, 3) + +genReadAckPktCode(gen_file_def_ap01, 1) + + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + + +genMessageCode("--清除中断") + +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + + +genTrgTransPktCode(gen_file_def_ap02, 2) + +genReadAckPktCode(gen_file_def_ap02, 2) + + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + + +genMessageCode("--清除中断") + +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + + +genTrgTransPktCode(gen_file_def_ap03, 3) + +genReadAckPktCode(gen_file_def_ap03, 3) + + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + + +genMessageCode("--清除中断") + +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + + + +genIFRwDataCode(1, 0x800, False, 768) + +genIFRwDataCode(2, 0x800, False, 256) + +genIFRwDataCode(3, 0x800, False, 256) + + +genTcEndFrameCode(gen_file_def) + ) + genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1, True, gen_file_def_ap03) + + + return gen_file_def + +def tc28(): + genPkt = GenPkt() + + + gen_file_def = "base_tc28" + sm_idx = 0 + tc_des = ("测试IO交换特性,为环网通信做准备。\\n" + ) + + genPkt.clean() + genPkt.setPktType(0) + + genPkt.addBeforeExc(genTcStartFrameCode(gen_file_def, tc_des) + +genIFRwDataCode(0, 0x40, True, 4, [0x01, 0x00, 0x66, 0x79]) + +genIFRwDataCode(4, 0x40, True, 4, [0x01, 0x00, 0x66, 0x79]) + +"#5000" + #+genIFRwDataCode(0, 0x09, True, 1, [0, ], False, iface=1) + #+genIFRwDataCode(4, 0x09, True, 1, [0, ], False, iface=1) + +using_proper_workmode(0) + +using_proper_workmode(4) + + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + + +genMessageCode("--读取中断使能") + +genIFRwDataCode(0, 0x70, False, 4) + +genIFRwDataCode(4, 0x70, False, 4) + + +genMessageCode("--配置主从站") + +genIFRwDataCode(0, 0x00, True, 1, [0x02, ]) + +genIFRwDataCode(4, 0x00, True, 1, [0x01, ]) + ) + + genPkt.addAfterExc(genIFRwDataCode(0, 0x4a, False, 2) + +genIFRwDataCode(1, 0x4a, False, 2) + +genIFRwDataCode(2, 0x4a, False, 2) + +genIFRwDataCode(3, 0x4a, False, 2) + +genIFRwDataCode(4, 0x4a, False, 2) + + +genIFRwDataCode(0, 0x4a, True, 2, [1, 0x58]) + +genIFRwDataCode(1, 0x4a, True, 2, [1, 0x58]) + +genIFRwDataCode(2, 0x4a, True, 2, [1, 0x58]) + +genIFRwDataCode(3, 0x4a, True, 2, [1, 0x58]) + +genIFRwDataCode(4, 0x4a, True, 2, [1, 0x58]) + + +genIFRwDataCode(0, 0, False, 1) + +genIFRwDataCode(1, 0, False, 1) + +genIFRwDataCode(2, 0, False, 1) + +genIFRwDataCode(3, 0, False, 1) + +genIFRwDataCode(4, 0, False, 1) + #genWriteTransLenCode(gen_file_def, sm_idx) + #+genWriteTransPktCode(gen_file_def, sm_idx) + #+genTrgTransPktCode(gen_file_def, sm_idx) + #+genReadAckPktCode(gen_file_def, sm_idx) + + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + + +genMessageCode("--清除中断") + +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + + #+genTcEndFrameCode(gen_file_def) + ) + genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1) + + genPkt.clean() + genPkt.setPktType(1) + + gen_file_def_ap = gen_file_def + "_rw01" + sm_idx = 0 + genPkt.addAfterExc(genWriteTransLenCode(gen_file_def_ap, sm_idx, dev_idx=4) + +genWriteTransPktCode(gen_file_def_ap, sm_idx, dev_idx=4) + +genTrgTransPktCode(gen_file_def_ap, sm_idx, dev_idx=4) + +genReadAckPktCode(gen_file_def_ap, sm_idx, dev_idx=4) + + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + + +genMessageCode("--清除中断") + +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + + #+genTcEndFrameCode(gen_file_def) + ) + genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1, True, gen_file_def_ap) + + genPkt.clean() + genPkt.setPktType(0) + + + data = [0x3f, 0xff] + genPkt.addSubPkt(0x0, 0, 0x0, 0xb, 2, data) + + gen_file_def_ap = gen_file_def + "_rw02" + sm_idx = 0 + genPkt.addAfterExc(genWriteTransLenCode(gen_file_def_ap, sm_idx, dev_idx=4) + +genWriteTransPktCode(gen_file_def_ap, sm_idx, dev_idx=4) + +genTrgTransPktCode(gen_file_def_ap, sm_idx, dev_idx=4) + +genReadAckPktCode(gen_file_def_ap, sm_idx, dev_idx=4) + + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + + +genMessageCode("--清除中断") + +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + + #+genTcEndFrameCode(gen_file_def) + ) + genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1, True, gen_file_def_ap) + + + genPkt.clean() + genPkt.setPktType(1) + + gen_file_def_ap = gen_file_def + "_rw03" + sm_idx = 0 + genPkt.addAfterExc(genWriteTransLenCode(gen_file_def_ap, sm_idx, dev_idx=4) + +genWriteTransPktCode(gen_file_def_ap, sm_idx, dev_idx=4) + +genTrgTransPktCode(gen_file_def_ap, sm_idx, dev_idx=4) + +genReadAckPktCode(gen_file_def_ap, sm_idx, dev_idx=4) + + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + + +genMessageCode("--清除中断") + +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + + #+genTcEndFrameCode(gen_file_def) + ) + genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1, True, gen_file_def_ap) + + + genPkt.clean() + genPkt.setPktType(0) + + genPkt.addSubPkt(0x1, 0, 0x180, 0, 32, [0, ]*32) + genPkt.addSubPkt(0x2, 0, 0x180, 0, 32, [0, ]*32) + genPkt.addSubPkt(0x3, 0, 0x180, 0, 32, [0, ]*32) + genPkt.addSubPkt(0x4, 0, 0x180, 0, 32, [0, ]*32) + + gen_file_def_ap = gen_file_def + "_rw04" + sm_idx = 0 + genPkt.addAfterExc(genWriteTransLenCode(gen_file_def_ap, sm_idx, dev_idx=4) + +genWriteTransPktCode(gen_file_def_ap, sm_idx, dev_idx=4) + +genTrgTransPktCode(gen_file_def_ap, sm_idx, dev_idx=4) + +genReadAckPktCode(gen_file_def_ap, sm_idx, dev_idx=4) + + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + + +genMessageCode("--清除中断") + +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + + + +genIFRwDataCode(0, 0x40, True, 4, [0x01, 0x00, 0x66, 0x79]) + +genIFRwDataCode(4, 0x40, True, 4, [0x01, 0x00, 0x66, 0x79]) + +"#5000" + #+genIFRwDataCode(0, 0x09, True, 1, [0, ], False, iface=1) + #+genIFRwDataCode(4, 0x09, True, 1, [0, ], False, iface=1) + +using_proper_workmode(0) + +using_proper_workmode(4) + + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + + +genMessageCode("--配置中断") + #+genIFRwDataCode(0, 0x70, False, 4) + #+genIFRwDataCode(4, 0x70, False, 4) + +genIFRwDataCode(0, 0x70, True, 4, [0x03, 0x00, 0x00, 0xf0]) + +genIFRwDataCode(4, 0x70, True, 4, [0x00, 0x00, 0x00, 0xf0]) + +genIFRwDataCode(0, 0x7c, True, 2, [0x10, 0x80]) + +genIFRwDataCode(4, 0x7c, True, 2, [0x10, 0x80]) + + +genMessageCode("--配置主从站") + +genIFRwDataCode(0, 0x00, True, 1, [0x01, ]) + +genIFRwDataCode(4, 0x00, True, 1, [0x02, ]) + + +genIFRwDataCode(0, 0x4a, False, 2) + +genIFRwDataCode(1, 0x4a, False, 2) + +genIFRwDataCode(2, 0x4a, False, 2) + +genIFRwDataCode(3, 0x4a, False, 2) + +genIFRwDataCode(4, 0x4a, False, 2) + + +genIFRwDataCode(0, 0x4a, True, 2, [0, 0x58]) + +genIFRwDataCode(1, 0x4a, True, 2, [0, 0x58]) + +genIFRwDataCode(2, 0x4a, True, 2, [0, 0x58]) + +genIFRwDataCode(3, 0x4a, True, 2, [0, 0x58]) + +genIFRwDataCode(4, 0x4a, True, 2, [0, 0x58]) + + +genIFRwDataCode(0, 0, False, 1) + +genIFRwDataCode(1, 0, False, 1) + +genIFRwDataCode(2, 0, False, 1) + +genIFRwDataCode(3, 0, False, 1) + +genIFRwDataCode(4, 0, False, 1) + + #+genTcEndFrameCode(gen_file_def) + ) + genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1, True, gen_file_def_ap) + + genPkt.clean() + genPkt.setPktType(1) + + gen_file_def_ap = gen_file_def + "_rw05" + sm_idx = 0 + genPkt.addAfterExc(genWriteTransLenCode(gen_file_def_ap, sm_idx, dev_idx=0) + +genWriteTransPktCode(gen_file_def_ap, sm_idx, dev_idx=0) + +genTrgTransPktCode(gen_file_def_ap, sm_idx, dev_idx=0) + +genReadAckPktCode(gen_file_def_ap, sm_idx, dev_idx=0) + + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + + +genMessageCode("--清除中断") + +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + + #+genTcEndFrameCode(gen_file_def) + ) + genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1, True, gen_file_def_ap) + + genPkt.clean() + genPkt.setPktType(0) + + + data = [0x3f, 0xff] + genPkt.addSubPkt(0x0, 0, 0x0, 0xb, 2, data) + + gen_file_def_ap = gen_file_def + "_rw06" + sm_idx = 0 + genPkt.addAfterExc(genWriteTransLenCode(gen_file_def_ap, sm_idx, dev_idx=0) + +genWriteTransPktCode(gen_file_def_ap, sm_idx, dev_idx=0) + +genTrgTransPktCode(gen_file_def_ap, sm_idx, dev_idx=0) + +genReadAckPktCode(gen_file_def_ap, sm_idx, dev_idx=0) + + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + + +genMessageCode("--清除中断") + +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + + +genTcEndFrameCode(gen_file_def) + ) + genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1, True, gen_file_def_ap) + + return gen_file_def + +def tc29(): + genPkt = GenPkt() + + + gen_file_def = "base_tc29" + sm_idx = 0 + tc_des = ("读,单次通讯2048个字节。每个子包包含数据128个字节,最多15个子包。 \\n" + +"(128 + 8) * 15 + 4(HEAD) + 4(CRC) = 2048\\n" + +"可以通过屏蔽子包的方式,增大或者缩小发送的数据量。最大的数据量不超过2048个字节。" + ) + + #------------------------------------------------------------------------- + #>>>>>>普通数据包 sm2,广播读 + genPkt.clean() + genPkt.setPktType(0) + + #subPkt参数:索引、索引类型、地址、命令、长度、数据 + genPkt.addSubPkt(0x01, 0, 0x180, 0x0, 128, None) + genPkt.addSubPkt(0x02, 0, 0x180, 0x0, 128, None) + genPkt.addSubPkt(0x03, 0, 0x180, 0x0, 128, None) + genPkt.addSubPkt(0x04, 0, 0x180, 0x0, 128, None) + + genPkt.addSubPkt(0x01, 0, 0x180, 0x0, 128, None) + genPkt.addSubPkt(0x02, 0, 0x180, 0x0, 128, None) + genPkt.addSubPkt(0x03, 0, 0x180, 0x0, 128, None) + genPkt.addSubPkt(0x04, 0, 0x180, 0x0, 128, None) + + genPkt.addSubPkt(0x01, 0, 0x180, 0x0, 128, None) + genPkt.addSubPkt(0x02, 0, 0x180, 0x0, 128, None) + genPkt.addSubPkt(0x03, 0, 0x180, 0x0, 128, None) + genPkt.addSubPkt(0x04, 0, 0x180, 0x0, 128, None) + + genPkt.addSubPkt(0x01, 0, 0x180, 0x0, 128, None) + genPkt.addSubPkt(0x02, 0, 0x180, 0x0, 128, None) + genPkt.addSubPkt(0x03, 0, 0x180, 0x0, 128, None) + + sm_idx = 2 + + genPkt.addBeforeExc(genTcStartFrameCode(gen_file_def, tc_des) + +genMessageCode("--清除中断") + +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + + +genIFRwDataCode(1, 0x180, True, 128, list(range(128))) + +genIFRwDataCode(2, 0x180, True, 128, list(range(4, 128 + 4))) + +genIFRwDataCode(3, 0x180, True, 128, list(range(8, 128 + 8))) + +genIFRwDataCode(4, 0x180, True, 128, list(range(16, 128 + 16))) + ) + + genPkt.addAfterExc(genWriteTransLenCode(gen_file_def, sm_idx) + +genWriteTransPktCode(gen_file_def, sm_idx) + +genTrgTransPktCode(gen_file_def, sm_idx) + +genReadAckPktCode(gen_file_def, sm_idx) + + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + + +genMessageCode("--清除中断") + +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + + +genTcEndFrameCode(gen_file_def)) + genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1) + + return gen_file_def + + +def tc30(): + genPkt = GenPkt() + + + gen_file_def = "base_tc30" + sm_idx = 0 + tc_des = ("写,单次通讯2048个字节。每个子包包含数据502个字节,最多4个子包。 \\n" + +"(502 + 8) * 4 + 4(HEAD) + 4(CRC) = 2048\\n" + +"可以通过屏蔽子包的方式,增大或者缩小发送的数据量。最大的数据量不超过2048个字节。" + ) + + #------------------------------------------------------------------------- + #>>>>>>普通数据包 sm2,广播读 + genPkt.clean() + genPkt.setPktType(0) + data_len = 502 + data_len_wr = [(data_len & 0xff), ((data_len >> 8) & 0xff)] + #genPkt.addSubPkt(0x00, 0, 0x302, 0xe, 2, data_len_wr) #500 + #subPkt参数:索引、索引类型、地址、命令、长度、数据 + genPkt.addSubPkt(0x01, 0, 0x800, 0x1, data_len, list(range(256)) + list(range(256))) + genPkt.addSubPkt(0x02, 0, 0x800, 0x1, data_len, list(range(256)) + list(range(256))) + genPkt.addSubPkt(0x03, 0, 0x800, 0x1, data_len, list(range(256)) + list(range(256))) + genPkt.addSubPkt(0x04, 0, 0x800, 0x1, data_len, list(range(256)) + list(range(256))) + + sm_idx = 2 + + + genPkt.addBeforeExc(genTcStartFrameCode(gen_file_def, tc_des) + +genMessageCode("--清除中断") + +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(1, 0x0302, True, 2, data_len_wr) + +genIFRwDataCode(2, 0x0302, True, 2, data_len_wr) + +genIFRwDataCode(3, 0x0302, True, 2, data_len_wr) + +genIFRwDataCode(4, 0x0302, True, 2, data_len_wr) + ) + + genPkt.addAfterExc(genWriteTransLenCode(gen_file_def, sm_idx) + +genWriteTransPktCode(gen_file_def, sm_idx) + +genTrgTransPktCode(gen_file_def, sm_idx) + +genReadAckPktCode(gen_file_def, sm_idx) + + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + + +genMessageCode("--清除中断") + +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + + +genMessageCode("--读取数据") + +genIFRwDataCode(1, 0x800, False, data_len) + +genIFRwDataCode(2, 0x800, False, data_len) + +genIFRwDataCode(3, 0x800, False, data_len) + +genIFRwDataCode(4, 0x800, False, data_len) + + +genTcEndFrameCode(gen_file_def)) + genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1) + + return gen_file_def + +def tc31(): + genPkt = GenPkt() + + gen_file_def = "base_tc31" + sm_idx = 0 + tc_des = "测试主站之间的同步,利用latch信号进行主站间的同步。\\n" + + genPkt.clean() + genPkt.setPktType(1) + + #subPkt参数:索引、索引类型、地址、命令、长度、数据 + #genPkt.addSubPkt(0x0, 0, 0x0, 0xc, 12, b'\0'*12) + + + genPkt.addBeforeExc(genTcStartFrameCode(gen_file_def, tc_des, "reg [63:0] latch_t1;\n reg [63:0] latch_t2;\n") + +genMessageCode("--清除中断") + +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genMessageCode("--复位4号设备") + +genIFRwDataCode(4, 0x40, True, 4, [0x01, 0x00, 0x66, 0x79]) + +"#5000" + #+genIFRwDataCode(4, 0x09, True, 1, [0, ], False, iface=1) + +using_proper_workmode(4) + +genIFRwDataCode(4, 0x0, True, 1, [1, ]) + +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + #+genEnableInsertTimeCode(0xa) + ) + + sm_idx = 0 + + genPkt.addAfterExc(genWriteTransLenCode(gen_file_def, sm_idx) + +genWriteTransPktCode(gen_file_def, sm_idx) + +genTrgTransPktCode(gen_file_def, sm_idx) + +genReadAckPktCode(gen_file_def, sm_idx) + +genMessageCode("--清除中断") + +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + ) + + genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1) + #------------------------------------------------------------------------- + genPkt.clean() + genPkt.setPktType(0) + + gen_file_def_ap = gen_file_def + "_rw01" + genPkt.addBeforeExc(genMessageCode("--读取事件寄存器组") + +genIFRwDataCode(0, 0x500, False, 0x48) + +genIFRwDataCode(1, 0x500, False, 0x48) + +genIFRwDataCode(2, 0x500, False, 0x48) + +genIFRwDataCode(3, 0x500, False, 0x48) + +genIFRwDataCode(4, 0x500, False, 0x48) + + +genMessageCode("--设置事件") + +genIFRwDataCode(0, 0x500, True, 4, [0x03, 0x00, 0x0F, 0x00] ) + +genIFRwDataCode(1, 0x500, True, 4, [0x0F, 0x00, 0x03, 0x00] ) + +genIFRwDataCode(2, 0x500, True, 4, [0x03, 0x00, 0x0F, 0x00] ) + +genIFRwDataCode(3, 0x500, True, 4, [0x0F, 0x00, 0x03, 0x00] ) + +genIFRwDataCode(4, 0x500, True, 4, [0x03, 0x00, 0x0F, 0x00] ) + + +genMessageCode("--读取事件寄存器组") + +genIFRwDataCode(0, 0x500, False, 0x48) + +genIFRwDataCode(1, 0x500, False, 0x48) + +genIFRwDataCode(2, 0x500, False, 0x48) + +genIFRwDataCode(3, 0x500, False, 0x48) + +genIFRwDataCode(4, 0x500, False, 0x48) + + +genIFRwDataCode(0, 0x148, True, 8, [0,] * 8) + +genIFRwDataCode(4, 0x148, True, 8, [0,] * 8) + ) + + genPkt.addAfterExc( "latch0 <= 1;\n" + +"latch1 <= 1;\n" + + +"#5000\n" + +"latch0 <= 0;\n" + +"latch1 <= 0;\n" + + +"#5000\n" + +"latch0 <= 1;\n" + +"latch1 <= 1;\n" + + +"#5000\n" + +"latch0 <= 0;\n" + +"latch1 <= 0;\n" + + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + + +genMessageCode("--清除中断") + +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + + +genMessageCode("--读取事件寄存器组") + +genIFRwDataCode(0, 0x500, False, 0x48) + +genIFRwDataCode(1, 0x500, False, 0x48) + +genIFRwDataCode(2, 0x500, False, 0x48) + +genIFRwDataCode(3, 0x500, False, 0x48) + +genIFRwDataCode(4, 0x500, False, 0x48) + + + '''spi_trans( (16'h0518), (`SPI_READ), (8), (`IF_IDX(0)));\n''' + #+ '''_temp_time = rxBuf[3] + (rxBuf[4] << 8) + (rxBuf[5] << 16) + (rxBuf[6] << 24) + (rxBuf[7] << 32) + (rxBuf[8] << 40) + (rxBuf[9] << 48) + (rxBuf[10] << 56);\n''' + + '''_temp_time = rxBuf[`ARRAY_IDX_OFF] + (rxBuf[`ARRAY_IDX_OFF+1] << 8) + (rxBuf[`ARRAY_IDX_OFF+2] << 16) + (rxBuf[`ARRAY_IDX_OFF+3] << 24) + (rxBuf[`ARRAY_IDX_OFF+4] << 32) + (rxBuf[`ARRAY_IDX_OFF+5] << 40) + (rxBuf[`ARRAY_IDX_OFF+6] << 48) + (rxBuf[`ARRAY_IDX_OFF+7] << 56);\n''' + + '''latch_t1 = _temp_time;\n\n''' + + + '''spi_trans( (16'h0518), (`SPI_READ), (8), (`IF_IDX(4)));\n''' + #+ '''_temp_time = rxBuf[3] + (rxBuf[4] << 8) + (rxBuf[5] << 16) + (rxBuf[6] << 24) + (rxBuf[7] << 32) + (rxBuf[8] << 40) + (rxBuf[9] << 48) + (rxBuf[10] << 56);\n''' + + '''_temp_time = rxBuf[`ARRAY_IDX_OFF] + (rxBuf[`ARRAY_IDX_OFF+1] << 8) + (rxBuf[`ARRAY_IDX_OFF+2] << 16) + (rxBuf[`ARRAY_IDX_OFF+3] << 24) + (rxBuf[`ARRAY_IDX_OFF+4] << 32) + (rxBuf[`ARRAY_IDX_OFF+5] << 40) + (rxBuf[`ARRAY_IDX_OFF+6] << 48) + (rxBuf[`ARRAY_IDX_OFF+7] << 56);\n''' + + '''latch_t2 = _temp_time;\n''' + + '''_temp_time = latch_t1 - latch_t2;\n\n''' + + + '''txBuf[`ARRAY_IDX_OFF] = _temp_time[7:0];\n''' + + '''txBuf[`ARRAY_IDX_OFF+1] = _temp_time[15:8];\n''' + + '''txBuf[`ARRAY_IDX_OFF+2] = _temp_time[23:16];\n''' + + '''txBuf[`ARRAY_IDX_OFF+3] = _temp_time[31:24];\n''' + + '''txBuf[`ARRAY_IDX_OFF+4] = _temp_time[39:32];\n''' + + '''txBuf[`ARRAY_IDX_OFF+5] = _temp_time[47:40];\n''' + + '''txBuf[`ARRAY_IDX_OFF+6] = _temp_time[55:48];\n''' + + '''txBuf[`ARRAY_IDX_OFF+7] = _temp_time[63:56];\n''' + + '''spi_trans( (16'h0148), (`SPI_WRITE), (8), (`IF_IDX(4)));\n''' + ) + + genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1, True, gen_file_def_ap) + + + #------------------------------------------------------------------------- + genPkt.clean() + genPkt.setPktType(0) + + gen_file_def_ap = gen_file_def + "_rw02" + genPkt.addBeforeExc(genMessageCode("--读取事件寄存器组") + +genIFRwDataCode(0, 0x500, False, 0x48) + +genIFRwDataCode(1, 0x500, False, 0x48) + +genIFRwDataCode(2, 0x500, False, 0x48) + +genIFRwDataCode(3, 0x500, False, 0x48) + +genIFRwDataCode(4, 0x500, False, 0x48) + + +genMessageCode("--设置事件") + +genIFRwDataCode(0, 0x500, True, 4, [0x03, 0x00, 0x0F, 0x00] ) + +genIFRwDataCode(1, 0x500, True, 4, [0x0F, 0x00, 0x03, 0x00] ) + +genIFRwDataCode(2, 0x500, True, 4, [0x03, 0x00, 0x0F, 0x00] ) + +genIFRwDataCode(3, 0x500, True, 4, [0x0F, 0x00, 0x03, 0x00] ) + +genIFRwDataCode(4, 0x500, True, 4, [0x03, 0x00, 0x0F, 0x00] ) + + +genMessageCode("--读取事件寄存器组") + +genIFRwDataCode(0, 0x500, False, 0x48) + +genIFRwDataCode(1, 0x500, False, 0x48) + +genIFRwDataCode(2, 0x500, False, 0x48) + +genIFRwDataCode(3, 0x500, False, 0x48) + +genIFRwDataCode(4, 0x500, False, 0x48) + ) + + genPkt.addAfterExc( "latch0 <= 1;\n" + +"latch1 <= 1;\n" + + +"#5000\n" + +"latch0 <= 0;\n" + +"latch1 <= 0;\n" + + +"#5000\n" + +"latch0 <= 1;\n" + +"latch1 <= 1;\n" + + +"#5000\n" + +"latch0 <= 0;\n" + +"latch1 <= 0;\n" + + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + + +genMessageCode("--清除中断") + +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + + +genMessageCode("--读取事件寄存器组") + +genIFRwDataCode(0, 0x500, False, 0x48) + +genIFRwDataCode(1, 0x500, False, 0x48) + +genIFRwDataCode(2, 0x500, False, 0x48) + +genIFRwDataCode(3, 0x500, False, 0x48) + +genIFRwDataCode(4, 0x500, False, 0x48) + ) + + genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1, True, gen_file_def_ap) + + #-------------------------------------------------------------------- + genPkt.clean() + genPkt.setPktType(0) + + gen_file_def_ap = gen_file_def + "_rw03" + genPkt.addBeforeExc(genMessageCode("--复位0号设备") + +"#100000\n" + +genIFRwDataCode(0, 0x40, True, 4, [0x01, 0x00, 0x66, 0x79]) + +"#5000\n" + #+genIFRwDataCode(0, 0x09, True, 1, [0, ], False, iface=1) + +using_proper_workmode(0) + +genIFRwDataCode(0, 0x0, True, 1, [1, ]) + +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(0, 0x7c, True, 2, [0x10, 0x80]) + +genIFRwDataCode(0, 0x70, True, 4, [0x03, 0x00, 0x00, 0xf0]) + + +genMessageCode("--读取事件寄存器组") + +genIFRwDataCode(0, 0x500, False, 0x48) + +genIFRwDataCode(1, 0x500, False, 0x48) + +genIFRwDataCode(2, 0x500, False, 0x48) + +genIFRwDataCode(3, 0x500, False, 0x48) + +genIFRwDataCode(4, 0x500, False, 0x48) + + +genMessageCode("--设置事件") + +genIFRwDataCode(0, 0x500, True, 4, [0x03, 0x00, 0x0F, 0x00] ) + +genIFRwDataCode(1, 0x500, True, 4, [0x0F, 0x00, 0x03, 0x00] ) + +genIFRwDataCode(2, 0x500, True, 4, [0x03, 0x00, 0x0F, 0x00] ) + +genIFRwDataCode(3, 0x500, True, 4, [0x0F, 0x00, 0x03, 0x00] ) + +genIFRwDataCode(4, 0x500, True, 4, [0x03, 0x00, 0x0F, 0x00] ) + + +genMessageCode("--读取事件寄存器组") + +genIFRwDataCode(0, 0x500, False, 0x48) + +genIFRwDataCode(1, 0x500, False, 0x48) + +genIFRwDataCode(2, 0x500, False, 0x48) + +genIFRwDataCode(3, 0x500, False, 0x48) + +genIFRwDataCode(4, 0x500, False, 0x48) + + +genIFRwDataCode(0, 0x148, True, 8, [0,] * 8) + +genIFRwDataCode(4, 0x148, True, 8, [0,] * 8) + ) + + genPkt.addAfterExc( "latch0 <= 1;\n" + +"latch1 <= 1;\n" + + +"#5000\n" + +"latch0 <= 0;\n" + +"latch1 <= 0;\n" + + +"#5000\n" + +"latch0 <= 1;\n" + +"latch1 <= 1;\n" + + +"#5000\n" + +"latch0 <= 0;\n" + +"latch1 <= 0;\n" + + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + + +genMessageCode("--清除中断") + +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + + +genMessageCode("--读取事件寄存器组") + +genIFRwDataCode(0, 0x500, False, 0x48) + +genIFRwDataCode(1, 0x500, False, 0x48) + +genIFRwDataCode(2, 0x500, False, 0x48) + +genIFRwDataCode(3, 0x500, False, 0x48) + +genIFRwDataCode(4, 0x500, False, 0x48) + + + '''spi_trans( (16'h0518), (`SPI_READ), (8), (`IF_IDX(0)));\n''' + #+ '''_temp_time = rxBuf[3] + (rxBuf[4] << 8) + (rxBuf[5] << 16) + (rxBuf[6] << 24) + (rxBuf[7] << 32) + (rxBuf[8] << 40) + (rxBuf[9] << 48) + (rxBuf[10] << 56);\n''' + + '''_temp_time = rxBuf[`ARRAY_IDX_OFF] + (rxBuf[`ARRAY_IDX_OFF+1] << 8) + (rxBuf[`ARRAY_IDX_OFF+2] << 16) + (rxBuf[`ARRAY_IDX_OFF+3] << 24) + (rxBuf[`ARRAY_IDX_OFF+4] << 32) + (rxBuf[`ARRAY_IDX_OFF+5] << 40) + (rxBuf[`ARRAY_IDX_OFF+6] << 48) + (rxBuf[`ARRAY_IDX_OFF+7] << 56);\n''' + + '''latch_t1 = _temp_time;\n\n''' + + + '''spi_trans( (16'h0518), (`SPI_READ), (8), (`IF_IDX(4)));\n''' + #+ '''_temp_time = rxBuf[3] + (rxBuf[4] << 8) + (rxBuf[5] << 16) + (rxBuf[6] << 24) + (rxBuf[7] << 32) + (rxBuf[8] << 40) + (rxBuf[9] << 48) + (rxBuf[10] << 56);\n''' + + '''_temp_time = rxBuf[`ARRAY_IDX_OFF] + (rxBuf[`ARRAY_IDX_OFF+1] << 8) + (rxBuf[`ARRAY_IDX_OFF+2] << 16) + (rxBuf[`ARRAY_IDX_OFF+3] << 24) + (rxBuf[`ARRAY_IDX_OFF+4] << 32) + (rxBuf[`ARRAY_IDX_OFF+5] << 40) + (rxBuf[`ARRAY_IDX_OFF+6] << 48) + (rxBuf[`ARRAY_IDX_OFF+7] << 56);\n''' + + '''latch_t2 = _temp_time;\n''' + + '''_temp_time = latch_t1 - latch_t2;\n\n''' + + + '''txBuf[`ARRAY_IDX_OFF] = _temp_time[7:0];\n''' + + '''txBuf[`ARRAY_IDX_OFF+1] = _temp_time[15:8];\n''' + + '''txBuf[`ARRAY_IDX_OFF+2] = _temp_time[23:16];\n''' + + '''txBuf[`ARRAY_IDX_OFF+3] = _temp_time[31:24];\n''' + + '''txBuf[`ARRAY_IDX_OFF+4] = _temp_time[39:32];\n''' + + '''txBuf[`ARRAY_IDX_OFF+5] = _temp_time[47:40];\n''' + + '''txBuf[`ARRAY_IDX_OFF+6] = _temp_time[55:48];\n''' + + '''txBuf[`ARRAY_IDX_OFF+7] = _temp_time[63:56];\n''' + + '''spi_trans( (16'h0148), (`SPI_WRITE), (8), (`IF_IDX(4)));\n''' + ) + + genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1, True, gen_file_def_ap) + + + #------------------------------------------------------------------------- + genPkt.clean() + genPkt.setPktType(0) + + gen_file_def_ap = gen_file_def + "_rw04" + genPkt.addBeforeExc(genMessageCode("--读取事件寄存器组") + +genIFRwDataCode(0, 0x500, False, 0x48) + +genIFRwDataCode(1, 0x500, False, 0x48) + +genIFRwDataCode(2, 0x500, False, 0x48) + +genIFRwDataCode(3, 0x500, False, 0x48) + +genIFRwDataCode(4, 0x500, False, 0x48) + + +genMessageCode("--设置事件") + +genIFRwDataCode(0, 0x500, True, 4, [0x03, 0x00, 0x0F, 0x00] ) + +genIFRwDataCode(1, 0x500, True, 4, [0x0F, 0x00, 0x03, 0x00] ) + +genIFRwDataCode(2, 0x500, True, 4, [0x03, 0x00, 0x0F, 0x00] ) + +genIFRwDataCode(3, 0x500, True, 4, [0x0F, 0x00, 0x03, 0x00] ) + +genIFRwDataCode(4, 0x500, True, 4, [0x03, 0x00, 0x0F, 0x00] ) + + +genMessageCode("--读取事件寄存器组") + +genIFRwDataCode(0, 0x500, False, 0x48) + +genIFRwDataCode(1, 0x500, False, 0x48) + +genIFRwDataCode(2, 0x500, False, 0x48) + +genIFRwDataCode(3, 0x500, False, 0x48) + +genIFRwDataCode(4, 0x500, False, 0x48) + ) + + genPkt.addAfterExc( "latch0 <= 1;\n" + +"latch1 <= 1;\n" + + +"#5000\n" + +"latch0 <= 0;\n" + +"latch1 <= 0;\n" + + +"#5000\n" + +"latch0 <= 1;\n" + +"latch1 <= 1;\n" + + +"#5000\n" + +"latch0 <= 0;\n" + +"latch1 <= 0;\n" + + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + + +genMessageCode("--清除中断") + +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + + +genMessageCode("--读取事件寄存器组") + +genIFRwDataCode(0, 0x500, False, 0x48) + +genIFRwDataCode(1, 0x500, False, 0x48) + +genIFRwDataCode(2, 0x500, False, 0x48) + +genIFRwDataCode(3, 0x500, False, 0x48) + +genIFRwDataCode(4, 0x500, False, 0x48) + ) + + genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1, True, gen_file_def_ap) + + + #-------------------------------------------------------------------- + #恢复系统 + genPkt.clean() + genPkt.setPktType(1) + gen_file_def_ap = gen_file_def+"_rw05" + sm_idx = 0 + + genPkt.addBeforeExc(genMessageCode("--恢复系统") + +genIFRwDataCode(4, 0x40, True, 4, [0x01, 0x00, 0x66, 0x79]) + +"#5000" + #+genIFRwDataCode(4, 0x09, True, 1, [0, ], False, iface=1) + +using_proper_workmode(4) + +genIFRwDataCode(4, 0x00, True, 1, [2, ]) + +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + ) + + genPkt.addAfterExc(genWriteTransLenCode(gen_file_def_ap, sm_idx) + +genWriteTransPktCode(gen_file_def_ap, sm_idx) + +genTrgTransPktCode(gen_file_def_ap, sm_idx) + +genReadAckPktCode(gen_file_def_ap, sm_idx) + + + +genMessageCode("--清除主中断") + +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + ) + genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1, True, gen_file_def_ap) + + genPkt.clean() + genPkt.setPktType(0) + gen_file_def_ap = gen_file_def+"_rw06" + sm_idx = 0 + + #genPkt.addBeforeExc(genMessageCode("--设置环境,进行第一次嗅探")) + + genPkt.addSubPkt(0x0, 0, 0x0, 0xb, 2, [0x3f, 0xff]) + + genPkt.addAfterExc(genWriteTransLenCode(gen_file_def_ap, sm_idx) + +genWriteTransPktCode(gen_file_def_ap, sm_idx) + +genTrgTransPktCode(gen_file_def_ap, sm_idx) + +genReadAckPktCode(gen_file_def_ap, sm_idx) + + + +genMessageCode("--清除主中断") + +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + ) + genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1, True, gen_file_def_ap) + + + genPkt.clean() + genPkt.setPktType(1) + gen_file_def_ap = gen_file_def+"_rw07" + sm_idx = 0 + + + genPkt.addAfterExc(genWriteTransLenCode(gen_file_def_ap, sm_idx) + +genWriteTransPktCode(gen_file_def_ap, sm_idx) + +genTrgTransPktCode(gen_file_def_ap, sm_idx) + +genReadAckPktCode(gen_file_def_ap, sm_idx) + + + +genMessageCode("--清除主中断") + +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genTcEndFrameCode(gen_file_def) + ) + genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1, True, gen_file_def_ap) + + return gen_file_def + diff --git a/tb/shinTest/testcase/broadcast.py b/tb/shinTest/testcase/broadcast.py index 564de0e..70ac708 100644 --- a/tb/shinTest/testcase/broadcast.py +++ b/tb/shinTest/testcase/broadcast.py @@ -1,196 +1,196 @@ -from pyutils import * - - -def tc1(): - genPkt = GenPkt() - - - gen_file_def = "broadcast_tc01" - sm_idx = 0 - tc_des = "发送广播数据包,广播读取,广播读回的数据是四个从站对应寄存器位与的结果。" - - #------------------------------------------------------------------------- - #>>>>>>广播读 - genPkt.clean() - genPkt.setPktType(0) - - #subPkt参数:索引、索引类型、地址、命令、长度、数据 - genPkt.addSubPkt(0x0, 0, 0xc0, 0xd, 4, b"\0"*4) - genPkt.addSubPkt(0x1, 0, 0xc0, 0x0, 4, b"\0"*4) - genPkt.addSubPkt(0x2, 0, 0xc0, 0x0, 4, b"\0"*4) - genPkt.addSubPkt(0x3, 0, 0xc0, 0x0, 4, b"\0"*4) - genPkt.addSubPkt(0x4, 0, 0xc0, 0x0, 4, b"\0"*4) - genPkt.addSubPkt(0x100, 0, 0xc0, 0xd, 4, b"\0"*4) - genPkt.addSubPkt(0x100, 0, 0xc0, 0xd, 4, b"\0"*4) - genPkt.addSubPkt(0x100, 0, 0xc0, 0xd, 4, b"\0"*4) - genPkt.addSubPkt(0x100, 0, 0xc0, 0xd, 4, b"\0"*4) - - - #gen_file_def = "bc_r_pkt" - sm_idx = 0 - - genPkt.addBeforeExc(genTcStartFrameCode(gen_file_def, tc_des) - +genMessageCode("--清除中断") - +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - ) - - genPkt.addAfterExc(genWriteTransLenCode(gen_file_def, sm_idx) - +genWriteTransPktCode(gen_file_def, sm_idx) - +genTrgTransPktCode(gen_file_def, sm_idx) - +genReadAckPktCode(gen_file_def, sm_idx) - - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - - +genMessageCode("--清除中断") - +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - - +genTcEndFrameCode(gen_file_def)) - - genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1) - return gen_file_def - - - -def tc2(): - genPkt = GenPkt() - - gen_file_def = "broadcast_tc02" - sm_idx = 0 - tc_des = "广播写入,写入SM0,32个字符长度的数据。" - - #------------------------------------------------------------------------- - #>>>>>>广播写 - genPkt.clean() - genPkt.setPktType(0) - - sm_size = 32 - #subPkt参数:索引、索引类型、地址、命令、长度、数据 - data = [0, ] * 2 - data[0] = sm_size & 0xff - data[1] = (sm_size >> 8) & 0xff - genPkt.addSubPkt(2000, 0, 0x0302, 0xe, 2, data) - - data = list(range(1, sm_size + 1)) - genPkt.addSubPkt(2000, 0, 0x0800, 0xe, sm_size, data) - - sm_idx = 0 - - genPkt.addBeforeExc(genTcStartFrameCode(gen_file_def, tc_des) - +genMessageCode("--清除中断") - +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - ) - - genPkt.addAfterExc(genWriteTransLenCode(gen_file_def, sm_idx) - +genWriteTransPktCode(gen_file_def, sm_idx) - +genTrgTransPktCode(gen_file_def, sm_idx) - +genReadAckPktCode(gen_file_def, sm_idx) - - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - - +genMessageCode("--清除中断") - +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - - +genMessageCode("--读取SM的状态") - +genIFRwDataCode(1, 0x300, False, 0x4) - +genIFRwDataCode(2, 0x300, False, 0x4) - +genIFRwDataCode(3, 0x300, False, 0x4) - +genIFRwDataCode(4, 0x300, False, 0x4) - - +genSlvSMReadData(1, 0, sm_size) - +genSlvSMReadData(2, 0, sm_size) - +genSlvSMReadData(3, 0, sm_size) - +genSlvSMReadData(4, 0, sm_size) - - +genTcEndFrameCode(gen_file_def)) - - genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1) - return gen_file_def - - -def tc3(): - genPkt = GenPkt() - - - gen_file_def = "broadcast_tc03" - sm_idx = 0 - tc_des = "广播读写,读写0xc0开始的链路寄存器组。所有从站设备采用位与策略往报文中输入。" - - #------------------------------------------------------------------------- - #>>>>>>广播读写 - genPkt.clean() - genPkt.setPktType(0) - - #subPkt参数:索引、索引类型、地址、命令、长度、数据 - data = bytearray(b"\0"*100) - genPkt.addSubPkt(1024, 0, 0x00c0, 0xf, 4, data) - - sm_idx = 0 - - genPkt.addBeforeExc(genTcStartFrameCode(gen_file_def, tc_des) - +genMessageCode("--清除中断") - +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - ) - - genPkt.addAfterExc(genWriteTransLenCode(gen_file_def, sm_idx) - +genWriteTransPktCode(gen_file_def, sm_idx) - +genTrgTransPktCode(gen_file_def, sm_idx) - +genReadAckPktCode(gen_file_def, sm_idx) - - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - - +genMessageCode("--清除中断") - +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - - +genTcEndFrameCode(gen_file_def)) - - genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1) - return gen_file_def - +from pyutils import * + + +def tc1(): + genPkt = GenPkt() + + + gen_file_def = "broadcast_tc01" + sm_idx = 0 + tc_des = "发送广播数据包,广播读取,广播读回的数据是四个从站对应寄存器位与的结果。" + + #------------------------------------------------------------------------- + #>>>>>>广播读 + genPkt.clean() + genPkt.setPktType(0) + + #subPkt参数:索引、索引类型、地址、命令、长度、数据 + genPkt.addSubPkt(0x0, 0, 0xc0, 0xd, 4, b"\0"*4) + genPkt.addSubPkt(0x1, 0, 0xc0, 0x0, 4, b"\0"*4) + genPkt.addSubPkt(0x2, 0, 0xc0, 0x0, 4, b"\0"*4) + genPkt.addSubPkt(0x3, 0, 0xc0, 0x0, 4, b"\0"*4) + genPkt.addSubPkt(0x4, 0, 0xc0, 0x0, 4, b"\0"*4) + genPkt.addSubPkt(0x100, 0, 0xc0, 0xd, 4, b"\0"*4) + genPkt.addSubPkt(0x100, 0, 0xc0, 0xd, 4, b"\0"*4) + genPkt.addSubPkt(0x100, 0, 0xc0, 0xd, 4, b"\0"*4) + genPkt.addSubPkt(0x100, 0, 0xc0, 0xd, 4, b"\0"*4) + + + #gen_file_def = "bc_r_pkt" + sm_idx = 0 + + genPkt.addBeforeExc(genTcStartFrameCode(gen_file_def, tc_des) + +genMessageCode("--清除中断") + +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + ) + + genPkt.addAfterExc(genWriteTransLenCode(gen_file_def, sm_idx) + +genWriteTransPktCode(gen_file_def, sm_idx) + +genTrgTransPktCode(gen_file_def, sm_idx) + +genReadAckPktCode(gen_file_def, sm_idx) + + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + + +genMessageCode("--清除中断") + +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + + +genTcEndFrameCode(gen_file_def)) + + genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1) + return gen_file_def + + + +def tc2(): + genPkt = GenPkt() + + gen_file_def = "broadcast_tc02" + sm_idx = 0 + tc_des = "广播写入,写入SM0,32个字符长度的数据。" + + #------------------------------------------------------------------------- + #>>>>>>广播写 + genPkt.clean() + genPkt.setPktType(0) + + sm_size = 32 + #subPkt参数:索引、索引类型、地址、命令、长度、数据 + data = [0, ] * 2 + data[0] = sm_size & 0xff + data[1] = (sm_size >> 8) & 0xff + genPkt.addSubPkt(2000, 0, 0x0302, 0xe, 2, data) + + data = list(range(1, sm_size + 1)) + genPkt.addSubPkt(2000, 0, 0x0800, 0xe, sm_size, data) + + sm_idx = 0 + + genPkt.addBeforeExc(genTcStartFrameCode(gen_file_def, tc_des) + +genMessageCode("--清除中断") + +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + ) + + genPkt.addAfterExc(genWriteTransLenCode(gen_file_def, sm_idx) + +genWriteTransPktCode(gen_file_def, sm_idx) + +genTrgTransPktCode(gen_file_def, sm_idx) + +genReadAckPktCode(gen_file_def, sm_idx) + + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + + +genMessageCode("--清除中断") + +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + + +genMessageCode("--读取SM的状态") + +genIFRwDataCode(1, 0x300, False, 0x4) + +genIFRwDataCode(2, 0x300, False, 0x4) + +genIFRwDataCode(3, 0x300, False, 0x4) + +genIFRwDataCode(4, 0x300, False, 0x4) + + +genSlvSMReadData(1, 0, sm_size) + +genSlvSMReadData(2, 0, sm_size) + +genSlvSMReadData(3, 0, sm_size) + +genSlvSMReadData(4, 0, sm_size) + + +genTcEndFrameCode(gen_file_def)) + + genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1) + return gen_file_def + + +def tc3(): + genPkt = GenPkt() + + + gen_file_def = "broadcast_tc03" + sm_idx = 0 + tc_des = "广播读写,读写0xc0开始的链路寄存器组。所有从站设备采用位与策略往报文中输入。" + + #------------------------------------------------------------------------- + #>>>>>>广播读写 + genPkt.clean() + genPkt.setPktType(0) + + #subPkt参数:索引、索引类型、地址、命令、长度、数据 + data = bytearray(b"\0"*100) + genPkt.addSubPkt(1024, 0, 0x00c0, 0xf, 4, data) + + sm_idx = 0 + + genPkt.addBeforeExc(genTcStartFrameCode(gen_file_def, tc_des) + +genMessageCode("--清除中断") + +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + ) + + genPkt.addAfterExc(genWriteTransLenCode(gen_file_def, sm_idx) + +genWriteTransPktCode(gen_file_def, sm_idx) + +genTrgTransPktCode(gen_file_def, sm_idx) + +genReadAckPktCode(gen_file_def, sm_idx) + + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + + +genMessageCode("--清除中断") + +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + + +genTcEndFrameCode(gen_file_def)) + + genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1) + return gen_file_def + diff --git a/tb/shinTest/testcase/ebmmu.py b/tb/shinTest/testcase/ebmmu.py index 04e1a68..58d7cec 100644 --- a/tb/shinTest/testcase/ebmmu.py +++ b/tb/shinTest/testcase/ebmmu.py @@ -1,4355 +1,4355 @@ -from pyutils import * - -def tc1(): - genPkt = GenPkt() - - gen_file_def = "ebmmu_tc01" - sm_idx = 0 - tc_des = "每个从站都使用ebmmu[0],共4个mmu,从0x1000_0000位置向后对齐,每个设备占10个字节,\\n" \ - + "映射0x200~0x20a,中间无字节空洞。主站使用1个子包,将4个设备的数据一次性读上来。\\n"\ - + "检查内容:ebmmu工作状态、回包工作计数、SMx的状态、中断状态、统计信息、相关时序" - - #------------------------------------------------------------------------- - #>>>>>>设置EB-MMU 1 - genPkt.clean() - genPkt.setPktType(0) - - genPkt.addSubPkt(0x0, 0, 0x0018, 0xe, 2, [0x1, 0x58]) - #subPkt参数:索引、索引类型、地址、命令、长度、数据 - data = [0,] * 30 - setting_ebmmu_regs(data, 0, 0x10000000, 0x0200, 0x0a, 0x3, 0x1) - genPkt.addSubPkt(0x1, 0, 0x0200, 0x1, 10, data) - - - data = [0,] * 30 - setting_ebmmu_regs(data, 0, 0x1000000a, 0x0200, 0x0a, 0x3, 0x1) - genPkt.addSubPkt(0x2, 0, 0x0200, 0x1, 10, data) - - - data = [0,] * 30 - setting_ebmmu_regs(data, 0, 0x10000014, 0x0200, 0x0a, 0x3, 0x1) - genPkt.addSubPkt(0x3, 0, 0x0200, 0x1, 10, data) - - data = [0,] * 30 - setting_ebmmu_regs(data, 0, 0x1000001e, 0x0200, 0x0a, 0x3, 0x1) - genPkt.addSubPkt(0x4, 0, 0x0200, 0x1, 10, data) - - - genPkt.addSubPkt(0x0, 0, 0x0018, 0xe, 2, [0x0, 0x58]) - - genPkt.addBeforeExc(genTcStartFrameCode(gen_file_def, tc_des) - +genMessageCode("--清除中断") - +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff])) - - genPkt.addAfterExc(genWriteTransLenCode(gen_file_def, sm_idx) - +genWriteTransPktCode(gen_file_def, sm_idx) - +genTrgTransPktCode(gen_file_def, sm_idx) - +genReadAckPktCode(gen_file_def, sm_idx) - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - - +genMessageCode("--清除中断") - +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - ) - - genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1) - - #>>>>>>读取EB-MMU的设置 - genPkt.clean() - genPkt.setPktType(0) - - #subPkt参数:索引、索引类型、地址、命令、长度、数据 - data = [0,] * 40 - - genPkt.addSubPkt(0x01, 0, 0x0200, 0x0, 10, data) - genPkt.addSubPkt(0x02, 0, 0x0200, 0x0, 10, data) - genPkt.addSubPkt(0x03, 0, 0x0200, 0x0, 10, data) - genPkt.addSubPkt(0x04, 0, 0x0200, 0x0, 10, data) - - gen_file_def_ap = gen_file_def + "_rw1" - sm_idx = 0 - - genPkt.addAfterExc(genWriteTransLenCode(gen_file_def_ap, sm_idx) - +genWriteTransPktCode(gen_file_def_ap, sm_idx) - +genTrgTransPktCode(gen_file_def_ap, sm_idx) - +genReadAckPktCode(gen_file_def_ap, sm_idx) - - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - - +genMessageCode("--清除中断") - +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - ) - - genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1, True, gen_file_def_ap) - - #>>>>>>用EB-MMU方式读取EB-MMU设置 - genPkt.clean() - genPkt.setPktType(0) - - #subPkt参数:索引、索引类型、地址、命令、长度、数据 - data = [0,] * 40 - - genPkt.addSubPkt(0x1000, 2, 0x0000, 0x0, 40, data) - - gen_file_def_ap = gen_file_def + "_rw2" - sm_idx = 0 - - genPkt.addAfterExc(genWriteTransLenCode(gen_file_def_ap, sm_idx) - +genWriteTransPktCode(gen_file_def_ap, sm_idx) - +genTrgTransPktCode(gen_file_def_ap, sm_idx) - +genReadAckPktCode(gen_file_def_ap, sm_idx) - - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - - +genMessageCode("--清除中断") - +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - - +genTcEndFrameCode(gen_file_def) - ) - - genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1, True, gen_file_def_ap) - - return gen_file_def - - -def tc2(): - genPkt = GenPkt() - - gen_file_def = "ebmmu_tc02" - sm_idx = 0 - tc_des = "每个从站都使用ebmmu[1],共4个mmu,从0x2000_0000位置向后对齐,每个设备占16个字节,\\n" \ - + "映射0x00~0x10,中间无字节空洞。主站使用1个子包,将4个设备的数据一次性读上来。\\n"\ - + "检查内容:ebmmu工作状态、回包工作计数、SMx的状态、中断状态、统计信息、相关时序" - - #------------------------------------------------------------------------- - #>>>>>>设置EB-MMU 2 - genPkt.clean() - genPkt.setPktType(0) - genPkt.addSubPkt(0x0, 0, 0x0018, 0xe, 2, [0x1, 0x58]) - #subPkt参数:索引、索引类型、地址、命令、长度、数据 - data = [0,] * 30 - setting_ebmmu_regs(data, 0, 0x20000000, 0x0000, 0x10, 0x1, 0x1) - genPkt.addSubPkt(0x1, 0, 0x020a, 0x1, 10, data) - - - data = [0,] * 30 - setting_ebmmu_regs(data, 0, 0x20000010, 0x0000, 0x10, 0x1, 0x1) - genPkt.addSubPkt(0x2, 0, 0x020a, 0x1, 10, data) - - - data = [0,] * 30 - setting_ebmmu_regs(data, 0, 0x20000020, 0x0000, 0x10, 0x1, 0x1) - genPkt.addSubPkt(0x3, 0, 0x020a, 0x1, 10, data) - - data = [0,] * 30 - setting_ebmmu_regs(data, 0, 0x20000030, 0x0000, 0x10, 0x1, 0x1) - genPkt.addSubPkt(0x4, 0, 0x020a, 0x1, 10, data) - genPkt.addSubPkt(0x0, 0, 0x0018, 0xe, 2, [0x0, 0x58]) - - genPkt.addBeforeExc(genTcStartFrameCode(gen_file_def, tc_des) - +genMessageCode("--清除中断") - +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - ) - - genPkt.addAfterExc(genWriteTransLenCode(gen_file_def, sm_idx) - +genWriteTransPktCode(gen_file_def, sm_idx) - +genTrgTransPktCode(gen_file_def, sm_idx) - +genReadAckPktCode(gen_file_def, sm_idx) - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - - +genMessageCode("--清除中断") - +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - ) - - genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1) - - #>>>>>>读取数据 - genPkt.clean() - genPkt.setPktType(0) - - #subPkt参数:索引、索引类型、地址、命令、长度、数据 - data = [0,] * 40 - - genPkt.addSubPkt(0x01, 0, 0x0000, 0x0, 16, data) - genPkt.addSubPkt(0x02, 0, 0x0000, 0x0, 16, data) - genPkt.addSubPkt(0x03, 0, 0x0000, 0x0, 16, data) - genPkt.addSubPkt(0x04, 0, 0x0000, 0x0, 16, data) - - gen_file_def_ap = gen_file_def + "_rw1" - sm_idx = 0 - - genPkt.addAfterExc(genWriteTransLenCode(gen_file_def_ap, sm_idx) - +genWriteTransPktCode(gen_file_def_ap, sm_idx) - +genTrgTransPktCode(gen_file_def_ap, sm_idx) - +genReadAckPktCode(gen_file_def_ap, sm_idx) - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - - +genMessageCode("--清除中断") - +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - ) - - genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1, True, gen_file_def_ap) - - #>>>>>>用EB-MMU方式读取EB-MMU设置 - genPkt.clean() - genPkt.setPktType(0) - - #subPkt参数:索引、索引类型、地址、命令、长度、数据 - data = [0,] * 100 - - genPkt.addSubPkt(0x2000, 2, 0x0000, 0x0, 0x40, data) - - gen_file_def_ap = gen_file_def + "_rw2" - sm_idx = 0 - - genPkt.addAfterExc(genWriteTransLenCode(gen_file_def_ap, sm_idx) - +genWriteTransPktCode(gen_file_def_ap, sm_idx) - +genTrgTransPktCode(gen_file_def_ap, sm_idx) - +genReadAckPktCode(gen_file_def_ap, sm_idx) - - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - - +genMessageCode("--清除中断") - +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - - +genTcEndFrameCode(gen_file_def)) - - genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1,True, gen_file_def_ap) - return gen_file_def - - - -def tc3(): - genPkt = GenPkt() - - gen_file_def = "ebmmu_tc03" - sm_idx = 0 - tc_des = "每个从站都使用ebmmu[0]和ebmmu[2],共8个mmu,从0x1000_0000位置向后对齐,每个设备占22个字节,\\n" \ - + "先依次映射0x200~0x20a, 然后依次映射0x000~0x00c,中间无字节空洞。使用1个子包,将4个设备的数据一次性读上来。\\n"\ - + "注意:该测试用例读取时是从0x1000_0000开始读取的\\n"\ - + "检查内容:ebmmu工作状态、回包工作计数、SMx的状态、中断状态、统计信息、相关时序" - - #------------------------------------------------------------------------- - #>>>>>>设置EB-MMU 3 - genPkt.clean() - genPkt.setPktType(0) - genPkt.addSubPkt(0x0, 0, 0x0018, 0xe, 2, [0x1, 0x58]) - #subPkt参数:索引、索引类型、地址、命令、长度、数据 - data = [0,] * 30 - setting_ebmmu_regs(data, 0, 0x10000000, 0x0200, 0x0a, 0x3, 0x1) - genPkt.addSubPkt(0x1, 0, 0x0200, 0x1, 10, data) - - data = [0,] * 30 - setting_ebmmu_regs(data, 0, 0x1000000a, 0x0200, 0x0a, 0x3, 0x1) - genPkt.addSubPkt(0x2, 0, 0x0200, 0x1, 10, data) - - - data = [0,] * 30 - setting_ebmmu_regs(data, 0, 0x10000014, 0x0200, 0x0a, 0x3, 0x1) - genPkt.addSubPkt(0x3, 0, 0x0200, 0x1, 10, data) - - data = [0,] * 30 - setting_ebmmu_regs(data, 0, 0x1000001e, 0x0200, 0x0a, 0x3, 0x1) - genPkt.addSubPkt(0x4, 0, 0x0200, 0x1, 10, data) - - #subPkt参数:索引、索引类型、地址、命令、长度、数据 - data = [0,] * 30 - setting_ebmmu_regs(data, 0, 0x1000001e+0xa, 0x0000, 0x0c, 0x1, 0x1) - genPkt.addSubPkt(0x1, 0, 0x0214, 0x1, 10, data) - - - data = [0,] * 30 - setting_ebmmu_regs(data, 0, 0x1000001e+0xa+0xc, 0x0000, 0x0c, 0x1, 0x1) - genPkt.addSubPkt(0x2, 0, 0x0214, 0x1, 10, data) - - - data = [0,] * 30 - setting_ebmmu_regs(data, 0, 0x1000001e+0xa+0xc+0xc, 0x0000, 0x0c, 0x1, 0x1) - genPkt.addSubPkt(0x3, 0, 0x0214, 0x1, 10, data) - - data = [0,] * 30 - setting_ebmmu_regs(data, 0, 0x1000001e+0xa+0xc+0xc+0xc, 0x0000, 0x0c, 0x1, 0x1) - genPkt.addSubPkt(0x4, 0, 0x0214, 0x1, 10, data) - - genPkt.addSubPkt(0x0, 0, 0x0018, 0xe, 2, [0x0, 0x58]) - - genPkt.addBeforeExc(genTcStartFrameCode(gen_file_def, tc_des) - +genMessageCode("--清除中断") - +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - ) - - genPkt.addAfterExc(genWriteTransLenCode(gen_file_def, sm_idx) - +genWriteTransPktCode(gen_file_def, sm_idx) - +genTrgTransPktCode(gen_file_def, sm_idx) - +genReadAckPktCode(gen_file_def, sm_idx) - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - - +genMessageCode("--清除中断") - +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - ) - - genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1) - - #>>>>>>用EB-MMU方式读取EB-MMU设置 - genPkt.clean() - genPkt.setPktType(0) - - #subPkt参数:索引、索引类型、地址、命令、长度、数据 - data = [0,] * 150 - - genPkt.addSubPkt(0x1000, 2, 0x0000, 0x0, 0x0c * 4 + 0x28, data) - - gen_file_def_ap = "ebmmu_tc03_rw" - sm_idx = 0 - - genPkt.addAfterExc(genWriteTransLenCode(gen_file_def_ap, sm_idx) - +genWriteTransPktCode(gen_file_def_ap, sm_idx) - +genTrgTransPktCode(gen_file_def_ap, sm_idx) - +genReadAckPktCode(gen_file_def_ap, sm_idx) - - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - - +genMessageCode("--清除中断") - +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - - +genTcEndFrameCode(gen_file_def)) - - genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1, True, gen_file_def_ap) - return gen_file_def - - -def tc4(): - genPkt = GenPkt() - - gen_file_def = "ebmmu_tc04" - sm_idx = 0 - tc_des = "每个从站使用ebmmu[3],共4个mmu,从0x1000_0058位置向后对齐,映射设备1的SM1、设备2的SM3、\\n" \ - + "设备3的SM5、设备4的SM7,分别占用不同大小的空间。使用1个子包,将4个设备的数据一次性读上来。\\n"\ - + "检查内容:ebmmu工作状态、回包工作计数、SMx的状态、中断状态、统计信息、相关时序" - - #------------------------------------------------------------------------- - #>>>>>>设置EB-MMU 4 - genPkt.clean() - genPkt.setPktType(0) - - genPkt.addBeforeExc(genTcStartFrameCode(gen_file_def, tc_des) - +genMessageCode("--清除中断") - +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - + genSlvSMWriteData(1, 1, 0x80) - + genSlvSMWriteData(2, 3, 0x98) - + genSlvSMWriteData(3, 5, 0x81) - + genSlvSMWriteData(4, 7, 0x8c)) - - genPkt.addSubPkt(0x0, 0, 0x0018, 0xe, 2, [0x1, 0x58]) - - #subPkt参数:索引、索引类型、地址、命令、长度、数据 - data = [0,] * 30 - setting_ebmmu_regs(data, 0, 0x10000058, 0x1000, 0x80, 0x1, 0x1) - genPkt.addSubPkt(0x1, 0, 0x021e, 0x1, 10, data) - - - data = [0,] * 30 - addr = 0x58 + 0x80 - setting_ebmmu_regs(data, 0, 0x10000000+addr, 0x2000, 0x98, 0x1, 0x1) - genPkt.addSubPkt(0x2, 0, 0x021e, 0x1, 10, data) - - - data = [0,] * 30 - addr = 0x58 + 0x80 + 0x98 - setting_ebmmu_regs(data, 0, 0x10000000+addr, 0x3000, 0x81, 0x1, 0x1) - genPkt.addSubPkt(0x3, 0, 0x021e, 0x1, 10, data) - - data = [0,] * 30 - - addr = 0x58 + 0x80 + 0x98 + 0x81 - setting_ebmmu_regs(data, 0, 0x10000000+addr, 0x4000, 0x8c, 0x1, 0x1) - genPkt.addSubPkt(0x4, 0, 0x021e, 0x1, 10, data) - genPkt.addSubPkt(0x0, 0, 0x0018, 0xe, 2, [0x1, 0x58]) - - - - sm_idx = 0 - - genPkt.addAfterExc(genWriteTransLenCode(gen_file_def, sm_idx) - +genWriteTransPktCode(gen_file_def, sm_idx) - +genTrgTransPktCode(gen_file_def, sm_idx) - +genReadAckPktCode(gen_file_def, sm_idx) - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - - +genMessageCode("--清除中断") - +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - ) - - genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1) - - #>>>>>>用EB-MMU方式读取EB-MMU设置 - genPkt.clean() - genPkt.setPktType(0) - - #subPkt参数:索引、索引类型、地址、命令、长度、数据 - data = [0,] * 550 - - genPkt.addSubPkt(0x1000, 2, 0x0058, 0x0, 0x80+0x98+0x81+0x8c, data) - - gen_file_def_ap = gen_file_def + "_rw" - sm_idx = 0 - - genPkt.addAfterExc(genWriteTransLenCode(gen_file_def_ap, sm_idx) - +genWriteTransPktCode(gen_file_def_ap, sm_idx) - +genTrgTransPktCode(gen_file_def_ap, sm_idx) - +genReadAckPktCode(gen_file_def_ap, sm_idx) - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - - +genMessageCode("--清除中断") - +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - - +genTcEndFrameCode(gen_file_def) - ) - - genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1, True, gen_file_def_ap) - return gen_file_def - - - -def tc5(): - genPkt = GenPkt() - - gen_file_def = "ebmmu_tc05" - sm_idx = 0 - tc_des = "每个从站使用ebmmu[3],共4个mmu,从0x1000_0058位置向后对齐,映射设备1的SM1、设备2的SM3、\\n" \ - + "设备3的SM5、设备4的SM7,分别占用不同大小的空间。使用1个子包,将4个设备的数据一次性读上来。\\n"\ - + "由于没有写入数据,读上来的数据全部是无效数据。\\n"\ - + "检查内容:ebmmu工作状态、回包工作计数、SMx的状态、中断状态、统计信息、相关时序" - - genPkt.clean() - genPkt.setPktType(0) - - genPkt.addBeforeExc(genTcStartFrameCode(gen_file_def, tc_des) - +genMessageCode("--清除中断") - +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff])) - - genPkt.addSubPkt(0x0, 0, 0x0018, 0xe, 2, [0x1, 0x58]) - #subPkt参数:索引、索引类型、地址、命令、长度、数据 - data = [0,] * 30 - setting_ebmmu_regs(data, 0, 0x10000058, 0x1000, 0x80, 0x1, 0x1) - genPkt.addSubPkt(0x1, 0, 0x021e, 0x1, 10, data) - - - data = [0,] * 30 - addr = 0x58 + 0x80 - setting_ebmmu_regs(data, 0, 0x10000000+addr, 0x2000, 0x98, 0x1, 0x1) - genPkt.addSubPkt(0x2, 0, 0x021e, 0x1, 10, data) - - - data = [0,] * 30 - addr = 0x58 + 0x80 + 0x98 - setting_ebmmu_regs(data, 0, 0x10000000+addr, 0x3000, 0x81, 0x1, 0x1) - genPkt.addSubPkt(0x3, 0, 0x021e, 0x1, 10, data) - - data = [0,] * 30 - - addr = 0x58 + 0x80 + 0x98 + 0x81 - setting_ebmmu_regs(data, 0, 0x10000000+addr, 0x4000, 0x8c, 0x1, 0x1) - genPkt.addSubPkt(0x4, 0, 0x021e, 0x1, 10, data) - - genPkt.addSubPkt(0x0, 0, 0x0018, 0xe, 2, [0x0, 0x58]) - sm_idx = 0 - - genPkt.addAfterExc(genWriteTransLenCode(gen_file_def, sm_idx) - +genWriteTransPktCode(gen_file_def, sm_idx) - +genTrgTransPktCode(gen_file_def, sm_idx) - +genReadAckPktCode(gen_file_def, sm_idx) - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - - +genMessageCode("--清除中断") - +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - ) - - genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1) - - #------------------------------------------------------------------------- - #>>>>>>用EB-MMU方式读取EB-MMU设置 5 - genPkt.clean() - genPkt.setPktType(0) - - #subPkt参数:索引、索引类型、地址、命令、长度、数据 - data = [0,] * 550 - - genPkt.addSubPkt(0x1000, 2, 0x0058, 0x0, 0x80+0x98+0x81+0x8c, data) - - gen_file_def_ap = gen_file_def + "_rw" - sm_idx = 0 - - genPkt.addAfterExc(genWriteTransLenCode(gen_file_def_ap, sm_idx) - +genWriteTransPktCode(gen_file_def_ap, sm_idx) - +genTrgTransPktCode(gen_file_def_ap, sm_idx) - +genReadAckPktCode(gen_file_def_ap, sm_idx) - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - - +genMessageCode("--清除中断") - +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - +genTcEndFrameCode(gen_file_def)) - - genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1, True, gen_file_def_ap) - return gen_file_def - - -def tc6(): - genPkt = GenPkt() - - gen_file_def = "ebmmu_tc06" - sm_idx = 0 - tc_des = "每个从站测试1个ebmmu[4],共4个mmu,从0x1000_027d位置向后对齐,每个设备占128个字节。\\n" \ - + "主站使用1个子包,将4个设备的数据一次性读上来。\\n"\ - + "检查内容:ebmmu工作状态、回包工作计数、SMx的状态、中断状态、统计信息、相关时序" - - #-------------------------------------------------------------------------- - #>>>>>>设置EB-MMU,测试用例6 - genPkt.clean() - genPkt.setPktType(0) - - genPkt.addSubPkt(0x0, 0, 0x0018, 0xe, 2, [0x1, 0x58]) - addr_off = 0x58 + 0x80 + 0x98 + 0x81 + 0x8c - - #subPkt参数:索引、索引类型、地址、命令、长度、数据 - data = [0,] * 30 - - addr = addr_off + 0x0 - setting_ebmmu_regs(data, 0, 0x10000000+addr, 0x0800, 0x80, 0x3, 0x1) - genPkt.addSubPkt(0x1, 0, 0x0228, 0x1, 10, data) - - data = [0,] * 30 - addr = addr + 0x80 - setting_ebmmu_regs(data, 0, 0x10000000+addr, 0x0800, 0x80, 0x3, 0x1) - genPkt.addSubPkt(0x2, 0, 0x0228, 0x1, 10, data) - - - data = [0,] * 30 - addr = addr + 0x80 - setting_ebmmu_regs(data, 0, 0x10000000+addr, 0x0800, 0x80, 0x3, 0x1) - genPkt.addSubPkt(0x3, 0, 0x0228, 0x1, 10, data) - - data = [0,] * 30 - - addr = addr + 0x80 - setting_ebmmu_regs(data, 0, 0x10000000+addr, 0x0800, 0x80, 0x3, 0x1) - genPkt.addSubPkt(0x4, 0, 0x0228, 0x1, 10, data) - - data = [0,] * 2 - data[0] = 0x80 - data[1] = 0x00 - genPkt.addSubPkt(0x0, 0, 0x302, 0xe, 2, data) - genPkt.addSubPkt(0x0, 0, 0x0018, 0xe, 2, [0x0, 0x58]) - - #gen_file_def = "ebmmu_tc6_settings" - sm_idx = 0 - - genPkt.addBeforeExc(genTcStartFrameCode(gen_file_def, tc_des) - +genMessageCode("--清除中断") - +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - ) - - genPkt.addAfterExc(genWriteTransLenCode(gen_file_def, sm_idx) - +genWriteTransPktCode(gen_file_def, sm_idx) - +genTrgTransPktCode(gen_file_def, sm_idx) - +genReadAckPktCode(gen_file_def, sm_idx) - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - - +genMessageCode("--清除中断") - +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - ) - - genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1) - - #>>>>>>用EB-MMU方式读取EB-MMU设置 - genPkt.clean() - genPkt.setPktType(0) - - #subPkt参数:索引、索引类型、地址、命令、长度、数据 - data = [0,] * 0x80 * 4 - for i in range(0x80 * 4): - if i < 0x80: - data[i] = i & 0xff - elif i < 0x80+0x80: - data[i] = (i + 2 - 0x80) & 0xff - elif i < 0x80+0x80+0x80: - data[i] = (i + 3 - 0x80 - 0x80) & 0xff - else: - data[i] = (i + 5 - 0x80 - 0x80 - 0x80) & 0xff - - genPkt.addSubPkt(0x1000, 2, addr_off, 0x1, 0x80 * 4, data) - - gen_file_def_ap = "ebmmu_tc6_rw" - sm_idx = 0 - - genPkt.addAfterExc(genWriteTransLenCode(gen_file_def_ap, sm_idx) - +genWriteTransPktCode(gen_file_def_ap, sm_idx) - +genTrgTransPktCode(gen_file_def_ap, sm_idx) - +genReadAckPktCode(gen_file_def_ap, sm_idx) - +genSlvSMReadData(1, 0, 0x80) - +genSlvSMReadData(2, 0, 0x80) - +genSlvSMReadData(3, 0, 0x80) - +genSlvSMReadData(4, 0, 0x80) - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - - +genMessageCode("--清除中断") - +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - +genTcEndFrameCode(gen_file_def)) - - genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1, True, gen_file_def_ap) - return gen_file_def - - -def tc7(): - genPkt = GenPkt() - - - gen_file_def = "ebmmu_tc07" - sm_idx = 0 - tc_des = "每个从站测试1个ebmmu[4],共4个mmu,从0x2000_027d位置向后对齐,映射每个设备的SM0,\\n" \ - + "每个设备占128个字节。主站使用1个子包,将4个设备的数据一次性写入。\\n"\ - + "检查内容:ebmmu工作状态、回包工作计数、SMx的状态、中断状态、统计信息、相关时序" - - - #-------------------------------------------------------------------------- - #>>>>>>设置EB-MMU,测试用例7 - genPkt.clean() - genPkt.setPktType(0) - - genPkt.addSubPkt(0x0, 0, 0x0018, 0xe, 2, [0x1, 0x58]) - addr_off = 0x58 + 0x80 + 0x98 + 0x81 + 0x8c - - #subPkt参数:索引、索引类型、地址、命令、长度、数据 - data = [0,] * 30 - - addr = addr_off + 0x0 - #print(hex(addr)) - setting_ebmmu_regs(data, 0, 0x10000000+addr, 0x0800, 0x80, 0x3, 0x1) - genPkt.addSubPkt(0x1, 0, 0x0228, 0x1, 10, data) - - data = [0,] * 30 - addr = addr + 0x80 - #print(hex(addr)) - setting_ebmmu_regs(data, 0, 0x10000000+addr, 0x0800, 0x80, 0x3, 0x1) - genPkt.addSubPkt(0x2, 0, 0x0228, 0x1, 10, data) - - - data = [0,] * 30 - addr = addr + 0x80 - #print(hex(addr)) - setting_ebmmu_regs(data, 0, 0x10000000+addr, 0x0800, 0x80, 0x3, 0x1) - genPkt.addSubPkt(0x3, 0, 0x0228, 0x1, 10, data) - - data = [0,] * 30 - - addr = addr + 0x80 - #print(hex(addr)) - setting_ebmmu_regs(data, 0, 0x10000000+addr, 0x0800, 0x80, 0x3, 0x1) - genPkt.addSubPkt(0x4, 0, 0x0228, 0x1, 10, data) - - data = [0,] * 2 - data[0] = 0x80 - data[1] = 0x00 - genPkt.addSubPkt(0x0, 0, 0x302, 0xe, 2, data) - - #gen_file_def = "ebmmu_tc7_settings" - sm_idx = 0 - - genPkt.addSubPkt(0x0, 0, 0x0018, 0xe, 2, [0x0, 0x58]) - - genPkt.addBeforeExc(genTcStartFrameCode(gen_file_def, tc_des) - +genMessageCode("--清除中断") - +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - ) - - genPkt.addAfterExc(genWriteTransLenCode(gen_file_def, sm_idx) - +genWriteTransPktCode(gen_file_def, sm_idx) - +genTrgTransPktCode(gen_file_def, sm_idx) - +genReadAckPktCode(gen_file_def, sm_idx) - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - - +genMessageCode("--清除中断") - +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - ) - - genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1) - - #>>>>>>用EB-MMU方式读取EB-MMU设置 - genPkt.clean() - genPkt.setPktType(0) - - #subPkt参数:索引、索引类型、地址、命令、长度、数据 - data = [0,] * 0x80 * 4 - for i in range(0x80 * 4): - if i < 0x80: - data[i] = i & 0xff - elif i < 0x80+0x80: - data[i] = (i + 2 - 0x80) & 0xff - elif i < 0x80+0x80+0x80: - data[i] = (i + 3 - 0x80 - 0x80) & 0xff - else: - data[i] = (i + 5 - 0x80 - 0x80 - 0x80) & 0xff - - genPkt.addSubPkt(0x1000, 2, addr_off, 0x1, 0x80 * 4, data) - - gen_file_def_ap = "ebmmu_tc7_rw" - sm_idx = 0 - - genPkt.addAfterExc(genWriteTransLenCode(gen_file_def_ap, sm_idx) - +genWriteTransPktCode(gen_file_def_ap, sm_idx) - +genTrgTransPktCode(gen_file_def_ap, sm_idx) - +genReadAckPktCode(gen_file_def_ap, sm_idx) - +genSlvSMReadData(1, 0, 0x80) - +genSlvSMReadData(2, 0, 0x80) - +genSlvSMReadData(3, 0, 0x80) - +genSlvSMReadData(4, 0, 0x80) - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - - +genMessageCode("--清除中断") - +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - +genTcEndFrameCode(gen_file_def)) - - genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1, True, gen_file_def_ap) - return gen_file_def - - -def tc8(): - genPkt = GenPkt() - - gen_file_def = "ebmmu_tc08" - sm_idx = 0 - tc_des = "每个从站都使用ebmmu[0],从0x1000_0000位置向后对齐,每个设备都映射0x800,每个设备占128个字节。\\n" \ - + "主站使用1个子包,将4个设备的数据一次性写下去。相当于使用单播命令模拟广播命令。\\n"\ - + "ebmmu放出的权限是0x1(只读),但子包的权限要求是只写,两相冲突,子包拒绝执行。\\n"\ - + "从站也无法得到真正有效的数据。\\n"\ - + "检查内容:ebmmu工作状态、回包工作计数、SMx的状态、中断状态、统计信息、相关时序" - - #-------------------------------------------------------------------------- - #>>>>>>设置EB-MMU,测试用例8,广播写,检查权限 - genPkt.clean() - genPkt.setPktType(0) - - genPkt.addSubPkt(0x0, 0, 0x0018, 0xe, 2, [0x1, 0x58]) - addr_off = 0x0 - - #subPkt参数:索引、索引类型、地址、命令、长度、数据 - data = [0,] * 256 - - addr = addr_off + 0x0 - setting_ebmmu_regs(data, 0, 0x10000000+addr, 0x0800, 0x80, 0x1, 0x1) - genPkt.addSubPkt(0x1, 0, 0x0200, 0xe, 160, data) - - data = [0,] * 2 - data[0] = 0x80 - data[1] = 0x00 - genPkt.addSubPkt(0x0, 0, 0x302, 0xe, 2, data) - genPkt.addSubPkt(0x0, 0, 0x0018, 0xe, 2, [0x0, 0x58]) - - sm_idx = 0 - - genPkt.addBeforeExc(genTcStartFrameCode(gen_file_def, tc_des) - +genMessageCode("--清除中断") - +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - ) - - genPkt.addAfterExc(genWriteTransLenCode(gen_file_def, sm_idx) - +genWriteTransPktCode(gen_file_def, sm_idx) - +genTrgTransPktCode(gen_file_def, sm_idx) - +genReadAckPktCode(gen_file_def, sm_idx) - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - - +genMessageCode("--清除中断") - +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - ) - - genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1) - - #>>>>>>用EB-MMU方式读取EB-MMU设置, 8 - genPkt.clean() - genPkt.setPktType(0) - - #subPkt参数:索引、索引类型、地址、命令、长度、数据 - #data = [1,] * 0x80 - data = [((i * 2) & 0xff) for i in range(0x80)] - genPkt.addSubPkt(0x1000, 2, addr_off, 0x1, 0x80, data) - - gen_file_def_ap = "ebmmu_tc8_rw" - sm_idx = 0 - - genPkt.addAfterExc(genWriteTransLenCode(gen_file_def_ap, sm_idx) - +genWriteTransPktCode(gen_file_def_ap, sm_idx) - +genTrgTransPktCode(gen_file_def_ap, sm_idx) - +genReadAckPktCode(gen_file_def_ap, sm_idx) - +genIFRwDataCode(1, 0x300, False, 0x20) - +genIFRwDataCode(2, 0x300, False, 0x20) - +genIFRwDataCode(3, 0x300, False, 0x20) - +genIFRwDataCode(4, 0x300, False, 0x20) - +genSlvSMReadData(1, 0, 0x80) - +genSlvSMReadData(2, 0, 0x80) - +genSlvSMReadData(3, 0, 0x80) - +genSlvSMReadData(4, 0, 0x80) - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - - +genMessageCode("--清除中断") - +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - +genTcEndFrameCode(gen_file_def)) - - genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1, True, gen_file_def_ap) - return gen_file_def - - - -def tc9(): - genPkt = GenPkt() - - gen_file_def = "ebmmu_tc09" - sm_idx = 0 - tc_des = "每个从站都使用ebmmu[0],共4个mmu,从0x1000_0000位置向后对齐,全部映射SM0,每个设备占256个字节。\\n" \ - + "主站使用1个子包,将4个设备的数据写下去,报文长度超过1KB,相当于使用单播变广播。\\n"\ - + "检查内容:ebmmu工作状态、回包工作计数、SMx的状态、中断状态、统计信息、相关时序" - - #-------------------------------------------------------------------------- - #>>>>>>设置EB-MMU,测试用例9,广播写,检查权限 - genPkt.clean() - genPkt.setPktType(0) - - genPkt.addSubPkt(0x0, 0, 0x0018, 0xe, 2, [0x1, 0x58]) - addr_off = 0x0 - - #subPkt参数:索引、索引类型、地址、命令、长度、数据 - data = [0,] * 256 - - addr = addr_off + 0x0 - setting_ebmmu_regs(data, 0, 0x10000000+addr, 0x0800, 0x0100, 0x2, 0x1) - genPkt.addSubPkt(0x1, 0, 0x0200, 0xe, 160, data) - - data = [0,] * 2 - data[0] = 0x00 - data[1] = 0x01 - genPkt.addSubPkt(0x0, 0, 0x302, 0xe, 2, data) - genPkt.addSubPkt(0x0, 0, 0x0018, 0xe, 2, [0x0, 0x58]) - - sm_idx = 0 - - genPkt.addBeforeExc(genTcStartFrameCode(gen_file_def, tc_des) - +genMessageCode("--清除中断") - +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - ) - - genPkt.addAfterExc(genWriteTransLenCode(gen_file_def, sm_idx) - +genWriteTransPktCode(gen_file_def, sm_idx) - +genTrgTransPktCode(gen_file_def, sm_idx) - +genReadAckPktCode(gen_file_def, sm_idx) - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - - +genMessageCode("--清除中断") - +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - ) - - genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1) - - #>>>>>>用EB-MMU方式读取EB-MMU设置, 9 - genPkt.clean() - genPkt.setPktType(0) - - #subPkt参数:索引、索引类型、地址、命令、长度、数据 - #data = [0xa5,] * 0x100 - #data[-1] = 0x5a - data = [((i + 5) & 0xff) for i in range(0x100)] - genPkt.addSubPkt(0x1000, 2, addr_off, 0x1, 0x100, data) - - gen_file_def_ap = "ebmmu_tc9_rw" - sm_idx = 0 - - genPkt.addAfterExc(genWriteTransLenCode(gen_file_def_ap, sm_idx) - +genWriteTransPktCode(gen_file_def_ap, sm_idx) - +genTrgTransPktCode(gen_file_def_ap, sm_idx) - +genReadAckPktCode(gen_file_def_ap, sm_idx) - +genIFRwDataCode(1, 0x300, False, 0x20) - +genIFRwDataCode(2, 0x300, False, 0x20) - +genIFRwDataCode(3, 0x300, False, 0x20) - +genIFRwDataCode(4, 0x300, False, 0x20) - +genSlvSMReadData(1, 0, 0x100) - +genSlvSMReadData(2, 0, 0x100) - +genSlvSMReadData(3, 0, 0x100) - +genSlvSMReadData(4, 0, 0x100) - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - - +genMessageCode("--清除中断") - +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - +genTcEndFrameCode(gen_file_def) - ) - - genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1, True, gen_file_def_ap) - return gen_file_def - - - -def tc10(): - genPkt = GenPkt() - - gen_file_def = "ebmmu_tc10" - sm_idx = 0 - tc_des = "每个从站都使用ebmmu[0],共4个mmu,从0x1000_0000位置向后对齐,映射SM0,每个设备占256个字节。\\n" \ - + "使用1包数据,将4个设备的数据一次性写下去;连续写2次。检查SM0的状态是否包含2包数据。\\n"\ - + "检查内容:ebmmu工作状态、回包工作计数、SMx的状态、中断状态、统计信息、相关时序" - - #-------------------------------------------------------------------------- - #>>>>>>设置EB-MMU,测试用例10,广播写,检查权限 - genPkt.clean() - genPkt.setPktType(0) - - addr_off = 0x0 - genPkt.addSubPkt(0x0, 0, 0x0018, 0xe, 2, [0x1, 0x58]) - #subPkt参数:索引、索引类型、地址、命令、长度、数据 - data = [0,] * 256 - - addr = addr_off + 0x0 - setting_ebmmu_regs(data, 0, 0x10000000+addr, 0x0800, 0x0100, 0x2, 0x1) - genPkt.addSubPkt(0x1, 0, 0x0200, 0xe, 160, data) - - data = [0,] * 2 - data[0] = 0x00 - data[1] = 0x01 - genPkt.addSubPkt(0x0, 0, 0x302, 0xe, 2, data) - genPkt.addSubPkt(0x0, 0, 0x0018, 0xe, 2, [0x0, 0x58]) - - sm_idx = 0 - - genPkt.addBeforeExc(genTcStartFrameCode(gen_file_def, tc_des) - +genMessageCode("--清除中断") - +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - ) - - genPkt.addAfterExc(genWriteTransLenCode(gen_file_def, sm_idx) - +genWriteTransPktCode(gen_file_def, sm_idx) - +genTrgTransPktCode(gen_file_def, sm_idx) - +genReadAckPktCode(gen_file_def, sm_idx) - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - - +genMessageCode("--清除中断") - +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - ) - - genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1) - - #>>>>>>用EB-MMU方式读取EB-MMU设置, 10,两次写入em-mmu - genPkt.clean() - genPkt.setPktType(0) - - #subPkt参数:索引、索引类型、地址、命令、长度、数据 - #data = [0xc3,] * 0x100 - #data[-1] = 0x3c - data = [((i + 0x80) & 0xff) for i in range(0x100)] - genPkt.addSubPkt(0x1000, 2, addr_off, 0x1, 0x100, data) - - gen_file_def_ap = "ebmmu_tc10_rw01" - sm_idx = 0 - - genPkt.addAfterExc(genWriteTransLenCode(gen_file_def_ap, sm_idx) - +genWriteTransPktCode(gen_file_def_ap, sm_idx) - +genTrgTransPktCode(gen_file_def_ap, sm_idx) - +genReadAckPktCode(gen_file_def_ap, sm_idx) - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - - +genMessageCode("--清除中断") - +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - ) - - genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1, True, gen_file_def_ap) - - genPkt.clean() - genPkt.setPktType(0) - - #subPkt参数:索引、索引类型、地址、命令、长度、数据 - #data = [0x81,] * 0x100 - #data[-1] = 0x18 - data = [((i + 0x40) & 0xff) for i in range(0x100)] - genPkt.addSubPkt(0x1000, 2, addr_off, 0x1, 0x100, data) - - gen_file_def_ap = "ebmmu_tc10_rw02" - sm_idx = 0 - - genPkt.addAfterExc(genWriteTransLenCode(gen_file_def_ap, sm_idx) - +genWriteTransPktCode(gen_file_def_ap, sm_idx) - +genTrgTransPktCode(gen_file_def_ap, sm_idx) - +genReadAckPktCode(gen_file_def_ap, sm_idx) - +genIFRwDataCode(1, 0x300, False, 0x20) - +genIFRwDataCode(2, 0x300, False, 0x20) - +genIFRwDataCode(3, 0x300, False, 0x20) - +genIFRwDataCode(4, 0x300, False, 0x20) - +genSlvSMReadData(1, 0, 0x100) - +genIFRwDataCode(1, 0x300, False, 0x20) - +genSlvSMReadData(1, 0, 0x100) - +genSlvSMReadData(2, 0, 0x100) - +genIFRwDataCode(2, 0x300, False, 0x20) - +genSlvSMReadData(2, 0, 0x100) - +genSlvSMReadData(3, 0, 0x100) - +genIFRwDataCode(3, 0x300, False, 0x20) - +genSlvSMReadData(3, 0, 0x100) - +genSlvSMReadData(4, 0, 0x100) - +genIFRwDataCode(4, 0x300, False, 0x20) - +genSlvSMReadData(4, 0, 0x100) - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - - +genMessageCode("--清除中断") - +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - +genTcEndFrameCode(gen_file_def)) - - genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1, True, gen_file_def_ap) - return gen_file_def - - - -def tc11(): - genPkt = GenPkt() - - gen_file_def = "ebmmu_tc11" - sm_idx = 0 - tc_des = "每个从站都使用ebmmu[0],共4个mmu,从0x1000_0000位置向后对齐,依次映射每个设备的SM1,占256个字节。\\n" \ - + "每个设备准备了2个元素的数据,使用1个子包,将4个设备的数据一次性读上来,数据超过1KB。\\n"\ - + "检查内容:ebmmu工作状态、回包工作计数、SMx的状态、中断状态、统计信息、相关时序" - - #-------------------------------------------------------------------------- - #>>>>>>设置EB-MMU,测试用例11,读,检查权限 - genPkt.clean() - genPkt.setPktType(0) - addr = 0x10000000 - addr_off = 0x0 - - genPkt.addSubPkt(0x0, 0, 0x0018, 0xe, 2, [0x1, 0x58]) - #subPkt参数:索引、索引类型、地址、命令、长度、数据 - data = [0,] * 256 - - taddr = addr + addr_off - setting_ebmmu_regs(data, 0, taddr, 0x1000, 0x100, 0x1, 0x1) - - genPkt.addSubPkt(0x1, 0, 0x0200, 0x1, 160, data) - - #subPkt参数:索引、索引类型、地址、命令、长度、数据 - addr_off = addr_off + 0x100 - data = [0,] * 256 - - taddr = addr + addr_off - #print(hex(taddr), hex(addr_off)) - setting_ebmmu_regs(data, 0, taddr, 0x1000, 0x100, 0x1, 0x1) - genPkt.addSubPkt(0x2, 0, 0x0200, 0x1, 160, data) - - - #subPkt参数:索引、索引类型、地址、命令、长度、数据 - addr_off = addr_off + 0x100 - data = [0,] * 256 - - taddr = addr + addr_off - #print(hex(taddr), hex(addr_off)) - setting_ebmmu_regs(data, 0, taddr, 0x1000, 0x100, 0x1, 0x1) - - genPkt.addSubPkt(0x3, 0, 0x0200, 0x1, 160, data) - - - #subPkt参数:索引、索引类型、地址、命令、长度、数据 - addr_off = addr_off + 0x100 - data = [0,] * 256 - - taddr = addr + addr_off - #print(hex(taddr), hex(addr_off)) - setting_ebmmu_regs(data, 0, taddr, 0x1000, 0x100, 0x1, 0x1) - genPkt.addSubPkt(0x4, 0, 0x0200, 0x1, 160, data) - - data = [0,] * 2 - data[0] = 0x00 - data[1] = 0x01 - genPkt.addSubPkt(0x0, 0, 0x306, 0xe, 2, data) - genPkt.addSubPkt(0x0, 0, 0x0018, 0xe, 2, [0x0, 0x58]) - - sm_idx = 0 - - genPkt.addBeforeExc(genTcStartFrameCode(gen_file_def, tc_des) - +genMessageCode("--清除中断") - +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - ) - - genPkt.addAfterExc(genWriteTransLenCode(gen_file_def, sm_idx) - +genWriteTransPktCode(gen_file_def, sm_idx) - +genTrgTransPktCode(gen_file_def, sm_idx) - +genReadAckPktCode(gen_file_def, sm_idx) - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - - +genMessageCode("--清除中断") - +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - ) - - genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1) - - #>>>>>>用EB-MMU方式读取EB-MMU设置, 11,两次读出eb-mmu - genPkt.clean() - genPkt.setPktType(0) - - data0 = list(range(0x100)) - data1 = list(range(0xff, -1, -1)) - - - genPkt.addBeforeExc( genIFRwDataCode(1, 0x1000, True, 0x100, data0) - + genIFRwDataCode(2, 0x1000, True, 0x100, data1) - + genIFRwDataCode(3, 0x1000, True, 0x100, data0) - + genIFRwDataCode(4, 0x1000, True, 0x100, data1) - + genIFRwDataCode(1, 0x300, False, 0x20) - + genIFRwDataCode(2, 0x300, False, 0x20) - + genIFRwDataCode(3, 0x300, False, 0x20) - + genIFRwDataCode(4, 0x300, False, 0x20) - + genIFRwDataCode(1, 0x1000, True, 0x100, data1) - + genIFRwDataCode(2, 0x1000, True, 0x100, data0) - + genIFRwDataCode(3, 0x1000, True, 0x100, data1) - + genIFRwDataCode(4, 0x1000, True, 0x100, data0) - + genIFRwDataCode(1, 0x300, False, 0x20) - + genIFRwDataCode(2, 0x300, False, 0x20) - + genIFRwDataCode(3, 0x300, False, 0x20) - + genIFRwDataCode(4, 0x300, False, 0x20) - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - - +genMessageCode("--清除中断") - +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - ) - - #subPkt参数:索引、索引类型、地址、命令、长度、数据 - data = [0, ] * 0x100 * 4 - - gen_file_def_ap = "ebmmu_tc11_rw01" - sm_idx = 0 - - genPkt.addSubPkt(0x1000, 2, 0, 0x0, 0x100 * 4, data) - - genPkt.addAfterExc(genWriteTransLenCode(gen_file_def_ap, sm_idx) - +genWriteTransPktCode(gen_file_def_ap, sm_idx) - +genTrgTransPktCode(gen_file_def_ap, sm_idx) - +genReadAckPktCode(gen_file_def_ap, sm_idx) - +genIFRwDataCode(1, 0x300, False, 0x20) - +genIFRwDataCode(2, 0x300, False, 0x20) - +genIFRwDataCode(3, 0x300, False, 0x20) - +genIFRwDataCode(4, 0x300, False, 0x20) - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - - +genMessageCode("--清除中断") - +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - ) - - genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1, True, gen_file_def_ap) - - genPkt.clean() - genPkt.setPktType(0) - - #subPkt参数:索引、索引类型、地址、命令、长度、数据 - data = [0x0,] * 0x100 * 4 - - gen_file_def_ap = "ebmmu_tc11_rw02" - sm_idx = 0 - - genPkt.addSubPkt(0x1000, 2, 0, 0x0, 0x100 * 4, data) - - genPkt.addAfterExc(genWriteTransLenCode(gen_file_def_ap, sm_idx) - +genWriteTransPktCode(gen_file_def_ap, sm_idx) - +genTrgTransPktCode(gen_file_def_ap, sm_idx) - +genReadAckPktCode(gen_file_def_ap, sm_idx) - +genIFRwDataCode(1, 0x300, False, 0x20) - +genIFRwDataCode(2, 0x300, False, 0x20) - +genIFRwDataCode(3, 0x300, False, 0x20) - +genIFRwDataCode(4, 0x300, False, 0x20) - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - - +genMessageCode("--清除中断") - +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - +genTcEndFrameCode(gen_file_def) - ) - - genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1, True, gen_file_def_ap) - return gen_file_def - - -def tc12(): - genPkt = GenPkt() - - gen_file_def = "ebmmu_tc12" - sm_idx = 0 - tc_des = "每个从站使用ebmmu[0、1、2、3],从0x1000_0000位置向后对齐,分个MMU映射SM1、SM3、SM5、SM7,\\n" \ - + "每个SM占8个字节。设备侧准备好数据,使用1个子包,将4个设备的数据一次性读上来。\\n"\ - + "检查内容:ebmmu工作状态、回包工作计数、SMx的状态、中断状态、统计信息、相关时序" - - - #-------------------------------------------------------------------------- - #>>>>>>设置EB-MMU,测试用例12,读,检查权限 - genPkt.clean() - genPkt.setPktType(0) - - addr = 0x10000000 - addr_off = 0x0 - sm_size = 0x8 - - genPkt.addSubPkt(0x0, 0, 0x0018, 0xe, 2, [0x1, 0x58]) - #subPkt参数:索引、索引类型、地址、命令、长度、数据 - data = [0,] * 256 - - taddr = addr + addr_off - #print(hex(taddr), hex(addr_off)) - setting_ebmmu_regs(data, 0, taddr, 0x1000, sm_size, 0x1, 0x1) - - addr_off = addr_off + sm_size - taddr = addr + addr_off - #print(hex(taddr), hex(addr_off)) - setting_ebmmu_regs(data, 1, taddr, 0x2000, sm_size, 0x1, 0x1) - - addr_off = addr_off + sm_size - taddr = addr + addr_off - #print(hex(taddr), hex(addr_off)) - setting_ebmmu_regs(data, 2, taddr, 0x3000, sm_size, 0x1, 0x1) - - addr_off = addr_off + sm_size - taddr = addr + addr_off - #print(hex(taddr), hex(addr_off)) - setting_ebmmu_regs(data, 3, taddr, 0x4000, sm_size, 0x1, 0x1) - - genPkt.addSubPkt(0x1, 0, 0x0200, 0x1, 160, data) - - #subPkt参数:索引、索引类型、地址、命令、长度、数据 - data = [0,] * 256 - - addr_off = addr_off + sm_size - taddr = addr + addr_off - #print(hex(taddr), hex(addr_off)) - setting_ebmmu_regs(data, 0, taddr, 0x1000, sm_size, 0x1, 0x1) - - addr_off = addr_off + sm_size - taddr = addr + addr_off - #print(hex(taddr), hex(addr_off)) - setting_ebmmu_regs(data, 1, taddr, 0x2000, sm_size, 0x1, 0x1) - - addr_off = addr_off + sm_size - taddr = addr + addr_off - #print(hex(taddr), hex(addr_off)) - setting_ebmmu_regs(data, 2, taddr, 0x3000, sm_size, 0x1, 0x1) - - addr_off = addr_off + sm_size - taddr = addr + addr_off - #print(hex(taddr), hex(addr_off)) - setting_ebmmu_regs(data, 3, taddr, 0x4000, sm_size, 0x1, 0x1) - - genPkt.addSubPkt(0x2, 0, 0x0200, 0x1, 160, data) - - - #subPkt参数:索引、索引类型、地址、命令、长度、数据 - data = [0,] * 256 - - addr_off = addr_off + sm_size - taddr = addr + addr_off - #print(hex(taddr), hex(addr_off)) - setting_ebmmu_regs(data, 0, taddr, 0x1000, sm_size, 0x1, 0x1) - - addr_off = addr_off + sm_size - taddr = addr + addr_off - #print(hex(taddr), hex(addr_off)) - setting_ebmmu_regs(data, 1, taddr, 0x2000, sm_size, 0x1, 0x1) - - addr_off = addr_off + sm_size - taddr = addr + addr_off - #print(hex(taddr), hex(addr_off)) - setting_ebmmu_regs(data, 2, taddr, 0x3000, sm_size, 0x1, 0x1) - - addr_off = addr_off + sm_size - taddr = addr + addr_off - #print(hex(taddr), hex(addr_off)) - setting_ebmmu_regs(data, 3, taddr, 0x4000, sm_size, 0x1, 0x1) - - genPkt.addSubPkt(0x3, 0, 0x0200, 0x1, 160, data) - - - #subPkt参数:索引、索引类型、地址、命令、长度、数据 - data = [0,] * 256 - - addr_off = addr_off + sm_size - taddr = addr + addr_off - #print(hex(taddr), hex(addr_off)) - setting_ebmmu_regs(data, 0, taddr, 0x1000, sm_size, 0x1, 0x1) - - addr_off = addr_off + sm_size - taddr = addr + addr_off - #print(hex(taddr), hex(addr_off)) - setting_ebmmu_regs(data, 1, taddr, 0x2000, sm_size, 0x1, 0x1) - - addr_off = addr_off + sm_size - taddr = addr + addr_off - #print(hex(taddr), hex(addr_off)) - setting_ebmmu_regs(data, 2, taddr, 0x3000, sm_size, 0x1, 0x1) - - addr_off = addr_off + sm_size - taddr = addr + addr_off - #print(hex(taddr), hex(addr_off)) - setting_ebmmu_regs(data, 3, taddr, 0x4000, sm_size, 0x1, 0x1) - - genPkt.addSubPkt(0x4, 0, 0x0200, 0x1, 160, data) - - genPkt.addSubPkt(0x0, 0, 0x0018, 0xe, 2, [0x0, 0x58]) - - data = [0,] * 2 - data[0] = (sm_size >> 0) & 0xff - data[1] = (sm_size >> 8) & 0xff - genPkt.addSubPkt(0x0, 0, 0x306, 0xe, 2, data) - - data = [0,] * 2 - data[0] = (sm_size >> 0) & 0xff - data[1] = (sm_size >> 8) & 0xff - genPkt.addSubPkt(0x0, 0, 0x30e, 0xe, 2, data) - - data = [0,] * 2 - data[0] = (sm_size >> 0) & 0xff - data[1] = (sm_size >> 8) & 0xff - genPkt.addSubPkt(0x0, 0, 0x316, 0xe, 2, data) - - - data = [0,] * 2 - data[0] = (sm_size >> 0) & 0xff - data[1] = (sm_size >> 8) & 0xff - genPkt.addSubPkt(0x0, 0, 0x31e, 0xe, 2, data) - - sm_idx = 0 - - genPkt.addBeforeExc(genTcStartFrameCode(gen_file_def, tc_des) - +genMessageCode("--清除中断") - +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - ) - - genPkt.addAfterExc(genWriteTransLenCode(gen_file_def, sm_idx) - +genWriteTransPktCode(gen_file_def, sm_idx) - +genTrgTransPktCode(gen_file_def, sm_idx) - +genReadAckPktCode(gen_file_def, sm_idx) - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - - +genMessageCode("--清除中断") - +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - ) - - genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1) - - #>>>>>>用EB-MMU方式读取EB-MMU设置, 12 - genPkt.clean() - genPkt.setPktType(0) - - data0 = list(range(0, sm_size)) - data1 = list(range(1, sm_size + 1)) - data2 = list(range(2, sm_size + 2)) - data3 = list(range(3, sm_size + 3)) - data4 = list(range(4, sm_size + 4)) - data5 = list(range(5, sm_size + 5)) - data6 = list(range(6, sm_size + 6)) - data7 = list(range(7, sm_size + 7)) - - - genPkt.addBeforeExc( genIFRwDataCode(1, 0x1000, True, sm_size, data0) - + genIFRwDataCode(1, 0x2000, True, sm_size, data1) - + genIFRwDataCode(1, 0x3000, True, sm_size, data2) - + genIFRwDataCode(1, 0x4000, True, sm_size, data3) - - + genIFRwDataCode(2, 0x1000, True, sm_size, data4) - + genIFRwDataCode(2, 0x2000, True, sm_size, data5) - + genIFRwDataCode(2, 0x3000, True, sm_size, data6) - + genIFRwDataCode(2, 0x4000, True, sm_size, data7) - - + genIFRwDataCode(3, 0x1000, True, sm_size, data7) - + genIFRwDataCode(3, 0x2000, True, sm_size, data6) - + genIFRwDataCode(3, 0x3000, True, sm_size, data5) - + genIFRwDataCode(3, 0x4000, True, sm_size, data4) - - + genIFRwDataCode(4, 0x1000, True, sm_size, data3) - + genIFRwDataCode(4, 0x2000, True, sm_size, data2) - + genIFRwDataCode(4, 0x3000, True, sm_size, data1) - + genIFRwDataCode(4, 0x4000, True, sm_size, data0) - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - - +genMessageCode("--清除中断") - +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - ) - - #subPkt参数:索引、索引类型、地址、命令、长度、数据 - data = [0, ] * sm_size * 16 - - gen_file_def_ap = "ebmmu_tc12_rw" - sm_idx = 0 - - genPkt.addSubPkt(0x1000, 2, 0, 0x0, sm_size * 16, data) - - genPkt.addAfterExc(genWriteTransLenCode(gen_file_def_ap, sm_idx) - +genWriteTransPktCode(gen_file_def_ap, sm_idx) - +genTrgTransPktCode(gen_file_def_ap, sm_idx) - +genReadAckPktCode(gen_file_def_ap, sm_idx) - +genIFRwDataCode(1, 0x300, False, 0x20) - +genIFRwDataCode(2, 0x300, False, 0x20) - +genIFRwDataCode(3, 0x300, False, 0x20) - +genIFRwDataCode(4, 0x300, False, 0x20) - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - - +genMessageCode("--清除中断") - +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - +genTcEndFrameCode(gen_file_def) - ) - - genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1, True, gen_file_def_ap) - return gen_file_def - - - -def tc13(): - genPkt = GenPkt() - - gen_file_def = "ebmmu_tc13" - sm_idx = 0 - tc_des = "每个从站测使用前8个ebmmu,从0x1000_0000位置向后对齐,每两个ebmmu映射一个SM,每个设备占8个字节。\\n" \ - + "中间无字节空洞。如ebmmu[0]、ebmmu[1]分别映射SM1的前4个字节和后4个字节。使用1子包,将4个设备的数据一次性读上来。\\n"\ - + "检查内容:ebmmu工作状态、回包工作计数、SMx的状态、中断状态、统计信息、相关时序" - - #-------------------------------------------------------------------------- - #>>>>>>设置EB-MMU,测试用例13,读,检查权限 - genPkt.clean() - genPkt.setPktType(0) - - addr = 0x10000000 - addr_off = 0x0 - sm_size = 0x8 - - genPkt.addSubPkt(0x0, 0, 0x0018, 0xe, 2, [0x1, 0x58]) - #subPkt参数:索引、索引类型、地址、命令、长度、数据 - data = [0,] * 256 - - taddr = addr + addr_off - setting_ebmmu_regs(data, 0, taddr, 0x1000, sm_size / 2, 0x1, 0x1) - setting_ebmmu_regs(data, 1, taddr + sm_size / 2, 0x1000 + sm_size / 2, sm_size / 2, 0x1, 0x1) - - addr_off = addr_off + sm_size - taddr = addr + addr_off - setting_ebmmu_regs(data, 2, taddr, 0x2000, sm_size / 2, 0x1, 0x1) - setting_ebmmu_regs(data, 3, taddr + sm_size / 2, 0x2000 + sm_size / 2, sm_size / 2, 0x1, 0x1) - - addr_off = addr_off + sm_size - taddr = addr + addr_off - setting_ebmmu_regs(data, 4, taddr, 0x3000, sm_size / 2, 0x1, 0x1) - setting_ebmmu_regs(data, 5, taddr + sm_size / 2, 0x3000 + sm_size / 2, sm_size / 2, 0x1, 0x1) - - addr_off = addr_off + sm_size - taddr = addr + addr_off - #print(hex(taddr), hex(addr_off)) - setting_ebmmu_regs(data, 6, taddr, 0x4000, sm_size / 2, 0x1, 0x1) - setting_ebmmu_regs(data, 7, taddr + sm_size / 2, 0x4000 + sm_size / 2, sm_size / 2, 0x1, 0x1) - - genPkt.addSubPkt(0x1, 0, 0x0200, 0x1, 160, data) - - #subPkt参数:索引、索引类型、地址、命令、长度、数据 - data = [0,] * 256 - - addr_off = addr_off + sm_size - taddr = addr + addr_off - setting_ebmmu_regs(data, 0, taddr, 0x1000, sm_size / 2, 0x1, 0x1) - setting_ebmmu_regs(data, 1, taddr + sm_size / 2, 0x1000 + sm_size / 2, sm_size / 2, 0x1, 0x1) - - addr_off = addr_off + sm_size - taddr = addr + addr_off - setting_ebmmu_regs(data, 2, taddr, 0x2000, sm_size / 2, 0x1, 0x1) - setting_ebmmu_regs(data, 3, taddr + sm_size / 2, 0x2000 + sm_size / 2, sm_size / 2, 0x1, 0x1) - - addr_off = addr_off + sm_size - taddr = addr + addr_off - setting_ebmmu_regs(data, 4, taddr, 0x3000, sm_size / 2, 0x1, 0x1) - setting_ebmmu_regs(data, 5, taddr + sm_size / 2, 0x3000 + sm_size / 2, sm_size / 2, 0x1, 0x1) - - addr_off = addr_off + sm_size - taddr = addr + addr_off - #print(hex(taddr), hex(addr_off)) - setting_ebmmu_regs(data, 6, taddr, 0x4000, sm_size / 2, 0x1, 0x1) - setting_ebmmu_regs(data, 7, taddr + sm_size / 2, 0x4000 + sm_size / 2, sm_size / 2, 0x1, 0x1) - - genPkt.addSubPkt(0x2, 0, 0x0200, 0x1, 160, data) - - - #subPkt参数:索引、索引类型、地址、命令、长度、数据 - data = [0,] * 256 - - addr_off = addr_off + sm_size - taddr = addr + addr_off - setting_ebmmu_regs(data, 0, taddr, 0x1000, sm_size / 2, 0x1, 0x1) - setting_ebmmu_regs(data, 1, taddr + sm_size / 2, 0x1000 + sm_size / 2, sm_size / 2, 0x1, 0x1) - - addr_off = addr_off + sm_size - taddr = addr + addr_off - setting_ebmmu_regs(data, 2, taddr, 0x2000, sm_size / 2, 0x1, 0x1) - setting_ebmmu_regs(data, 3, taddr + sm_size / 2, 0x2000 + sm_size / 2, sm_size / 2, 0x1, 0x1) - - addr_off = addr_off + sm_size - taddr = addr + addr_off - setting_ebmmu_regs(data, 4, taddr, 0x3000, sm_size / 2, 0x1, 0x1) - setting_ebmmu_regs(data, 5, taddr + sm_size / 2, 0x3000 + sm_size / 2, sm_size / 2, 0x1, 0x1) - - addr_off = addr_off + sm_size - taddr = addr + addr_off - #print(hex(taddr), hex(addr_off)) - setting_ebmmu_regs(data, 6, taddr, 0x4000, sm_size / 2, 0x1, 0x1) - setting_ebmmu_regs(data, 7, taddr + sm_size / 2, 0x4000 + sm_size / 2, sm_size / 2, 0x1, 0x1) - - genPkt.addSubPkt(0x3, 0, 0x0200, 0x1, 160, data) - - - #subPkt参数:索引、索引类型、地址、命令、长度、数据 - data = [0,] * 256 - - addr_off = addr_off + sm_size - taddr = addr + addr_off - setting_ebmmu_regs(data, 0, taddr, 0x1000, sm_size / 2, 0x1, 0x1) - setting_ebmmu_regs(data, 1, taddr + sm_size / 2, 0x1000 + sm_size / 2, sm_size / 2, 0x1, 0x1) - - addr_off = addr_off + sm_size - taddr = addr + addr_off - setting_ebmmu_regs(data, 2, taddr, 0x2000, sm_size / 2, 0x1, 0x1) - setting_ebmmu_regs(data, 3, taddr + sm_size / 2, 0x2000 + sm_size / 2, sm_size / 2, 0x1, 0x1) - - addr_off = addr_off + sm_size - taddr = addr + addr_off - setting_ebmmu_regs(data, 4, taddr, 0x3000, sm_size / 2, 0x1, 0x1) - setting_ebmmu_regs(data, 5, taddr + sm_size / 2, 0x3000 + sm_size / 2, sm_size / 2, 0x1, 0x1) - - addr_off = addr_off + sm_size - taddr = addr + addr_off - #print(hex(taddr), hex(addr_off)) - setting_ebmmu_regs(data, 6, taddr, 0x4000, sm_size / 2, 0x1, 0x1) - setting_ebmmu_regs(data, 7, taddr + sm_size / 2, 0x4000 + sm_size / 2, sm_size / 2, 0x1, 0x1) - - - genPkt.addSubPkt(0x4, 0, 0x0200, 0x1, 160, data) - - genPkt.addSubPkt(0x0, 0, 0x0018, 0xe, 2, [0x0, 0x58]) - - - data = [0,] * 2 - data[0] = (sm_size >> 0) & 0xff - data[1] = (sm_size >> 8) & 0xff - genPkt.addSubPkt(0x0, 0, 0x306, 0xe, 2, data) - - data = [0,] * 2 - data[0] = (sm_size >> 0) & 0xff - data[1] = (sm_size >> 8) & 0xff - genPkt.addSubPkt(0x0, 0, 0x30e, 0xe, 2, data) - - data = [0,] * 2 - data[0] = (sm_size >> 0) & 0xff - data[1] = (sm_size >> 8) & 0xff - genPkt.addSubPkt(0x0, 0, 0x316, 0xe, 2, data) - - - data = [0,] * 2 - data[0] = (sm_size >> 0) & 0xff - data[1] = (sm_size >> 8) & 0xff - genPkt.addSubPkt(0x0, 0, 0x31e, 0xe, 2, data) - - sm_idx = 0 - genPkt.addBeforeExc(genTcStartFrameCode(gen_file_def, tc_des) - +genMessageCode("--清除中断") - +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - ) - - genPkt.addAfterExc(genWriteTransLenCode(gen_file_def, sm_idx) - +genWriteTransPktCode(gen_file_def, sm_idx) - +genTrgTransPktCode(gen_file_def, sm_idx) - +genReadAckPktCode(gen_file_def, sm_idx) - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - - +genMessageCode("--清除中断") - +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - ) - - genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1) - - #>>>>>>用EB-MMU方式读取EB-MMU设置, 12 - genPkt.clean() - genPkt.setPktType(0) - - data0 = list(range(0, sm_size)) - data1 = list(range(1, sm_size + 1)) - data2 = list(range(2, sm_size + 2)) - data3 = list(range(3, sm_size + 3)) - data4 = list(range(4, sm_size + 4)) - data5 = list(range(5, sm_size + 5)) - data6 = list(range(6, sm_size + 6)) - data7 = list(range(7, sm_size + 7)) - - - genPkt.addBeforeExc( genIFRwDataCode(1, 0x1000, True, sm_size, data0) - + genIFRwDataCode(1, 0x2000, True, sm_size, data1) - + genIFRwDataCode(1, 0x3000, True, sm_size, data2) - + genIFRwDataCode(1, 0x4000, True, sm_size, data3) - - + genIFRwDataCode(2, 0x1000, True, sm_size, data4) - + genIFRwDataCode(2, 0x2000, True, sm_size, data5) - + genIFRwDataCode(2, 0x3000, True, sm_size, data6) - + genIFRwDataCode(2, 0x4000, True, sm_size, data7) - - + genIFRwDataCode(3, 0x1000, True, sm_size, data7) - + genIFRwDataCode(3, 0x2000, True, sm_size, data6) - + genIFRwDataCode(3, 0x3000, True, sm_size, data5) - + genIFRwDataCode(3, 0x4000, True, sm_size, data4) - - + genIFRwDataCode(4, 0x1000, True, sm_size, data3) - + genIFRwDataCode(4, 0x2000, True, sm_size, data2) - + genIFRwDataCode(4, 0x3000, True, sm_size, data1) - + genIFRwDataCode(4, 0x4000, True, sm_size, data0) - ) - - #subPkt参数:索引、索引类型、地址、命令、长度、数据 - data = [0, ] * sm_size * 16 - - gen_file_def_ap = "ebmmu_tc13_rw" - sm_idx = 0 - - genPkt.addSubPkt(0x1000, 2, 0, 0x0, sm_size * 16, data) - - genPkt.addAfterExc(genWriteTransLenCode(gen_file_def_ap, sm_idx) - +genWriteTransPktCode(gen_file_def_ap, sm_idx) - +genTrgTransPktCode(gen_file_def_ap, sm_idx) - +genReadAckPktCode(gen_file_def_ap, sm_idx) - +genIFRwDataCode(1, 0x300, False, 0x20) - +genIFRwDataCode(2, 0x300, False, 0x20) - +genIFRwDataCode(3, 0x300, False, 0x20) - +genIFRwDataCode(4, 0x300, False, 0x20) - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - - +genMessageCode("--清除中断") - +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - +genTcEndFrameCode(gen_file_def) - ) - - genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1, True, gen_file_def_ap) - return gen_file_def - - -def tc14(): - genPkt = GenPkt() - - - gen_file_def = "ebmmu_tc14" - sm_idx = 0 - tc_des = "每个从站使用4个ebmmu,从0x1000_0000位置向后对齐,分别映射SM0/2/4/6,每个设备占8个字节。\\n" \ - + "中间无字节空洞,使用1个子包,将4个设备的数据一次性写下去。\\n"\ - + "检查内容:ebmmu工作状态、回包工作计数、SMx的状态、中断状态、统计信息、相关时序" - - - #-------------------------------------------------------------------------- - #>>>>>>设置EB-MMU,测试用例14,读,检查权限 - genPkt.clean() - genPkt.setPktType(0) - - addr = 0x10000000 - addr_off = 0x0 - sm_size = 0x8 - - genPkt.addSubPkt(0x0, 0, 0x0018, 0xe, 2, [0x1, 0x58]) - #subPkt参数:索引、索引类型、地址、命令、长度、数据 - data = [0,] * 256 - - taddr = addr + addr_off - setting_ebmmu_regs(data, 0, taddr, 0x0800, sm_size, 0x2, 0x1) - - addr_off = addr_off + sm_size - taddr = addr + addr_off - setting_ebmmu_regs(data, 1, taddr, 0x1800, sm_size, 0x2, 0x1) - - addr_off = addr_off + sm_size - taddr = addr + addr_off - setting_ebmmu_regs(data, 2, taddr, 0x2800, sm_size, 0x2, 0x1) - - addr_off = addr_off + sm_size - taddr = addr + addr_off - setting_ebmmu_regs(data, 3, taddr, 0x3800, sm_size, 0x2, 0x1) - - genPkt.addSubPkt(0x1, 0, 0x0200, 0x1, 160, data) - - #subPkt参数:索引、索引类型、地址、命令、长度、数据 - data = [0,] * 256 - - addr_off = addr_off + sm_size - taddr = addr + addr_off - setting_ebmmu_regs(data, 0, taddr, 0x0800, sm_size, 0x2, 0x1) - - addr_off = addr_off + sm_size - taddr = addr + addr_off - setting_ebmmu_regs(data, 1, taddr, 0x1800, sm_size, 0x2, 0x1) - - addr_off = addr_off + sm_size - taddr = addr + addr_off - setting_ebmmu_regs(data, 2, taddr, 0x2800, sm_size, 0x2, 0x1) - - addr_off = addr_off + sm_size - taddr = addr + addr_off - setting_ebmmu_regs(data, 3, taddr, 0x3800, sm_size, 0x2, 0x1) - - genPkt.addSubPkt(0x2, 0, 0x0200, 0x1, 160, data) - - - #subPkt参数:索引、索引类型、地址、命令、长度、数据 - data = [0,] * 256 - - addr_off = addr_off + sm_size - taddr = addr + addr_off - setting_ebmmu_regs(data, 0, taddr, 0x0800, sm_size, 0x2, 0x1) - - addr_off = addr_off + sm_size - taddr = addr + addr_off - setting_ebmmu_regs(data, 1, taddr, 0x1800, sm_size, 0x2, 0x1) - - addr_off = addr_off + sm_size - taddr = addr + addr_off - setting_ebmmu_regs(data, 2, taddr, 0x2800, sm_size, 0x2, 0x1) - - addr_off = addr_off + sm_size - taddr = addr + addr_off - setting_ebmmu_regs(data, 3, taddr, 0x3800, sm_size, 0x2, 0x1) - - genPkt.addSubPkt(0x3, 0, 0x0200, 0x1, 160, data) - - - #subPkt参数:索引、索引类型、地址、命令、长度、数据 - data = [0,] * 256 - - addr_off = addr_off + sm_size - taddr = addr + addr_off - setting_ebmmu_regs(data, 0, taddr, 0x0800, sm_size, 0x2, 0x1) - - addr_off = addr_off + sm_size - taddr = addr + addr_off - setting_ebmmu_regs(data, 1, taddr, 0x1800, sm_size, 0x2, 0x1) - - addr_off = addr_off + sm_size - taddr = addr + addr_off - setting_ebmmu_regs(data, 2, taddr, 0x2800, sm_size, 0x2, 0x1) - - addr_off = addr_off + sm_size - taddr = addr + addr_off - setting_ebmmu_regs(data, 3, taddr, 0x3800, sm_size, 0x2, 0x1) - - - genPkt.addSubPkt(0x4, 0, 0x0200, 0x1, 160, data) - - genPkt.addSubPkt(0x0, 0, 0x0018, 0xe, 2, [0x0, 0x58]) - - data = [0,] * 2 - data[0] = (sm_size >> 0) & 0xff - data[1] = (sm_size >> 8) & 0xff - genPkt.addSubPkt(0x0, 0, 0x302, 0xe, 2, data) - - data = [0,] * 2 - data[0] = (sm_size >> 0) & 0xff - data[1] = (sm_size >> 8) & 0xff - genPkt.addSubPkt(0x0, 0, 0x30a, 0xe, 2, data) - - data = [0,] * 2 - data[0] = (sm_size >> 0) & 0xff - data[1] = (sm_size >> 8) & 0xff - genPkt.addSubPkt(0x0, 0, 0x312, 0xe, 2, data) - - - data = [0,] * 2 - data[0] = (sm_size >> 0) & 0xff - data[1] = (sm_size >> 8) & 0xff - genPkt.addSubPkt(0x0, 0, 0x31a, 0xe, 2, data) - - sm_idx = 0 - - genPkt.addBeforeExc(genTcStartFrameCode(gen_file_def, tc_des) - +genMessageCode("--清除中断") - +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - ) - - genPkt.addAfterExc(genWriteTransLenCode(gen_file_def, sm_idx) - +genWriteTransPktCode(gen_file_def, sm_idx) - +genTrgTransPktCode(gen_file_def, sm_idx) - +genReadAckPktCode(gen_file_def, sm_idx) - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - - +genMessageCode("--清除中断") - +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - ) - - genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1) - - #>>>>>>用EB-MMU方式读取EB-MMU设置, 14 - genPkt.clean() - genPkt.setPktType(0) - - #subPkt参数:索引、索引类型、地址、命令、长度、数据 - data = [(i & 0xff) for i in range(sm_size * 16)] - - gen_file_def_ap = "ebmmu_tc14_rw" - sm_idx = 0 - - genPkt.addSubPkt(0x1000, 2, 0, 0x1, sm_size * 16, data) - - genPkt.addAfterExc(genWriteTransLenCode(gen_file_def_ap, sm_idx) - +genWriteTransPktCode(gen_file_def_ap, sm_idx) - +genTrgTransPktCode(gen_file_def_ap, sm_idx) - +genReadAckPktCode(gen_file_def_ap, sm_idx) - +genIFRwDataCode(1, 0x300, False, 0x20) - +genIFRwDataCode(2, 0x300, False, 0x20) - +genIFRwDataCode(3, 0x300, False, 0x20) - +genIFRwDataCode(4, 0x300, False, 0x20) - +genSlvSMReadData(1, 0, sm_size) - +genSlvSMReadData(1, 2, sm_size) - +genSlvSMReadData(1, 4, sm_size) - +genSlvSMReadData(1, 6, sm_size) - +genSlvSMReadData(2, 0, sm_size) - +genSlvSMReadData(2, 2, sm_size) - +genSlvSMReadData(2, 4, sm_size) - +genSlvSMReadData(2, 6, sm_size) - +genSlvSMReadData(3, 0, sm_size) - +genSlvSMReadData(3, 2, sm_size) - +genSlvSMReadData(3, 4, sm_size) - +genSlvSMReadData(3, 6, sm_size) - +genSlvSMReadData(4, 0, sm_size) - +genSlvSMReadData(4, 2, sm_size) - +genSlvSMReadData(4, 4, sm_size) - +genSlvSMReadData(4, 6, sm_size) - +genIFRwDataCode(1, 0x300, False, 0x20) - +genIFRwDataCode(2, 0x300, False, 0x20) - +genIFRwDataCode(3, 0x300, False, 0x20) - +genIFRwDataCode(4, 0x300, False, 0x20) - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - - +genMessageCode("--清除中断") - +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - +genTcEndFrameCode(gen_file_def) - ) - - genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1, True, gen_file_def_ap) - return gen_file_def - - -def tc15(): - genPkt = GenPkt() - - gen_file_def = "ebmmu_tc15" - sm_idx = 0 - tc_des = "测试16个ebmmu全配置下运行,每4个ebmmu对应一个SM,映射4个字节。分别映射SM0/2/4/6, \\n" \ - + "每个映射了16个字节。中间无字节空洞。使用1个子包,将数据写下去。每个ebmmu必须对齐、足长的写入,\\n" \ - + "对应的sm才能正常工作。QSPI/SPI侧能正常的读到相关的数据。" - - #-------------------------------------------------------------------------- - #>>>>>>设置EB-MMU,测试用例15,读,检查权限 - genPkt.clean() - genPkt.setPktType(0) - - addr = 0x10000000 - addr_off = 0x0 - sm_size = 16 - - genPkt.addSubPkt(0x0, 0, 0x0018, 0xe, 2, [0x1, 0x58]) - #subPkt参数:索引、索引类型、地址、命令、长度、数据 - data = [0,] * 256 - - taddr = addr + addr_off - ebmmu_offset = 0 - for i in range(4): - setting_ebmmu_regs(data, - ebmmu_offset, - taddr + i * int(sm_size / 4), - 0x0800 + i * int(sm_size / 4), - sm_size / 4, - 0x2, - 0x1 - ) - #print(ebmmu_offset, hex(taddr + i * int(sm_size / 4)), hex(0x0800 + i * int(sm_size / 4))) - ebmmu_offset = ebmmu_offset + 1 - - addr_off = addr_off + sm_size - taddr = addr + addr_off - for i in range(4): - setting_ebmmu_regs(data, - ebmmu_offset, - taddr + i * int(sm_size / 4), - 0x1800 + i * int(sm_size / 4), - sm_size / 4, - 0x2, - 0x1 - ) - #print(ebmmu_offset, hex(taddr + i * int(sm_size / 4)), hex(0x0800 + i * int(sm_size / 4))) - ebmmu_offset = ebmmu_offset + 1 - - addr_off = addr_off + sm_size - taddr = addr + addr_off - for i in range(4): - setting_ebmmu_regs(data, - ebmmu_offset, - taddr + i * int(sm_size / 4), - 0x2800 + i * int(sm_size / 4), - sm_size / 4, - 0x2, - 0x1 - ) - #print(ebmmu_offset, hex(taddr + i * int(sm_size / 4)), hex(0x0800 + i * int(sm_size / 4))) - ebmmu_offset = ebmmu_offset + 1 - - addr_off = addr_off + sm_size - taddr = addr + addr_off - for i in range(4): - setting_ebmmu_regs(data, - ebmmu_offset, - taddr + i * int(sm_size / 4), - 0x3800 + i * int(sm_size / 4), - sm_size / 4, - 0x2, - 0x1 - ) - #print(ebmmu_offset, hex(taddr + i * int(sm_size / 4)), hex(0x0800 + i * int(sm_size / 4))) - ebmmu_offset = ebmmu_offset + 1 - - genPkt.addSubPkt(0x1, 0, 0x0200, 0x1, 160, data) - - #subPkt参数:索引、索引类型、地址、命令、长度、数据 - data = [0,] * 256 - - addr_off = addr_off + sm_size - taddr = addr + addr_off - ebmmu_offset = 0 - for i in range(4): - setting_ebmmu_regs(data, - ebmmu_offset, - taddr + i * int(sm_size / 4), - 0x0800 + i * int(sm_size / 4), - sm_size / 4, - 0x2, - 0x1 - ) - #print(ebmmu_offset, hex(taddr + i * int(sm_size / 4)), hex(0x0800 + i * int(sm_size / 4))) - ebmmu_offset = ebmmu_offset + 1 - - addr_off = addr_off + sm_size - taddr = addr + addr_off - for i in range(4): - setting_ebmmu_regs(data, - ebmmu_offset, - taddr + i * int(sm_size / 4), - 0x1800 + i * int(sm_size / 4), - sm_size / 4, - 0x2, - 0x1 - ) - #print(ebmmu_offset, hex(taddr + i * int(sm_size / 4)), hex(0x0800 + i * int(sm_size / 4))) - ebmmu_offset = ebmmu_offset + 1 - - addr_off = addr_off + sm_size - taddr = addr + addr_off - for i in range(4): - setting_ebmmu_regs(data, - ebmmu_offset, - taddr + i * int(sm_size / 4), - 0x2800 + i * int(sm_size / 4), - sm_size / 4, - 0x2, - 0x1 - ) - #print(ebmmu_offset, hex(taddr + i * int(sm_size / 4)), hex(0x0800 + i * int(sm_size / 4))) - ebmmu_offset = ebmmu_offset + 1 - - addr_off = addr_off + sm_size - taddr = addr + addr_off - for i in range(4): - setting_ebmmu_regs(data, - ebmmu_offset, - taddr + i * int(sm_size / 4), - 0x3800 + i * int(sm_size / 4), - sm_size / 4, - 0x2, - 0x1 - ) - #print(ebmmu_offset, hex(taddr + i * int(sm_size / 4)), hex(0x0800 + i * int(sm_size / 4))) - ebmmu_offset = ebmmu_offset + 1 - - genPkt.addSubPkt(0x2, 0, 0x0200, 0x1, 160, data) - - - #subPkt参数:索引、索引类型、地址、命令、长度、数据 - data = [0,] * 256 - - addr_off = addr_off + sm_size - taddr = addr + addr_off - ebmmu_offset = 0 - for i in range(4): - setting_ebmmu_regs(data, - ebmmu_offset, - taddr + i * int(sm_size / 4), - 0x0800 + i * int(sm_size / 4), - sm_size / 4, - 0x2, - 0x1 - ) - #print(ebmmu_offset, hex(taddr + i * int(sm_size / 4)), hex(0x0800 + i * int(sm_size / 4))) - ebmmu_offset = ebmmu_offset + 1 - - addr_off = addr_off + sm_size - taddr = addr + addr_off - for i in range(4): - setting_ebmmu_regs(data, - ebmmu_offset, - taddr + i * int(sm_size / 4), - 0x1800 + i * int(sm_size / 4), - sm_size / 4, - 0x2, - 0x1 - ) - #print(ebmmu_offset, hex(taddr + i * int(sm_size / 4)), hex(0x0800 + i * int(sm_size / 4))) - ebmmu_offset = ebmmu_offset + 1 - - addr_off = addr_off + sm_size - taddr = addr + addr_off - for i in range(4): - setting_ebmmu_regs(data, - ebmmu_offset, - taddr + i * int(sm_size / 4), - 0x2800 + i * int(sm_size / 4), - sm_size / 4, - 0x2, - 0x1 - ) - #print(ebmmu_offset, hex(taddr + i * int(sm_size / 4)), hex(0x0800 + i * int(sm_size / 4))) - ebmmu_offset = ebmmu_offset + 1 - - addr_off = addr_off + sm_size - taddr = addr + addr_off - for i in range(4): - setting_ebmmu_regs(data, - ebmmu_offset, - taddr + i * int(sm_size / 4), - 0x3800 + i * int(sm_size / 4), - sm_size / 4, - 0x2, - 0x1 - ) - #print(ebmmu_offset, hex(taddr + i * int(sm_size / 4)), hex(0x0800 + i * int(sm_size / 4))) - ebmmu_offset = ebmmu_offset + 1 - - genPkt.addSubPkt(0x3, 0, 0x0200, 0x1, 160, data) - - - #subPkt参数:索引、索引类型、地址、命令、长度、数据 - data = [0,] * 256 - - addr_off = addr_off + sm_size - taddr = addr + addr_off - ebmmu_offset = 0 - for i in range(4): - setting_ebmmu_regs(data, - ebmmu_offset, - taddr + i * int(sm_size / 4), - 0x0800 + i * int(sm_size / 4), - sm_size / 4, - 0x2, - 0x1 - ) - #print(ebmmu_offset, hex(taddr + i * int(sm_size / 4)), hex(0x0800 + i * int(sm_size / 4))) - ebmmu_offset = ebmmu_offset + 1 - - addr_off = addr_off + sm_size - taddr = addr + addr_off - for i in range(4): - setting_ebmmu_regs(data, - ebmmu_offset, - taddr + i * int(sm_size / 4), - 0x1800 + i * int(sm_size / 4), - sm_size / 4, - 0x2, - 0x1 - ) - #print(ebmmu_offset, hex(taddr + i * int(sm_size / 4)), hex(0x0800 + i * int(sm_size / 4))) - ebmmu_offset = ebmmu_offset + 1 - - addr_off = addr_off + sm_size - taddr = addr + addr_off - for i in range(4): - setting_ebmmu_regs(data, - ebmmu_offset, - taddr + i * int(sm_size / 4), - 0x2800 + i * int(sm_size / 4), - sm_size / 4, - 0x2, - 0x1 - ) - #print(ebmmu_offset, hex(taddr + i * int(sm_size / 4)), hex(0x0800 + i * int(sm_size / 4))) - ebmmu_offset = ebmmu_offset + 1 - - addr_off = addr_off + sm_size - taddr = addr + addr_off - for i in range(4): - setting_ebmmu_regs(data, - ebmmu_offset, - taddr + i * int(sm_size / 4), - 0x3800 + i * int(sm_size / 4), - sm_size / 4, - 0x2, - 0x1 - ) - #print(ebmmu_offset, hex(taddr + i * int(sm_size / 4)), hex(0x0800 + i * int(sm_size / 4))) - ebmmu_offset = ebmmu_offset + 1 - - - genPkt.addSubPkt(0x4, 0, 0x0200, 0x1, 160, data) - genPkt.addSubPkt(0x0, 0, 0x0018, 0xe, 2, [0x0, 0x58]) - - data = [0,] * 2 - data[0] = (sm_size >> 0) & 0xff - data[1] = (sm_size >> 8) & 0xff - genPkt.addSubPkt(0x0, 0, 0x302, 0xe, 2, data) - - data = [0,] * 2 - data[0] = (sm_size >> 0) & 0xff - data[1] = (sm_size >> 8) & 0xff - genPkt.addSubPkt(0x0, 0, 0x30a, 0xe, 2, data) - - data = [0,] * 2 - data[0] = (sm_size >> 0) & 0xff - data[1] = (sm_size >> 8) & 0xff - genPkt.addSubPkt(0x0, 0, 0x312, 0xe, 2, data) - - - data = [0,] * 2 - data[0] = (sm_size >> 0) & 0xff - data[1] = (sm_size >> 8) & 0xff - genPkt.addSubPkt(0x0, 0, 0x31a, 0xe, 2, data) - - genPkt.addBeforeExc(genTcStartFrameCode(gen_file_def, tc_des) - +genMessageCode("--清除中断") - +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - ) - - genPkt.addAfterExc(genWriteTransLenCode(gen_file_def, sm_idx) - +genWriteTransPktCode(gen_file_def, sm_idx) - +genTrgTransPktCode(gen_file_def, sm_idx) - +genReadAckPktCode(gen_file_def, sm_idx) - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - - +genMessageCode("--清除中断") - +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - ) - - genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1) - - #>>>>>>用EB-MMU方式读取EB-MMU设置, 15 - genPkt.clean() - genPkt.setPktType(0) - - #subPkt参数:索引、索引类型、地址、命令、长度、数据 - data = [(i & 0xff) for i in range(sm_size * 16)] - - gen_file_def_ap = "ebmmu_tc15_rw" - sm_idx = 0 - - genPkt.addSubPkt(0x1000, 2, 0, 0x1, sm_size * 16, data) - - genPkt.addAfterExc(genWriteTransLenCode(gen_file_def_ap, sm_idx) - +genWriteTransPktCode(gen_file_def_ap, sm_idx) - +genTrgTransPktCode(gen_file_def_ap, sm_idx) - +genReadAckPktCode(gen_file_def_ap, sm_idx) - +genIFRwDataCode(1, 0x300, False, 0x20) - +genIFRwDataCode(2, 0x300, False, 0x20) - +genIFRwDataCode(3, 0x300, False, 0x20) - +genIFRwDataCode(4, 0x300, False, 0x20) - +genSlvSMReadData(1, 0, sm_size) - +genSlvSMReadData(1, 2, sm_size) - +genSlvSMReadData(1, 4, sm_size) - +genSlvSMReadData(1, 6, sm_size) - +genSlvSMReadData(2, 0, sm_size) - +genSlvSMReadData(2, 2, sm_size) - +genSlvSMReadData(2, 4, sm_size) - +genSlvSMReadData(2, 6, sm_size) - +genSlvSMReadData(3, 0, sm_size) - +genSlvSMReadData(3, 2, sm_size) - +genSlvSMReadData(3, 4, sm_size) - +genSlvSMReadData(3, 6, sm_size) - +genSlvSMReadData(4, 0, sm_size) - +genSlvSMReadData(4, 2, sm_size) - +genSlvSMReadData(4, 4, sm_size) - +genSlvSMReadData(4, 6, sm_size) - +genIFRwDataCode(1, 0x300, False, 0x20) - +genIFRwDataCode(2, 0x300, False, 0x20) - +genIFRwDataCode(3, 0x300, False, 0x20) - +genIFRwDataCode(4, 0x300, False, 0x20) - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - - +genMessageCode("--清除中断") - +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - - +genTcEndFrameCode(gen_file_def) - ) - - genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1, True, gen_file_def_ap) - return gen_file_def - - -def tc16(): - genPkt = GenPkt() - - gen_file_def = "ebmmu_tc16" - sm_idx = 0 - tc_des = "测试16个ebmmu全配置下运行,每4个ebmmu对应一个sm,映射4个字节。映射了sm0/2/4/6,共16个字节。\\n" \ - + "每个ebmmu必须对齐、足长的写入,对应的sm才能正常工作。两次写入数据,复位设备1的SM1,SM1状态复原,\\n"\ - + "第二次设备1的SM0不能读取到有效的数据。测试用例能成功运行完毕,除设备1的SM0,其余的SMx都能获得正确的数据。\\n" \ - + "检查内容:ebmmu工作状态、回包工作计数、SMx的状态、中断状态、统计信息、相关时序" - - genPkt.clean() - genPkt.setPktType(0) - - addr = 0x10000000 - addr_off = 0x0 - sm_size = 16 - - genPkt.addSubPkt(0x0, 0, 0x0018, 0xe, 2, [0x1, 0x58]) - #subPkt参数:索引、索引类型、地址、命令、长度、数据 - data = [0,] * 256 - - taddr = addr + addr_off - ebmmu_offset = 0 - for i in range(4): - setting_ebmmu_regs(data, - ebmmu_offset, - taddr + i * int(sm_size / 4), - 0x0800 + i * int(sm_size / 4), - sm_size / 4, - 0x2, - 0x1 - ) - #print(ebmmu_offset, hex(taddr + i * int(sm_size / 4)), hex(0x0800 + i * int(sm_size / 4))) - ebmmu_offset = ebmmu_offset + 1 - - addr_off = addr_off + sm_size - taddr = addr + addr_off - for i in range(4): - setting_ebmmu_regs(data, - ebmmu_offset, - taddr + i * int(sm_size / 4), - 0x1800 + i * int(sm_size / 4), - sm_size / 4, - 0x2, - 0x1 - ) - #print(ebmmu_offset, hex(taddr + i * int(sm_size / 4)), hex(0x1800 + i * int(sm_size / 4))) - ebmmu_offset = ebmmu_offset + 1 - - - addr_off = addr_off + sm_size - taddr = addr + addr_off - for i in range(4): - setting_ebmmu_regs(data, - ebmmu_offset, - taddr + i * int(sm_size / 4), - 0x2800 + i * int(sm_size / 4), - sm_size / 4, - 0x2, - 0x1 - ) - #print(ebmmu_offset + i, hex(taddr + i * int(sm_size / 4)), hex(0x2800 + i * int(sm_size / 4))) - ebmmu_offset = ebmmu_offset + 1 - - - addr_off = addr_off + sm_size - taddr = addr + addr_off - for i in range(4): - setting_ebmmu_regs(data, - ebmmu_offset, - taddr + i * int(sm_size / 4), - 0x3800 + i * int(sm_size / 4), - sm_size / 4, - 0x2, - 0x1 - ) - #print(ebmmu_offset, hex(taddr + i * int(sm_size / 4)), hex(0x3800 + i * int(sm_size / 4))) - ebmmu_offset = ebmmu_offset + 1 - - genPkt.addSubPkt(0x1, 0, 0x0200, 0x1, 160, data) - - #subPkt参数:索引、索引类型、地址、命令、长度、数据 - data = [0,] * 256 - - addr_off = addr_off + sm_size - taddr = addr + addr_off - ebmmu_offset = 0 - for i in range(4): - setting_ebmmu_regs(data, - ebmmu_offset, - taddr + i * int(sm_size / 4), - 0x0800 + i * int(sm_size / 4), - sm_size / 4, - 0x2, - 0x1 - ) - #print(ebmmu_offset, hex(taddr + i * int(sm_size / 4)), hex(0x0800 + i * int(sm_size / 4))) - ebmmu_offset = ebmmu_offset + 1 - - addr_off = addr_off + sm_size - taddr = addr + addr_off - for i in range(4): - setting_ebmmu_regs(data, - ebmmu_offset, - taddr + i * int(sm_size / 4), - 0x1800 + i * int(sm_size / 4), - sm_size / 4, - 0x2, - 0x1 - ) - #print(ebmmu_offset, hex(taddr + i * int(sm_size / 4)), hex(0x1800 + i * int(sm_size / 4))) - ebmmu_offset = ebmmu_offset + 1 - - - addr_off = addr_off + sm_size - taddr = addr + addr_off - for i in range(4): - setting_ebmmu_regs(data, - ebmmu_offset, - taddr + i * int(sm_size / 4), - 0x2800 + i * int(sm_size / 4), - sm_size / 4, - 0x2, - 0x1 - ) - #print(ebmmu_offset + i, hex(taddr + i * int(sm_size / 4)), hex(0x2800 + i * int(sm_size / 4))) - ebmmu_offset = ebmmu_offset + 1 - - - addr_off = addr_off + sm_size - taddr = addr + addr_off - for i in range(4): - setting_ebmmu_regs(data, - ebmmu_offset, - taddr + i * int(sm_size / 4), - 0x3800 + i * int(sm_size / 4), - sm_size / 4, - 0x2, - 0x1 - ) - #print(ebmmu_offset, hex(taddr + i * int(sm_size / 4)), hex(0x3800 + i * int(sm_size / 4))) - ebmmu_offset = ebmmu_offset + 1 - - genPkt.addSubPkt(0x2, 0, 0x0200, 0x1, 160, data) - - - #subPkt参数:索引、索引类型、地址、命令、长度、数据 - data = [0,] * 256 - - addr_off = addr_off + sm_size - taddr = addr + addr_off - ebmmu_offset = 0 - for i in range(4): - setting_ebmmu_regs(data, - ebmmu_offset, - taddr + i * int(sm_size / 4), - 0x0800 + i * int(sm_size / 4), - sm_size / 4, - 0x2, - 0x1 - ) - #print(ebmmu_offset, hex(taddr + i * int(sm_size / 4)), hex(0x0800 + i * int(sm_size / 4))) - ebmmu_offset = ebmmu_offset + 1 - - addr_off = addr_off + sm_size - taddr = addr + addr_off - for i in range(4): - setting_ebmmu_regs(data, - ebmmu_offset, - taddr + i * int(sm_size / 4), - 0x1800 + i * int(sm_size / 4), - sm_size / 4, - 0x2, - 0x1 - ) - #print(ebmmu_offset, hex(taddr + i * int(sm_size / 4)), hex(0x1800 + i * int(sm_size / 4))) - ebmmu_offset = ebmmu_offset + 1 - - - addr_off = addr_off + sm_size - taddr = addr + addr_off - for i in range(4): - setting_ebmmu_regs(data, - ebmmu_offset, - taddr + i * int(sm_size / 4), - 0x2800 + i * int(sm_size / 4), - sm_size / 4, - 0x2, - 0x1 - ) - #print(ebmmu_offset + i, hex(taddr + i * int(sm_size / 4)), hex(0x2800 + i * int(sm_size / 4))) - ebmmu_offset = ebmmu_offset + 1 - - - addr_off = addr_off + sm_size - taddr = addr + addr_off - for i in range(4): - setting_ebmmu_regs(data, - ebmmu_offset, - taddr + i * int(sm_size / 4), - 0x3800 + i * int(sm_size / 4), - sm_size / 4, - 0x2, - 0x1 - ) - #print(ebmmu_offset, hex(taddr + i * int(sm_size / 4)), hex(0x3800 + i * int(sm_size / 4))) - ebmmu_offset = ebmmu_offset + 1 - - genPkt.addSubPkt(0x3, 0, 0x0200, 0x1, 160, data) - - - #subPkt参数:索引、索引类型、地址、命令、长度、数据 - data = [0,] * 256 - - addr_off = addr_off + sm_size - taddr = addr + addr_off - ebmmu_offset = 0 - for i in range(4): - setting_ebmmu_regs(data, - ebmmu_offset, - taddr + i * int(sm_size / 4), - 0x0800 + i * int(sm_size / 4), - sm_size / 4, - 0x2, - 0x1 - ) - #print(ebmmu_offset, hex(taddr + i * int(sm_size / 4)), hex(0x0800 + i * int(sm_size / 4))) - ebmmu_offset = ebmmu_offset + 1 - - addr_off = addr_off + sm_size - taddr = addr + addr_off - for i in range(4): - setting_ebmmu_regs(data, - ebmmu_offset, - taddr + i * int(sm_size / 4), - 0x1800 + i * int(sm_size / 4), - sm_size / 4, - 0x2, - 0x1 - ) - #print(ebmmu_offset, hex(taddr + i * int(sm_size / 4)), hex(0x1800 + i * int(sm_size / 4))) - ebmmu_offset = ebmmu_offset + 1 - - - addr_off = addr_off + sm_size - taddr = addr + addr_off - for i in range(4): - setting_ebmmu_regs(data, - ebmmu_offset, - taddr + i * int(sm_size / 4), - 0x2800 + i * int(sm_size / 4), - sm_size / 4, - 0x2, - 0x1 - ) - #print(ebmmu_offset + i, hex(taddr + i * int(sm_size / 4)), hex(0x2800 + i * int(sm_size / 4))) - ebmmu_offset = ebmmu_offset + 1 - - - addr_off = addr_off + sm_size - taddr = addr + addr_off - for i in range(4): - setting_ebmmu_regs(data, - ebmmu_offset, - taddr + i * int(sm_size / 4), - 0x3800 + i * int(sm_size / 4), - sm_size / 4, - 0x2, - 0x1 - ) - #print(ebmmu_offset, hex(taddr + i * int(sm_size / 4)), hex(0x3800 + i * int(sm_size / 4))) - ebmmu_offset = ebmmu_offset + 1 - - - genPkt.addSubPkt(0x4, 0, 0x0200, 0x1, 160, data) - - genPkt.addSubPkt(0x0, 0, 0x0018, 0xe, 2, [0x0, 0x58]) - - data = [0,] * 2 - data[0] = (sm_size >> 0) & 0xff - data[1] = (sm_size >> 8) & 0xff - genPkt.addSubPkt(0x0, 0, 0x302, 0xe, 2, data) - - data = [0,] * 2 - data[0] = (sm_size >> 0) & 0xff - data[1] = (sm_size >> 8) & 0xff - genPkt.addSubPkt(0x0, 0, 0x30a, 0xe, 2, data) - - data = [0,] * 2 - data[0] = (sm_size >> 0) & 0xff - data[1] = (sm_size >> 8) & 0xff - genPkt.addSubPkt(0x0, 0, 0x312, 0xe, 2, data) - - - data = [0,] * 2 - data[0] = (sm_size >> 0) & 0xff - data[1] = (sm_size >> 8) & 0xff - genPkt.addSubPkt(0x0, 0, 0x31a, 0xe, 2, data) - - - genPkt.addBeforeExc(genTcStartFrameCode(gen_file_def, tc_des) - +genMessageCode("--清除中断") - +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - ) - - genPkt.addAfterExc( genWriteTransLenCode(gen_file_def, sm_idx) - +genWriteTransPktCode(gen_file_def, sm_idx) - +genTrgTransPktCode(gen_file_def, sm_idx) - +genReadAckPktCode(gen_file_def, sm_idx) - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - - +genMessageCode("--清除中断") - +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - ) - - genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1) - - #>>>>>>用EB-MMU方式读取EB-MMU设置, 15 - genPkt.clean() - genPkt.setPktType(0) - - #subPkt参数:索引、索引类型、地址、命令、长度、数据 - data = [(i & 0xff) for i in range(sm_size * 16)] - - gen_file_def_ap = "ebmmu_tc16_rw" - sm_idx = 0 - - genPkt.addSubPkt(0x1000, 2, 0, 0x1, sm_size * 16, data) - - data = [((i * 2)& 0xff) for i in range(sm_size * 16)] - genPkt.addSubPkt(0x1000, 2, 0, 0x1, sm_size * 16, data) - - rst_data=[0x0, ] - - genPkt.addAfterExc(genWriteTransLenCode(gen_file_def_ap, sm_idx) - +genWriteTransPktCode(gen_file_def_ap, sm_idx) - +genTrgTransPktCode(gen_file_def_ap, sm_idx) - +genReadAckPktCode(gen_file_def_ap, sm_idx) - +genIFRwDataCode(1, 0x300, False, 0x20) - +genIFRwDataCode(2, 0x300, False, 0x20) - +genIFRwDataCode(3, 0x300, False, 0x20) - +genIFRwDataCode(4, 0x300, False, 0x20) - +genSlvSMReadData(1, 0, sm_size) - +genSlvSMReadData(1, 2, sm_size) - +genSlvSMReadData(1, 4, sm_size) - +genSlvSMReadData(1, 6, sm_size) - +genSlvSMReadData(2, 0, sm_size) - +genSlvSMReadData(2, 2, sm_size) - +genSlvSMReadData(2, 4, sm_size) - +genSlvSMReadData(2, 6, sm_size) - +genSlvSMReadData(3, 0, sm_size) - +genSlvSMReadData(3, 2, sm_size) - +genSlvSMReadData(3, 4, sm_size) - +genSlvSMReadData(3, 6, sm_size) - +genSlvSMReadData(4, 0, sm_size) - +genSlvSMReadData(4, 2, sm_size) - +genSlvSMReadData(4, 4, sm_size) - +genSlvSMReadData(4, 6, sm_size) - +genIFRwDataCode(1, 0x300, False, 0x20) - +genIFRwDataCode(1, 0x300, True, 1, rst_data) - +genIFRwDataCode(1, 0x300, False, 0x20) - +genIFRwDataCode(2, 0x300, False, 0x20) - +genIFRwDataCode(3, 0x300, False, 0x20) - +genIFRwDataCode(4, 0x300, False, 0x20) - +genSlvSMReadData(1, 0, sm_size) - +genSlvSMReadData(1, 2, sm_size) - +genSlvSMReadData(1, 4, sm_size) - +genSlvSMReadData(1, 6, sm_size) - +genSlvSMReadData(2, 0, sm_size) - +genSlvSMReadData(2, 2, sm_size) - +genSlvSMReadData(2, 4, sm_size) - +genSlvSMReadData(2, 6, sm_size) - +genSlvSMReadData(3, 0, sm_size) - +genSlvSMReadData(3, 2, sm_size) - +genSlvSMReadData(3, 4, sm_size) - +genSlvSMReadData(3, 6, sm_size) - +genSlvSMReadData(4, 0, sm_size) - +genSlvSMReadData(4, 2, sm_size) - +genSlvSMReadData(4, 4, sm_size) - +genSlvSMReadData(4, 6, sm_size) - +genIFRwDataCode(1, 0x300, False, 0x20) - +genIFRwDataCode(2, 0x300, False, 0x20) - +genIFRwDataCode(3, 0x300, False, 0x20) - +genIFRwDataCode(4, 0x300, False, 0x20) - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - - +genMessageCode("--清除中断") - +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - +genTcEndFrameCode(gen_file_def)) - - genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1, True, gen_file_def_ap) - return gen_file_def - -def tc17(): - genPkt = GenPkt() - - gen_file_def = "ebmmu_tc17" - sm_idx = 0 - tc_des = "测试16个ebmmu全配置下运行,每4个ebmmu对应一个SM,映射4个字节。分别映射SM1/3/5/7, \\n" \ - + "每个映射了16个字节。中间无字节空洞。使用1个子包,将数据读上来。每个ebmmu必须对齐、足长的写入,\\n" \ - + "对应的sm才能正常工作。QSPI/SPI侧能正常的读到相关的数据。" - - #-------------------------------------------------------------------------- - #>>>>>>设置EB-MMU,测试用例15,读,检查权限 - genPkt.clean() - genPkt.setPktType(0) - - addr = 0x10000000 - addr_off = 0x0 - sm_size = 16 - - genPkt.addSubPkt(0x0, 0, 0x0018, 0xe, 2, [0x1, 0x58]) - #subPkt参数:索引、索引类型、地址、命令、长度、数据 - data = [0,] * 256 - - taddr = addr + addr_off - ebmmu_offset = 0 - for i in range(4): - setting_ebmmu_regs(data, - ebmmu_offset, - taddr + i * int(sm_size / 4), - 0x1000 + i * int(sm_size / 4), - sm_size / 4, - 0x1, - 0x1 - ) - #print(ebmmu_offset, hex(taddr + i * int(sm_size / 4)), hex(0x0800 + i * int(sm_size / 4))) - ebmmu_offset = ebmmu_offset + 1 - - addr_off = addr_off + sm_size - taddr = addr + addr_off - for i in range(4): - setting_ebmmu_regs(data, - ebmmu_offset, - taddr + i * int(sm_size / 4), - 0x2000 + i * int(sm_size / 4), - sm_size / 4, - 0x1, - 0x1 - ) - #print(ebmmu_offset, hex(taddr + i * int(sm_size / 4)), hex(0x0800 + i * int(sm_size / 4))) - ebmmu_offset = ebmmu_offset + 1 - - addr_off = addr_off + sm_size - taddr = addr + addr_off - for i in range(4): - setting_ebmmu_regs(data, - ebmmu_offset, - taddr + i * int(sm_size / 4), - 0x3000 + i * int(sm_size / 4), - sm_size / 4, - 0x1, - 0x1 - ) - #print(ebmmu_offset, hex(taddr + i * int(sm_size / 4)), hex(0x0800 + i * int(sm_size / 4))) - ebmmu_offset = ebmmu_offset + 1 - - addr_off = addr_off + sm_size - taddr = addr + addr_off - for i in range(4): - setting_ebmmu_regs(data, - ebmmu_offset, - taddr + i * int(sm_size / 4), - 0x4000 + i * int(sm_size / 4), - sm_size / 4, - 0x1, - 0x1 - ) - #print(ebmmu_offset, hex(taddr + i * int(sm_size / 4)), hex(0x0800 + i * int(sm_size / 4))) - ebmmu_offset = ebmmu_offset + 1 - - genPkt.addSubPkt(0x1, 0, 0x0200, 0x1, 160, data) - - #subPkt参数:索引、索引类型、地址、命令、长度、数据 - data = [0,] * 256 - - addr_off = addr_off + sm_size - taddr = addr + addr_off - ebmmu_offset = 0 - for i in range(4): - setting_ebmmu_regs(data, - ebmmu_offset, - taddr + i * int(sm_size / 4), - 0x1000 + i * int(sm_size / 4), - sm_size / 4, - 0x1, - 0x1 - ) - #print(ebmmu_offset, hex(taddr + i * int(sm_size / 4)), hex(0x0800 + i * int(sm_size / 4))) - ebmmu_offset = ebmmu_offset + 1 - - addr_off = addr_off + sm_size - taddr = addr + addr_off - for i in range(4): - setting_ebmmu_regs(data, - ebmmu_offset, - taddr + i * int(sm_size / 4), - 0x2000 + i * int(sm_size / 4), - sm_size / 4, - 0x1, - 0x1 - ) - #print(ebmmu_offset, hex(taddr + i * int(sm_size / 4)), hex(0x0800 + i * int(sm_size / 4))) - ebmmu_offset = ebmmu_offset + 1 - - addr_off = addr_off + sm_size - taddr = addr + addr_off - for i in range(4): - setting_ebmmu_regs(data, - ebmmu_offset, - taddr + i * int(sm_size / 4), - 0x3000 + i * int(sm_size / 4), - sm_size / 4, - 0x1, - 0x1 - ) - #print(ebmmu_offset, hex(taddr + i * int(sm_size / 4)), hex(0x0800 + i * int(sm_size / 4))) - ebmmu_offset = ebmmu_offset + 1 - - addr_off = addr_off + sm_size - taddr = addr + addr_off - for i in range(4): - setting_ebmmu_regs(data, - ebmmu_offset, - taddr + i * int(sm_size / 4), - 0x4000 + i * int(sm_size / 4), - sm_size / 4, - 0x1, - 0x1 - ) - #print(ebmmu_offset, hex(taddr + i * int(sm_size / 4)), hex(0x0800 + i * int(sm_size / 4))) - ebmmu_offset = ebmmu_offset + 1 - - genPkt.addSubPkt(0x2, 0, 0x0200, 0x1, 160, data) - - - #subPkt参数:索引、索引类型、地址、命令、长度、数据 - data = [0,] * 256 - - addr_off = addr_off + sm_size - taddr = addr + addr_off - ebmmu_offset = 0 - for i in range(4): - setting_ebmmu_regs(data, - ebmmu_offset, - taddr + i * int(sm_size / 4), - 0x1000 + i * int(sm_size / 4), - sm_size / 4, - 0x1, - 0x1 - ) - #print(ebmmu_offset, hex(taddr + i * int(sm_size / 4)), hex(0x0800 + i * int(sm_size / 4))) - ebmmu_offset = ebmmu_offset + 1 - - addr_off = addr_off + sm_size - taddr = addr + addr_off - for i in range(4): - setting_ebmmu_regs(data, - ebmmu_offset, - taddr + i * int(sm_size / 4), - 0x2000 + i * int(sm_size / 4), - sm_size / 4, - 0x1, - 0x1 - ) - #print(ebmmu_offset, hex(taddr + i * int(sm_size / 4)), hex(0x0800 + i * int(sm_size / 4))) - ebmmu_offset = ebmmu_offset + 1 - - addr_off = addr_off + sm_size - taddr = addr + addr_off - for i in range(4): - setting_ebmmu_regs(data, - ebmmu_offset, - taddr + i * int(sm_size / 4), - 0x3000 + i * int(sm_size / 4), - sm_size / 4, - 0x1, - 0x1 - ) - #print(ebmmu_offset, hex(taddr + i * int(sm_size / 4)), hex(0x0800 + i * int(sm_size / 4))) - ebmmu_offset = ebmmu_offset + 1 - - addr_off = addr_off + sm_size - taddr = addr + addr_off - for i in range(4): - setting_ebmmu_regs(data, - ebmmu_offset, - taddr + i * int(sm_size / 4), - 0x4000 + i * int(sm_size / 4), - sm_size / 4, - 0x1, - 0x1 - ) - #print(ebmmu_offset, hex(taddr + i * int(sm_size / 4)), hex(0x0800 + i * int(sm_size / 4))) - ebmmu_offset = ebmmu_offset + 1 - - genPkt.addSubPkt(0x3, 0, 0x0200, 0x1, 160, data) - - - #subPkt参数:索引、索引类型、地址、命令、长度、数据 - data = [0,] * 256 - - addr_off = addr_off + sm_size - taddr = addr + addr_off - ebmmu_offset = 0 - for i in range(4): - setting_ebmmu_regs(data, - ebmmu_offset, - taddr + i * int(sm_size / 4), - 0x1000 + i * int(sm_size / 4), - sm_size / 4, - 0x1, - 0x1 - ) - #print(ebmmu_offset, hex(taddr + i * int(sm_size / 4)), hex(0x0800 + i * int(sm_size / 4))) - ebmmu_offset = ebmmu_offset + 1 - - addr_off = addr_off + sm_size - taddr = addr + addr_off - for i in range(4): - setting_ebmmu_regs(data, - ebmmu_offset, - taddr + i * int(sm_size / 4), - 0x2000 + i * int(sm_size / 4), - sm_size / 4, - 0x1, - 0x1 - ) - #print(ebmmu_offset, hex(taddr + i * int(sm_size / 4)), hex(0x0800 + i * int(sm_size / 4))) - ebmmu_offset = ebmmu_offset + 1 - - addr_off = addr_off + sm_size - taddr = addr + addr_off - for i in range(4): - setting_ebmmu_regs(data, - ebmmu_offset, - taddr + i * int(sm_size / 4), - 0x3000 + i * int(sm_size / 4), - sm_size / 4, - 0x1, - 0x1 - ) - #print(ebmmu_offset, hex(taddr + i * int(sm_size / 4)), hex(0x0800 + i * int(sm_size / 4))) - ebmmu_offset = ebmmu_offset + 1 - - addr_off = addr_off + sm_size - taddr = addr + addr_off - for i in range(4): - setting_ebmmu_regs(data, - ebmmu_offset, - taddr + i * int(sm_size / 4), - 0x4000 + i * int(sm_size / 4), - sm_size / 4, - 0x1, - 0x1 - ) - #print(ebmmu_offset, hex(taddr + i * int(sm_size / 4)), hex(0x0800 + i * int(sm_size / 4))) - ebmmu_offset = ebmmu_offset + 1 - - genPkt.addSubPkt(0x4, 0, 0x0200, 0x1, 160, data) - genPkt.addSubPkt(0x0, 0, 0x0018, 0xe, 2, [0x0, 0x58]) - - data = [0,] * 2 - data[0] = (sm_size >> 0) & 0xff - data[1] = (sm_size >> 8) & 0xff - genPkt.addSubPkt(0x0, 0, 0x306, 0xe, 2, data) - - data = [0,] * 2 - data[0] = (sm_size >> 0) & 0xff - data[1] = (sm_size >> 8) & 0xff - genPkt.addSubPkt(0x0, 0, 0x30e, 0xe, 2, data) - - data = [0,] * 2 - data[0] = (sm_size >> 0) & 0xff - data[1] = (sm_size >> 8) & 0xff - genPkt.addSubPkt(0x0, 0, 0x316, 0xe, 2, data) - - - data = [0,] * 2 - data[0] = (sm_size >> 0) & 0xff - data[1] = (sm_size >> 8) & 0xff - genPkt.addSubPkt(0x0, 0, 0x31e, 0xe, 2, data) - - genPkt.addBeforeExc(genTcStartFrameCode(gen_file_def, tc_des) - +genMessageCode("--清除中断") - +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - ) - - genPkt.addAfterExc(genWriteTransLenCode(gen_file_def, sm_idx) - +genWriteTransPktCode(gen_file_def, sm_idx) - +genTrgTransPktCode(gen_file_def, sm_idx) - +genReadAckPktCode(gen_file_def, sm_idx) - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - - +genMessageCode("--清除中断") - +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - ) - - genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1) - - #>>>>>>用EB-MMU方式读取EB-MMU设置, 15 - genPkt.clean() - genPkt.setPktType(0) - - #subPkt参数:索引、索引类型、地址、命令、长度、数据 - data = [(i & 0xff) for i in range(sm_size * 16)] - - gen_file_def_ap = gen_file_def + "_rw" - sm_idx = 0 - - genPkt.addSubPkt(0x1000, 2, 0, 0x0, sm_size * 16, data) - - genPkt.addBeforeExc(genSlvSMWriteData(1, 1, sm_size, list(range(0, sm_size))) - +genSlvSMWriteData(1, 3, sm_size, list(range(0, sm_size * 2, 2))) - +genSlvSMWriteData(1, 5, sm_size, list(range(0, sm_size * 3, 3))) - +genSlvSMWriteData(1, 7, sm_size, list(range(0, sm_size * 4, 4))) - +genSlvSMWriteData(2, 1, sm_size, list(range(0, sm_size * 5, 5))) - +genSlvSMWriteData(2, 3, sm_size, list(range(0, sm_size * 6, 6))) - +genSlvSMWriteData(2, 5, sm_size, list(range(0, sm_size * 7, 7))) - +genSlvSMWriteData(2, 7, sm_size, list(range(0, sm_size * 8, 8))) - +genSlvSMWriteData(3, 1, sm_size, list(range(0, sm_size * 9, 9))) - +genSlvSMWriteData(3, 3, sm_size, list(range(0, sm_size * 8, 8))) - +genSlvSMWriteData(3, 5, sm_size, list(range(0, sm_size * 7, 7))) - +genSlvSMWriteData(3, 7, sm_size, list(range(0, sm_size * 6, 6))) - +genSlvSMWriteData(4, 1, sm_size, list(range(0, sm_size * 5, 5))) - +genSlvSMWriteData(4, 3, sm_size, list(range(0, sm_size * 4, 4))) - +genSlvSMWriteData(4, 5, sm_size, list(range(0, sm_size * 3, 3))) - +genSlvSMWriteData(4, 7, sm_size, list(range(0, sm_size * 2, 2))) - ) - - genPkt.addAfterExc(genWriteTransLenCode(gen_file_def_ap, sm_idx) - +genWriteTransPktCode(gen_file_def_ap, sm_idx) - +genTrgTransPktCode(gen_file_def_ap, sm_idx) - +genReadAckPktCode(gen_file_def_ap, sm_idx) - - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - - +genMessageCode("--清除中断") - +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - - +genTcEndFrameCode(gen_file_def) - ) - - genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1, True, gen_file_def_ap) - return gen_file_def - - -def tc18(): - genPkt = GenPkt() - - gen_file_def = "ebmmu_tc18" - sm_idx = 0 - tc_des = "测试16个ebmmu全配置下运行,每4个ebmmu对应一个SM,映射4个字节。分别映射SM1/3/4/6, \\n" \ - + "每个映射了16个字节。中间无字节空洞。使用1个子包,将数据读写上来。每个ebmmu必须对齐、足长的写入,\\n" \ - + "对应的sm才能正常工作。这里注意,子包是读写的,但是ebmmu是有权限的,通过权限合理的分配,实现一个子包既读又写。" - - #-------------------------------------------------------------------------- - #>>>>>>设置EB-MMU,测试用例15,读,检查权限 - genPkt.clean() - genPkt.setPktType(0) - - addr = 0x10000000 - addr_off = 0x0 - sm_size = 16 - - genPkt.addSubPkt(0x0, 0, 0x0018, 0xe, 2, [0x1, 0x58]) - #subPkt参数:索引、索引类型、地址、命令、长度、数据 - data = [0,] * 256 - - taddr = addr + addr_off - ebmmu_offset = 0 - for i in range(4): - setting_ebmmu_regs(data, - ebmmu_offset, - taddr + i * int(sm_size / 4), - 0x1000 + i * int(sm_size / 4), - sm_size / 4, - 0x1, - 0x1 - ) - #print(ebmmu_offset, hex(taddr + i * int(sm_size / 4)), hex(0x0800 + i * int(sm_size / 4))) - ebmmu_offset = ebmmu_offset + 1 - - addr_off = addr_off + sm_size - taddr = addr + addr_off - for i in range(4): - setting_ebmmu_regs(data, - ebmmu_offset, - taddr + i * int(sm_size / 4), - 0x2000 + i * int(sm_size / 4), - sm_size / 4, - 0x1, - 0x1 - ) - #print(ebmmu_offset, hex(taddr + i * int(sm_size / 4)), hex(0x0800 + i * int(sm_size / 4))) - ebmmu_offset = ebmmu_offset + 1 - - addr_off = addr_off + sm_size - taddr = addr + addr_off - for i in range(4): - setting_ebmmu_regs(data, - ebmmu_offset, - taddr + i * int(sm_size / 4), - 0x2800 + i * int(sm_size / 4), - sm_size / 4, - 0x2, - 0x1 - ) - #print(ebmmu_offset, hex(taddr + i * int(sm_size / 4)), hex(0x0800 + i * int(sm_size / 4))) - ebmmu_offset = ebmmu_offset + 1 - - addr_off = addr_off + sm_size - taddr = addr + addr_off - for i in range(4): - setting_ebmmu_regs(data, - ebmmu_offset, - taddr + i * int(sm_size / 4), - 0x3800 + i * int(sm_size / 4), - sm_size / 4, - 0x2, - 0x1 - ) - #print(ebmmu_offset, hex(taddr + i * int(sm_size / 4)), hex(0x0800 + i * int(sm_size / 4))) - ebmmu_offset = ebmmu_offset + 1 - - genPkt.addSubPkt(0x1, 0, 0x0200, 0x1, 160, data) - - #subPkt参数:索引、索引类型、地址、命令、长度、数据 - data = [0,] * 256 - - addr_off = addr_off + sm_size - taddr = addr + addr_off - ebmmu_offset = 0 - for i in range(4): - setting_ebmmu_regs(data, - ebmmu_offset, - taddr + i * int(sm_size / 4), - 0x1000 + i * int(sm_size / 4), - sm_size / 4, - 0x1, - 0x1 - ) - #print(ebmmu_offset, hex(taddr + i * int(sm_size / 4)), hex(0x0800 + i * int(sm_size / 4))) - ebmmu_offset = ebmmu_offset + 1 - - addr_off = addr_off + sm_size - taddr = addr + addr_off - for i in range(4): - setting_ebmmu_regs(data, - ebmmu_offset, - taddr + i * int(sm_size / 4), - 0x2000 + i * int(sm_size / 4), - sm_size / 4, - 0x1, - 0x1 - ) - #print(ebmmu_offset, hex(taddr + i * int(sm_size / 4)), hex(0x0800 + i * int(sm_size / 4))) - ebmmu_offset = ebmmu_offset + 1 - - addr_off = addr_off + sm_size - taddr = addr + addr_off - for i in range(4): - setting_ebmmu_regs(data, - ebmmu_offset, - taddr + i * int(sm_size / 4), - 0x2800 + i * int(sm_size / 4), - sm_size / 4, - 0x2, - 0x1 - ) - #print(ebmmu_offset, hex(taddr + i * int(sm_size / 4)), hex(0x0800 + i * int(sm_size / 4))) - ebmmu_offset = ebmmu_offset + 1 - - addr_off = addr_off + sm_size - taddr = addr + addr_off - for i in range(4): - setting_ebmmu_regs(data, - ebmmu_offset, - taddr + i * int(sm_size / 4), - 0x3800 + i * int(sm_size / 4), - sm_size / 4, - 0x2, - 0x1 - ) - #print(ebmmu_offset, hex(taddr + i * int(sm_size / 4)), hex(0x0800 + i * int(sm_size / 4))) - ebmmu_offset = ebmmu_offset + 1 - - genPkt.addSubPkt(0x2, 0, 0x0200, 0x1, 160, data) - - - #subPkt参数:索引、索引类型、地址、命令、长度、数据 - data = [0,] * 256 - - addr_off = addr_off + sm_size - taddr = addr + addr_off - ebmmu_offset = 0 - for i in range(4): - setting_ebmmu_regs(data, - ebmmu_offset, - taddr + i * int(sm_size / 4), - 0x1000 + i * int(sm_size / 4), - sm_size / 4, - 0x1, - 0x1 - ) - #print(ebmmu_offset, hex(taddr + i * int(sm_size / 4)), hex(0x0800 + i * int(sm_size / 4))) - ebmmu_offset = ebmmu_offset + 1 - - addr_off = addr_off + sm_size - taddr = addr + addr_off - for i in range(4): - setting_ebmmu_regs(data, - ebmmu_offset, - taddr + i * int(sm_size / 4), - 0x2000 + i * int(sm_size / 4), - sm_size / 4, - 0x1, - 0x1 - ) - #print(ebmmu_offset, hex(taddr + i * int(sm_size / 4)), hex(0x0800 + i * int(sm_size / 4))) - ebmmu_offset = ebmmu_offset + 1 - - addr_off = addr_off + sm_size - taddr = addr + addr_off - for i in range(4): - setting_ebmmu_regs(data, - ebmmu_offset, - taddr + i * int(sm_size / 4), - 0x2800 + i * int(sm_size / 4), - sm_size / 4, - 0x2, - 0x1 - ) - #print(ebmmu_offset, hex(taddr + i * int(sm_size / 4)), hex(0x0800 + i * int(sm_size / 4))) - ebmmu_offset = ebmmu_offset + 1 - - addr_off = addr_off + sm_size - taddr = addr + addr_off - for i in range(4): - setting_ebmmu_regs(data, - ebmmu_offset, - taddr + i * int(sm_size / 4), - 0x3800 + i * int(sm_size / 4), - sm_size / 4, - 0x2, - 0x1 - ) - #print(ebmmu_offset, hex(taddr + i * int(sm_size / 4)), hex(0x0800 + i * int(sm_size / 4))) - ebmmu_offset = ebmmu_offset + 1 - - genPkt.addSubPkt(0x3, 0, 0x0200, 0x1, 160, data) - - - #subPkt参数:索引、索引类型、地址、命令、长度、数据 - data = [0,] * 256 - - addr_off = addr_off + sm_size - taddr = addr + addr_off - ebmmu_offset = 0 - for i in range(4): - setting_ebmmu_regs(data, - ebmmu_offset, - taddr + i * int(sm_size / 4), - 0x1000 + i * int(sm_size / 4), - sm_size / 4, - 0x1, - 0x1 - ) - #print(ebmmu_offset, hex(taddr + i * int(sm_size / 4)), hex(0x0800 + i * int(sm_size / 4))) - ebmmu_offset = ebmmu_offset + 1 - - addr_off = addr_off + sm_size - taddr = addr + addr_off - for i in range(4): - setting_ebmmu_regs(data, - ebmmu_offset, - taddr + i * int(sm_size / 4), - 0x2000 + i * int(sm_size / 4), - sm_size / 4, - 0x1, - 0x1 - ) - #print(ebmmu_offset, hex(taddr + i * int(sm_size / 4)), hex(0x0800 + i * int(sm_size / 4))) - ebmmu_offset = ebmmu_offset + 1 - - addr_off = addr_off + sm_size - taddr = addr + addr_off - for i in range(4): - setting_ebmmu_regs(data, - ebmmu_offset, - taddr + i * int(sm_size / 4), - 0x2800 + i * int(sm_size / 4), - sm_size / 4, - 0x2, - 0x1 - ) - #print(ebmmu_offset, hex(taddr + i * int(sm_size / 4)), hex(0x0800 + i * int(sm_size / 4))) - ebmmu_offset = ebmmu_offset + 1 - - addr_off = addr_off + sm_size - taddr = addr + addr_off - for i in range(4): - setting_ebmmu_regs(data, - ebmmu_offset, - taddr + i * int(sm_size / 4), - 0x3800 + i * int(sm_size / 4), - sm_size / 4, - 0x2, - 0x1 - ) - #print(ebmmu_offset, hex(taddr + i * int(sm_size / 4)), hex(0x0800 + i * int(sm_size / 4))) - ebmmu_offset = ebmmu_offset + 1 - - genPkt.addSubPkt(0x4, 0, 0x0200, 0x1, 160, data) - genPkt.addSubPkt(0x0, 0, 0x0018, 0xe, 2, [0x0, 0x58]) - - data = [0,] * 2 - data[0] = (sm_size >> 0) & 0xff - data[1] = (sm_size >> 8) & 0xff - genPkt.addSubPkt(0x0, 0, 0x306, 0xe, 2, data) - - data = [0,] * 2 - data[0] = (sm_size >> 0) & 0xff - data[1] = (sm_size >> 8) & 0xff - genPkt.addSubPkt(0x0, 0, 0x30e, 0xe, 2, data) - - data = [0,] * 2 - data[0] = (sm_size >> 0) & 0xff - data[1] = (sm_size >> 8) & 0xff - genPkt.addSubPkt(0x0, 0, 0x312, 0xe, 2, data) - - - data = [0,] * 2 - data[0] = (sm_size >> 0) & 0xff - data[1] = (sm_size >> 8) & 0xff - genPkt.addSubPkt(0x0, 0, 0x31a, 0xe, 2, data) - - genPkt.addBeforeExc(genTcStartFrameCode(gen_file_def, tc_des) - +genMessageCode("--清除中断") - +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - ) - - genPkt.addAfterExc(genWriteTransLenCode(gen_file_def, sm_idx) - +genWriteTransPktCode(gen_file_def, sm_idx) - +genTrgTransPktCode(gen_file_def, sm_idx) - +genReadAckPktCode(gen_file_def, sm_idx) - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - - +genMessageCode("--清除中断") - +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - ) - - genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1) - - #>>>>>>用EB-MMU方式读取EB-MMU设置, 15 - genPkt.clean() - genPkt.setPktType(0) - - #subPkt参数:索引、索引类型、地址、命令、长度、数据 - data = [(i & 0xff) for i in range(sm_size * 16)] - - gen_file_def_ap = gen_file_def + "_rw" - sm_idx = 0 - - genPkt.addSubPkt(0x1000, 2, 0, 0x2, sm_size * 16, data) - - genPkt.addBeforeExc(genSlvSMWriteData(1, 1, sm_size, list(range(0, sm_size))) - +genSlvSMWriteData(1, 3, sm_size, list(range(0, sm_size * 2, 2))) - #+genSlvSMWriteData(1, 5, sm_size, list(range(0, sm_size * 3, 3))) - #+genSlvSMWriteData(1, 7, sm_size, list(range(0, sm_size * 4, 4))) - +genSlvSMWriteData(2, 1, sm_size, list(range(0, sm_size * 5, 5))) - +genSlvSMWriteData(2, 3, sm_size, list(range(0, sm_size * 6, 6))) - #+genSlvSMWriteData(2, 5, sm_size, list(range(0, sm_size * 7, 7))) - #+genSlvSMWriteData(2, 7, sm_size, list(range(0, sm_size * 8, 8))) - +genSlvSMWriteData(3, 1, sm_size, list(range(0, sm_size * 9, 9))) - +genSlvSMWriteData(3, 3, sm_size, list(range(0, sm_size * 8, 8))) - #+genSlvSMWriteData(3, 5, sm_size, list(range(0, sm_size * 7, 7))) - #+genSlvSMWriteData(3, 7, sm_size, list(range(0, sm_size * 6, 6))) - +genSlvSMWriteData(4, 1, sm_size, list(range(0, sm_size * 5, 5))) - +genSlvSMWriteData(4, 3, sm_size, list(range(0, sm_size * 4, 4))) - #+genSlvSMWriteData(4, 5, sm_size, list(range(0, sm_size * 3, 3))) - #+genSlvSMWriteData(4, 7, sm_size, list(range(0, sm_size * 2, 2))) - ) - - genPkt.addAfterExc(genWriteTransLenCode(gen_file_def_ap, sm_idx) - +genWriteTransPktCode(gen_file_def_ap, sm_idx) - +genTrgTransPktCode(gen_file_def_ap, sm_idx) - +genReadAckPktCode(gen_file_def_ap, sm_idx) - - +genSlvSMReadData(1, 4, sm_size) - +genSlvSMReadData(1, 6, sm_size) - +genSlvSMReadData(2, 4, sm_size) - +genSlvSMReadData(2, 6, sm_size) - +genSlvSMReadData(3, 4, sm_size) - +genSlvSMReadData(3, 6, sm_size) - +genSlvSMReadData(4, 4, sm_size) - +genSlvSMReadData(4, 6, sm_size) - - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - - +genMessageCode("--清除中断") - +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - - +genTcEndFrameCode(gen_file_def) - ) - - genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1, True, gen_file_def_ap) - return gen_file_def - -def tc19(): - genPkt = GenPkt() - - gen_file_def = "ebmmu_tc19" - sm_idx = 0 - tc_des = "测试16个ebmmu全配置下运行,前8个ebmmu映射的是SM的元素个数寄存器,每一个对应一个SM,1个字节,\\n"\ - + "4个设备共32字节;后8个ebmmu,每1个ebmmu对应一个sm,映射8个字节。映射了sm0/2/4/6,\\n"\ - + "然后映射sm1/3/5/7,共64个字节,4个从设备总共256个字节。每个ebmmu必须对齐、足长的写入,\\n"\ - + "对应的sm才能正常工作。检查内容:ebmmu工作状态、回包工作计数、SMx的状态、中断状态、统计信息、相关时序" - - genPkt.clean() - genPkt.setPktType(0) - - addr = 0x20000000 - addr_off = 0x0 - sm_size = 8 - - genPkt.addSubPkt(0x0, 0, 0x0018, 0xe, 2, [0x1, 0x58]) - - sm_vaddr = 0x10000000 - sm_addr_off = 0x0 - - #subPkt参数:索引、索引类型、地址、命令、长度、数据 - data = [0,] * 256 - - taddr = addr + addr_off - ebmmu_offset = 0 - for i in range(8): - setting_ebmmu_regs(data, ebmmu_offset, - taddr + ebmmu_offset * 1, - 0x301 + ebmmu_offset * 4, - 1, - 0x1, - 0x1 - ) - #print(ebmmu_offset, hex(taddr + ebmmu_offset * 1), hex(0x301 + ebmmu_offset * 4), hex(1)) - ebmmu_offset = ebmmu_offset + 1 - - addr_off = addr_off + ebmmu_offset * 1 - - - tsm_vaddr = sm_vaddr + sm_addr_off - for i in range(4): - setting_ebmmu_regs(data, ebmmu_offset, - tsm_vaddr + i * sm_size, - 0x0800 + i * 0x1000, sm_size, 0x2, 0x1) - #print(ebmmu_offset, hex(tsm_vaddr + i * sm_size), hex(0x0800 + i * 0x1000), hex(sm_size)) - ebmmu_offset = ebmmu_offset + 1 - - sm_addr_off = sm_addr_off + 4 * sm_size - tsm_vaddr = sm_vaddr + sm_addr_off - for i in range(4): - setting_ebmmu_regs(data, ebmmu_offset, - tsm_vaddr + i * sm_size, - 0x1000 + i * 0x1000, sm_size, 0x1, 0x1) - #print(ebmmu_offset, hex(tsm_vaddr + i * sm_size), hex(0x1000 + i * 0x1000), hex(sm_size)) - ebmmu_offset = ebmmu_offset + 1 - sm_addr_off = sm_addr_off + 4 * sm_size - - genPkt.addSubPkt(0x1, 0, 0x0200, 0x1, 160, data) - - data = [0,] * 256 - taddr = addr + addr_off - ebmmu_offset = 0 - for i in range(8): - setting_ebmmu_regs(data, ebmmu_offset, - taddr + ebmmu_offset * 1, - 0x301 + ebmmu_offset * 4, - 1, - 0x1, - 0x1 - ) - #print(ebmmu_offset, hex(taddr + ebmmu_offset * 1), hex(0x301 + ebmmu_offset * 4), hex(1)) - ebmmu_offset = ebmmu_offset + 1 - - addr_off = addr_off + ebmmu_offset * 1 - - - tsm_vaddr = sm_vaddr + sm_addr_off - for i in range(4): - setting_ebmmu_regs(data, ebmmu_offset, - tsm_vaddr + i * sm_size, - 0x0800 + i * 0x1000, sm_size, 0x2, 0x1) - #print(ebmmu_offset, hex(tsm_vaddr + i * sm_size), hex(0x0800 + i * 0x1000), hex(sm_size)) - ebmmu_offset = ebmmu_offset + 1 - - sm_addr_off = sm_addr_off + 4 * sm_size - tsm_vaddr = sm_vaddr + sm_addr_off - for i in range(4): - setting_ebmmu_regs(data, ebmmu_offset, - tsm_vaddr + i * sm_size, - 0x1000 + i * 0x1000, sm_size, 0x1, 0x1) - #print(ebmmu_offset, hex(tsm_vaddr + i * sm_size), hex(0x1000 + i * 0x1000), hex(sm_size)) - ebmmu_offset = ebmmu_offset + 1 - sm_addr_off = sm_addr_off + 4 * sm_size - - genPkt.addSubPkt(0x2, 0, 0x0200, 0x1, 160, data) - - data = [0,] * 256 - taddr = addr + addr_off - ebmmu_offset = 0 - for i in range(8): - setting_ebmmu_regs(data, ebmmu_offset, - taddr + ebmmu_offset * 1, - 0x301 + ebmmu_offset * 4, - 1, - 0x1, - 0x1 - ) - #print(ebmmu_offset, hex(taddr + ebmmu_offset * 1), hex(0x301 + ebmmu_offset * 4), hex(1)) - ebmmu_offset = ebmmu_offset + 1 - - addr_off = addr_off + ebmmu_offset * 1 - - - tsm_vaddr = sm_vaddr + sm_addr_off - for i in range(4): - setting_ebmmu_regs(data, ebmmu_offset, - tsm_vaddr + i * sm_size, - 0x0800 + i * 0x1000, sm_size, 0x2, 0x1) - #print(ebmmu_offset, hex(tsm_vaddr + i * sm_size), hex(0x0800 + i * 0x1000), hex(sm_size)) - ebmmu_offset = ebmmu_offset + 1 - - sm_addr_off = sm_addr_off + 4 * sm_size - tsm_vaddr = sm_vaddr + sm_addr_off - for i in range(4): - setting_ebmmu_regs(data, ebmmu_offset, - tsm_vaddr + i * sm_size, - 0x1000 + i * 0x1000, sm_size, 0x1, 0x1) - #print(ebmmu_offset, hex(tsm_vaddr + i * sm_size), hex(0x1000 + i * 0x1000), hex(sm_size)) - ebmmu_offset = ebmmu_offset + 1 - sm_addr_off = sm_addr_off + 4 * sm_size - - genPkt.addSubPkt(0x3, 0, 0x0200, 0x1, 160, data) - - - data = [0,] * 256 - taddr = addr + addr_off - ebmmu_offset = 0 - for i in range(8): - setting_ebmmu_regs(data, ebmmu_offset, - taddr + ebmmu_offset * 1, - 0x301 + ebmmu_offset * 4, - 1, - 0x1, - 0x1 - ) - #print(ebmmu_offset, hex(taddr + ebmmu_offset * 1), hex(0x301 + ebmmu_offset * 4), hex(1)) - ebmmu_offset = ebmmu_offset + 1 - - addr_off = addr_off + ebmmu_offset * 1 - - - tsm_vaddr = sm_vaddr + sm_addr_off - for i in range(4): - setting_ebmmu_regs(data, ebmmu_offset, - tsm_vaddr + i * sm_size, - 0x0800 + i * 0x1000, sm_size, 0x2, 0x1) - #print(ebmmu_offset, hex(tsm_vaddr + i * sm_size), hex(0x0800 + i * 0x1000), hex(sm_size)) - ebmmu_offset = ebmmu_offset + 1 - - sm_addr_off = sm_addr_off + 4 * sm_size - tsm_vaddr = sm_vaddr + sm_addr_off - for i in range(4): - setting_ebmmu_regs(data, ebmmu_offset, - tsm_vaddr + i * sm_size, - 0x1000 + i * 0x1000, sm_size, 0x1, 0x1) - #print(ebmmu_offset, hex(tsm_vaddr + i * sm_size), hex(0x1000 + i * 0x1000), hex(sm_size)) - ebmmu_offset = ebmmu_offset + 1 - sm_addr_off = sm_addr_off + 4 * sm_size - - genPkt.addSubPkt(0x4, 0, 0x0200, 0x1, 160, data) - genPkt.addSubPkt(0x0, 0, 0x0018, 0xe, 2, [0x0, 0x58]) - - data = [0,] * 2 - data[0] = (sm_size >> 0) & 0xff - data[1] = (sm_size >> 8) & 0xff - genPkt.addSubPkt(0x0, 0, 0x302, 0xe, 2, data) - - ''' - data = [0,] * 2 - data[0] = (sm_size >> 0) & 0xff - data[1] = (sm_size >> 8) & 0xff - genPkt.addSubPkt(0x0, 0, 0x306, 0xe, 2, data) - ''' - - data = [0,] * 2 - data[0] = (sm_size >> 0) & 0xff - data[1] = (sm_size >> 8) & 0xff - genPkt.addSubPkt(0x0, 0, 0x30a, 0xe, 2, data) - - ''' - data = [0,] * 2 - data[0] = (sm_size >> 0) & 0xff - data[1] = (sm_size >> 8) & 0xff - genPkt.addSubPkt(0x0, 0, 0x30e, 0xe, 2, data) - ''' - - data = [0,] * 2 - data[0] = (sm_size >> 0) & 0xff - data[1] = (sm_size >> 8) & 0xff - genPkt.addSubPkt(0x0, 0, 0x312, 0xe, 2, data) - - ''' - data = [0,] * 2 - data[0] = (sm_size >> 0) & 0xff - data[1] = (sm_size >> 8) & 0xff - genPkt.addSubPkt(0x0, 0, 0x316, 0xe, 2, data) - ''' - - - data = [0,] * 2 - data[0] = (sm_size >> 0) & 0xff - data[1] = (sm_size >> 8) & 0xff - genPkt.addSubPkt(0x0, 0, 0x31a, 0xe, 2, data) - - ''' - data = [0,] * 2 - data[0] = (sm_size >> 0) & 0xff - data[1] = (sm_size >> 8) & 0xff - genPkt.addSubPkt(0x0, 0, 0x31e, 0xe, 2, data) - ''' - - genPkt.addBeforeExc(genTcStartFrameCode(gen_file_def, tc_des) - +genMessageCode("--清除中断") - +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - ) - - genPkt.addAfterExc(genWriteTransLenCode(gen_file_def, sm_idx) - +genWriteTransPktCode(gen_file_def, sm_idx) - +genTrgTransPktCode(gen_file_def, sm_idx) - +genReadAckPktCode(gen_file_def, sm_idx) - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - - +genMessageCode("--清除中断") - +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - ) - - genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1) - - #>>>>>>用EB-MMU方式读取EB-MMU设置, 15 - genPkt.clean() - genPkt.setPktType(0) - - #subPkt参数:索引、索引类型、地址、命令、长度、数据 - data = [(i & 0xff) for i in range(sm_size * 16)] - - gen_file_def_ap = gen_file_def + "_rw01" - sm_idx = 0 - - genPkt.addSubPkt(0x1000, 2, 0, 0x2, sm_size * 8 * 4, list(range(sm_size * 8 * 4))) - - genPkt.addBeforeExc(genMessageCode("\\n--写设备1数据") - +genSlvSMWriteData(1, 1, sm_size, list(range(0, sm_size))) - +genSlvSMWriteData(1, 3, sm_size, list(range(0, sm_size * 2, 2))) - +genSlvSMWriteData(1, 5, sm_size, list(range(0, sm_size * 3, 3))) - +genSlvSMWriteData(1, 7, sm_size, list(range(0, sm_size * 4, 4))) - - +genMessageCode("\\n--写设备2数据") - +genSlvSMWriteData(2, 1, sm_size, list(range(0, sm_size * 5, 5))) - +genSlvSMWriteData(2, 3, sm_size, list(range(0, sm_size * 6, 6))) - +genSlvSMWriteData(2, 5, sm_size, list(range(0, sm_size * 7, 7))) - +genSlvSMWriteData(2, 7, sm_size, list(range(0, sm_size * 8, 8))) - - +genMessageCode("\\n--写设备3数据") - +genSlvSMWriteData(3, 1, sm_size, list(range(0, sm_size * 9, 9))) - +genSlvSMWriteData(3, 3, sm_size, list(range(0, sm_size * 8, 8))) - +genSlvSMWriteData(3, 5, sm_size, list(range(0, sm_size * 7, 7))) - +genSlvSMWriteData(3, 7, sm_size, list(range(0, sm_size * 6, 6))) - - +genMessageCode("\\n--写设备4数据") - +genSlvSMWriteData(4, 1, sm_size, list(range(0, sm_size * 5, 5))) - +genSlvSMWriteData(4, 3, sm_size, list(range(0, sm_size * 4, 4))) - +genSlvSMWriteData(4, 5, sm_size, list(range(0, sm_size * 3, 3))) - +genSlvSMWriteData(4, 7, sm_size, list(range(0, sm_size * 2, 2))) - ) - - genPkt.addAfterExc(genWriteTransLenCode(gen_file_def_ap, sm_idx) - +genWriteTransPktCode(gen_file_def_ap, sm_idx) - +genTrgTransPktCode(gen_file_def_ap, sm_idx) - +genReadAckPktCode(gen_file_def_ap, sm_idx) - - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - - +genMessageCode("--清除中断") - +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - ) - genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1, True, gen_file_def_ap) - - - genPkt.clean() - genPkt.setPktType(0) - - gen_file_def_ap = gen_file_def + "_rw02" - sm_idx = 0 - - genPkt.addSubPkt(0x2000, 2, 0, 0x0, 8 * 4, [0, ] * 32) - - genPkt.addAfterExc(genWriteTransLenCode(gen_file_def_ap, sm_idx) - +genWriteTransPktCode(gen_file_def_ap, sm_idx) - +genTrgTransPktCode(gen_file_def_ap, sm_idx) - +genReadAckPktCode(gen_file_def_ap, sm_idx) - - +genMessageCode("\\n--读设备1数据") - +genSlvSMReadData(1, 0, sm_size) - +genSlvSMReadData(1, 2, sm_size) - +genSlvSMReadData(1, 4, sm_size) - +genSlvSMReadData(1, 6, sm_size) - - +genMessageCode("\\n--读设备2数据") - +genSlvSMReadData(2, 0, sm_size) - +genSlvSMReadData(2, 2, sm_size) - +genSlvSMReadData(2, 4, sm_size) - +genSlvSMReadData(2, 6, sm_size) - - +genMessageCode("\\n--读设备3数据") - +genSlvSMReadData(3, 0, sm_size) - +genSlvSMReadData(3, 2, sm_size) - +genSlvSMReadData(3, 4, sm_size) - +genSlvSMReadData(3, 6, sm_size) - - +genMessageCode("\\n--读设备4数据") - +genSlvSMReadData(4, 0, sm_size) - +genSlvSMReadData(4, 2, sm_size) - +genSlvSMReadData(4, 4, sm_size) - +genSlvSMReadData(4, 6, sm_size) - - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - - +genMessageCode("--清除中断") - +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - - +genTcEndFrameCode(gen_file_def) - ) - - genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1, True, gen_file_def_ap) - return gen_file_def - - - - +from pyutils import * + +def tc1(): + genPkt = GenPkt() + + gen_file_def = "ebmmu_tc01" + sm_idx = 0 + tc_des = "每个从站都使用ebmmu[0],共4个mmu,从0x1000_0000位置向后对齐,每个设备占10个字节,\\n" \ + + "映射0x200~0x20a,中间无字节空洞。主站使用1个子包,将4个设备的数据一次性读上来。\\n"\ + + "检查内容:ebmmu工作状态、回包工作计数、SMx的状态、中断状态、统计信息、相关时序" + + #------------------------------------------------------------------------- + #>>>>>>设置EB-MMU 1 + genPkt.clean() + genPkt.setPktType(0) + + genPkt.addSubPkt(0x0, 0, 0x0018, 0xe, 2, [0x1, 0x58]) + #subPkt参数:索引、索引类型、地址、命令、长度、数据 + data = [0,] * 30 + setting_ebmmu_regs(data, 0, 0x10000000, 0x0200, 0x0a, 0x3, 0x1) + genPkt.addSubPkt(0x1, 0, 0x0200, 0x1, 10, data) + + + data = [0,] * 30 + setting_ebmmu_regs(data, 0, 0x1000000a, 0x0200, 0x0a, 0x3, 0x1) + genPkt.addSubPkt(0x2, 0, 0x0200, 0x1, 10, data) + + + data = [0,] * 30 + setting_ebmmu_regs(data, 0, 0x10000014, 0x0200, 0x0a, 0x3, 0x1) + genPkt.addSubPkt(0x3, 0, 0x0200, 0x1, 10, data) + + data = [0,] * 30 + setting_ebmmu_regs(data, 0, 0x1000001e, 0x0200, 0x0a, 0x3, 0x1) + genPkt.addSubPkt(0x4, 0, 0x0200, 0x1, 10, data) + + + genPkt.addSubPkt(0x0, 0, 0x0018, 0xe, 2, [0x0, 0x58]) + + genPkt.addBeforeExc(genTcStartFrameCode(gen_file_def, tc_des) + +genMessageCode("--清除中断") + +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff])) + + genPkt.addAfterExc(genWriteTransLenCode(gen_file_def, sm_idx) + +genWriteTransPktCode(gen_file_def, sm_idx) + +genTrgTransPktCode(gen_file_def, sm_idx) + +genReadAckPktCode(gen_file_def, sm_idx) + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + + +genMessageCode("--清除中断") + +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + ) + + genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1) + + #>>>>>>读取EB-MMU的设置 + genPkt.clean() + genPkt.setPktType(0) + + #subPkt参数:索引、索引类型、地址、命令、长度、数据 + data = [0,] * 40 + + genPkt.addSubPkt(0x01, 0, 0x0200, 0x0, 10, data) + genPkt.addSubPkt(0x02, 0, 0x0200, 0x0, 10, data) + genPkt.addSubPkt(0x03, 0, 0x0200, 0x0, 10, data) + genPkt.addSubPkt(0x04, 0, 0x0200, 0x0, 10, data) + + gen_file_def_ap = gen_file_def + "_rw1" + sm_idx = 0 + + genPkt.addAfterExc(genWriteTransLenCode(gen_file_def_ap, sm_idx) + +genWriteTransPktCode(gen_file_def_ap, sm_idx) + +genTrgTransPktCode(gen_file_def_ap, sm_idx) + +genReadAckPktCode(gen_file_def_ap, sm_idx) + + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + + +genMessageCode("--清除中断") + +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + ) + + genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1, True, gen_file_def_ap) + + #>>>>>>用EB-MMU方式读取EB-MMU设置 + genPkt.clean() + genPkt.setPktType(0) + + #subPkt参数:索引、索引类型、地址、命令、长度、数据 + data = [0,] * 40 + + genPkt.addSubPkt(0x1000, 2, 0x0000, 0x0, 40, data) + + gen_file_def_ap = gen_file_def + "_rw2" + sm_idx = 0 + + genPkt.addAfterExc(genWriteTransLenCode(gen_file_def_ap, sm_idx) + +genWriteTransPktCode(gen_file_def_ap, sm_idx) + +genTrgTransPktCode(gen_file_def_ap, sm_idx) + +genReadAckPktCode(gen_file_def_ap, sm_idx) + + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + + +genMessageCode("--清除中断") + +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + + +genTcEndFrameCode(gen_file_def) + ) + + genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1, True, gen_file_def_ap) + + return gen_file_def + + +def tc2(): + genPkt = GenPkt() + + gen_file_def = "ebmmu_tc02" + sm_idx = 0 + tc_des = "每个从站都使用ebmmu[1],共4个mmu,从0x2000_0000位置向后对齐,每个设备占16个字节,\\n" \ + + "映射0x00~0x10,中间无字节空洞。主站使用1个子包,将4个设备的数据一次性读上来。\\n"\ + + "检查内容:ebmmu工作状态、回包工作计数、SMx的状态、中断状态、统计信息、相关时序" + + #------------------------------------------------------------------------- + #>>>>>>设置EB-MMU 2 + genPkt.clean() + genPkt.setPktType(0) + genPkt.addSubPkt(0x0, 0, 0x0018, 0xe, 2, [0x1, 0x58]) + #subPkt参数:索引、索引类型、地址、命令、长度、数据 + data = [0,] * 30 + setting_ebmmu_regs(data, 0, 0x20000000, 0x0000, 0x10, 0x1, 0x1) + genPkt.addSubPkt(0x1, 0, 0x020a, 0x1, 10, data) + + + data = [0,] * 30 + setting_ebmmu_regs(data, 0, 0x20000010, 0x0000, 0x10, 0x1, 0x1) + genPkt.addSubPkt(0x2, 0, 0x020a, 0x1, 10, data) + + + data = [0,] * 30 + setting_ebmmu_regs(data, 0, 0x20000020, 0x0000, 0x10, 0x1, 0x1) + genPkt.addSubPkt(0x3, 0, 0x020a, 0x1, 10, data) + + data = [0,] * 30 + setting_ebmmu_regs(data, 0, 0x20000030, 0x0000, 0x10, 0x1, 0x1) + genPkt.addSubPkt(0x4, 0, 0x020a, 0x1, 10, data) + genPkt.addSubPkt(0x0, 0, 0x0018, 0xe, 2, [0x0, 0x58]) + + genPkt.addBeforeExc(genTcStartFrameCode(gen_file_def, tc_des) + +genMessageCode("--清除中断") + +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + ) + + genPkt.addAfterExc(genWriteTransLenCode(gen_file_def, sm_idx) + +genWriteTransPktCode(gen_file_def, sm_idx) + +genTrgTransPktCode(gen_file_def, sm_idx) + +genReadAckPktCode(gen_file_def, sm_idx) + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + + +genMessageCode("--清除中断") + +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + ) + + genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1) + + #>>>>>>读取数据 + genPkt.clean() + genPkt.setPktType(0) + + #subPkt参数:索引、索引类型、地址、命令、长度、数据 + data = [0,] * 40 + + genPkt.addSubPkt(0x01, 0, 0x0000, 0x0, 16, data) + genPkt.addSubPkt(0x02, 0, 0x0000, 0x0, 16, data) + genPkt.addSubPkt(0x03, 0, 0x0000, 0x0, 16, data) + genPkt.addSubPkt(0x04, 0, 0x0000, 0x0, 16, data) + + gen_file_def_ap = gen_file_def + "_rw1" + sm_idx = 0 + + genPkt.addAfterExc(genWriteTransLenCode(gen_file_def_ap, sm_idx) + +genWriteTransPktCode(gen_file_def_ap, sm_idx) + +genTrgTransPktCode(gen_file_def_ap, sm_idx) + +genReadAckPktCode(gen_file_def_ap, sm_idx) + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + + +genMessageCode("--清除中断") + +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + ) + + genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1, True, gen_file_def_ap) + + #>>>>>>用EB-MMU方式读取EB-MMU设置 + genPkt.clean() + genPkt.setPktType(0) + + #subPkt参数:索引、索引类型、地址、命令、长度、数据 + data = [0,] * 100 + + genPkt.addSubPkt(0x2000, 2, 0x0000, 0x0, 0x40, data) + + gen_file_def_ap = gen_file_def + "_rw2" + sm_idx = 0 + + genPkt.addAfterExc(genWriteTransLenCode(gen_file_def_ap, sm_idx) + +genWriteTransPktCode(gen_file_def_ap, sm_idx) + +genTrgTransPktCode(gen_file_def_ap, sm_idx) + +genReadAckPktCode(gen_file_def_ap, sm_idx) + + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + + +genMessageCode("--清除中断") + +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + + +genTcEndFrameCode(gen_file_def)) + + genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1,True, gen_file_def_ap) + return gen_file_def + + + +def tc3(): + genPkt = GenPkt() + + gen_file_def = "ebmmu_tc03" + sm_idx = 0 + tc_des = "每个从站都使用ebmmu[0]和ebmmu[2],共8个mmu,从0x1000_0000位置向后对齐,每个设备占22个字节,\\n" \ + + "先依次映射0x200~0x20a, 然后依次映射0x000~0x00c,中间无字节空洞。使用1个子包,将4个设备的数据一次性读上来。\\n"\ + + "注意:该测试用例读取时是从0x1000_0000开始读取的\\n"\ + + "检查内容:ebmmu工作状态、回包工作计数、SMx的状态、中断状态、统计信息、相关时序" + + #------------------------------------------------------------------------- + #>>>>>>设置EB-MMU 3 + genPkt.clean() + genPkt.setPktType(0) + genPkt.addSubPkt(0x0, 0, 0x0018, 0xe, 2, [0x1, 0x58]) + #subPkt参数:索引、索引类型、地址、命令、长度、数据 + data = [0,] * 30 + setting_ebmmu_regs(data, 0, 0x10000000, 0x0200, 0x0a, 0x3, 0x1) + genPkt.addSubPkt(0x1, 0, 0x0200, 0x1, 10, data) + + data = [0,] * 30 + setting_ebmmu_regs(data, 0, 0x1000000a, 0x0200, 0x0a, 0x3, 0x1) + genPkt.addSubPkt(0x2, 0, 0x0200, 0x1, 10, data) + + + data = [0,] * 30 + setting_ebmmu_regs(data, 0, 0x10000014, 0x0200, 0x0a, 0x3, 0x1) + genPkt.addSubPkt(0x3, 0, 0x0200, 0x1, 10, data) + + data = [0,] * 30 + setting_ebmmu_regs(data, 0, 0x1000001e, 0x0200, 0x0a, 0x3, 0x1) + genPkt.addSubPkt(0x4, 0, 0x0200, 0x1, 10, data) + + #subPkt参数:索引、索引类型、地址、命令、长度、数据 + data = [0,] * 30 + setting_ebmmu_regs(data, 0, 0x1000001e+0xa, 0x0000, 0x0c, 0x1, 0x1) + genPkt.addSubPkt(0x1, 0, 0x0214, 0x1, 10, data) + + + data = [0,] * 30 + setting_ebmmu_regs(data, 0, 0x1000001e+0xa+0xc, 0x0000, 0x0c, 0x1, 0x1) + genPkt.addSubPkt(0x2, 0, 0x0214, 0x1, 10, data) + + + data = [0,] * 30 + setting_ebmmu_regs(data, 0, 0x1000001e+0xa+0xc+0xc, 0x0000, 0x0c, 0x1, 0x1) + genPkt.addSubPkt(0x3, 0, 0x0214, 0x1, 10, data) + + data = [0,] * 30 + setting_ebmmu_regs(data, 0, 0x1000001e+0xa+0xc+0xc+0xc, 0x0000, 0x0c, 0x1, 0x1) + genPkt.addSubPkt(0x4, 0, 0x0214, 0x1, 10, data) + + genPkt.addSubPkt(0x0, 0, 0x0018, 0xe, 2, [0x0, 0x58]) + + genPkt.addBeforeExc(genTcStartFrameCode(gen_file_def, tc_des) + +genMessageCode("--清除中断") + +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + ) + + genPkt.addAfterExc(genWriteTransLenCode(gen_file_def, sm_idx) + +genWriteTransPktCode(gen_file_def, sm_idx) + +genTrgTransPktCode(gen_file_def, sm_idx) + +genReadAckPktCode(gen_file_def, sm_idx) + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + + +genMessageCode("--清除中断") + +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + ) + + genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1) + + #>>>>>>用EB-MMU方式读取EB-MMU设置 + genPkt.clean() + genPkt.setPktType(0) + + #subPkt参数:索引、索引类型、地址、命令、长度、数据 + data = [0,] * 150 + + genPkt.addSubPkt(0x1000, 2, 0x0000, 0x0, 0x0c * 4 + 0x28, data) + + gen_file_def_ap = "ebmmu_tc03_rw" + sm_idx = 0 + + genPkt.addAfterExc(genWriteTransLenCode(gen_file_def_ap, sm_idx) + +genWriteTransPktCode(gen_file_def_ap, sm_idx) + +genTrgTransPktCode(gen_file_def_ap, sm_idx) + +genReadAckPktCode(gen_file_def_ap, sm_idx) + + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + + +genMessageCode("--清除中断") + +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + + +genTcEndFrameCode(gen_file_def)) + + genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1, True, gen_file_def_ap) + return gen_file_def + + +def tc4(): + genPkt = GenPkt() + + gen_file_def = "ebmmu_tc04" + sm_idx = 0 + tc_des = "每个从站使用ebmmu[3],共4个mmu,从0x1000_0058位置向后对齐,映射设备1的SM1、设备2的SM3、\\n" \ + + "设备3的SM5、设备4的SM7,分别占用不同大小的空间。使用1个子包,将4个设备的数据一次性读上来。\\n"\ + + "检查内容:ebmmu工作状态、回包工作计数、SMx的状态、中断状态、统计信息、相关时序" + + #------------------------------------------------------------------------- + #>>>>>>设置EB-MMU 4 + genPkt.clean() + genPkt.setPktType(0) + + genPkt.addBeforeExc(genTcStartFrameCode(gen_file_def, tc_des) + +genMessageCode("--清除中断") + +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + + genSlvSMWriteData(1, 1, 0x80) + + genSlvSMWriteData(2, 3, 0x98) + + genSlvSMWriteData(3, 5, 0x81) + + genSlvSMWriteData(4, 7, 0x8c)) + + genPkt.addSubPkt(0x0, 0, 0x0018, 0xe, 2, [0x1, 0x58]) + + #subPkt参数:索引、索引类型、地址、命令、长度、数据 + data = [0,] * 30 + setting_ebmmu_regs(data, 0, 0x10000058, 0x1000, 0x80, 0x1, 0x1) + genPkt.addSubPkt(0x1, 0, 0x021e, 0x1, 10, data) + + + data = [0,] * 30 + addr = 0x58 + 0x80 + setting_ebmmu_regs(data, 0, 0x10000000+addr, 0x2000, 0x98, 0x1, 0x1) + genPkt.addSubPkt(0x2, 0, 0x021e, 0x1, 10, data) + + + data = [0,] * 30 + addr = 0x58 + 0x80 + 0x98 + setting_ebmmu_regs(data, 0, 0x10000000+addr, 0x3000, 0x81, 0x1, 0x1) + genPkt.addSubPkt(0x3, 0, 0x021e, 0x1, 10, data) + + data = [0,] * 30 + + addr = 0x58 + 0x80 + 0x98 + 0x81 + setting_ebmmu_regs(data, 0, 0x10000000+addr, 0x4000, 0x8c, 0x1, 0x1) + genPkt.addSubPkt(0x4, 0, 0x021e, 0x1, 10, data) + genPkt.addSubPkt(0x0, 0, 0x0018, 0xe, 2, [0x1, 0x58]) + + + + sm_idx = 0 + + genPkt.addAfterExc(genWriteTransLenCode(gen_file_def, sm_idx) + +genWriteTransPktCode(gen_file_def, sm_idx) + +genTrgTransPktCode(gen_file_def, sm_idx) + +genReadAckPktCode(gen_file_def, sm_idx) + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + + +genMessageCode("--清除中断") + +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + ) + + genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1) + + #>>>>>>用EB-MMU方式读取EB-MMU设置 + genPkt.clean() + genPkt.setPktType(0) + + #subPkt参数:索引、索引类型、地址、命令、长度、数据 + data = [0,] * 550 + + genPkt.addSubPkt(0x1000, 2, 0x0058, 0x0, 0x80+0x98+0x81+0x8c, data) + + gen_file_def_ap = gen_file_def + "_rw" + sm_idx = 0 + + genPkt.addAfterExc(genWriteTransLenCode(gen_file_def_ap, sm_idx) + +genWriteTransPktCode(gen_file_def_ap, sm_idx) + +genTrgTransPktCode(gen_file_def_ap, sm_idx) + +genReadAckPktCode(gen_file_def_ap, sm_idx) + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + + +genMessageCode("--清除中断") + +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + + +genTcEndFrameCode(gen_file_def) + ) + + genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1, True, gen_file_def_ap) + return gen_file_def + + + +def tc5(): + genPkt = GenPkt() + + gen_file_def = "ebmmu_tc05" + sm_idx = 0 + tc_des = "每个从站使用ebmmu[3],共4个mmu,从0x1000_0058位置向后对齐,映射设备1的SM1、设备2的SM3、\\n" \ + + "设备3的SM5、设备4的SM7,分别占用不同大小的空间。使用1个子包,将4个设备的数据一次性读上来。\\n"\ + + "由于没有写入数据,读上来的数据全部是无效数据。\\n"\ + + "检查内容:ebmmu工作状态、回包工作计数、SMx的状态、中断状态、统计信息、相关时序" + + genPkt.clean() + genPkt.setPktType(0) + + genPkt.addBeforeExc(genTcStartFrameCode(gen_file_def, tc_des) + +genMessageCode("--清除中断") + +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff])) + + genPkt.addSubPkt(0x0, 0, 0x0018, 0xe, 2, [0x1, 0x58]) + #subPkt参数:索引、索引类型、地址、命令、长度、数据 + data = [0,] * 30 + setting_ebmmu_regs(data, 0, 0x10000058, 0x1000, 0x80, 0x1, 0x1) + genPkt.addSubPkt(0x1, 0, 0x021e, 0x1, 10, data) + + + data = [0,] * 30 + addr = 0x58 + 0x80 + setting_ebmmu_regs(data, 0, 0x10000000+addr, 0x2000, 0x98, 0x1, 0x1) + genPkt.addSubPkt(0x2, 0, 0x021e, 0x1, 10, data) + + + data = [0,] * 30 + addr = 0x58 + 0x80 + 0x98 + setting_ebmmu_regs(data, 0, 0x10000000+addr, 0x3000, 0x81, 0x1, 0x1) + genPkt.addSubPkt(0x3, 0, 0x021e, 0x1, 10, data) + + data = [0,] * 30 + + addr = 0x58 + 0x80 + 0x98 + 0x81 + setting_ebmmu_regs(data, 0, 0x10000000+addr, 0x4000, 0x8c, 0x1, 0x1) + genPkt.addSubPkt(0x4, 0, 0x021e, 0x1, 10, data) + + genPkt.addSubPkt(0x0, 0, 0x0018, 0xe, 2, [0x0, 0x58]) + sm_idx = 0 + + genPkt.addAfterExc(genWriteTransLenCode(gen_file_def, sm_idx) + +genWriteTransPktCode(gen_file_def, sm_idx) + +genTrgTransPktCode(gen_file_def, sm_idx) + +genReadAckPktCode(gen_file_def, sm_idx) + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + + +genMessageCode("--清除中断") + +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + ) + + genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1) + + #------------------------------------------------------------------------- + #>>>>>>用EB-MMU方式读取EB-MMU设置 5 + genPkt.clean() + genPkt.setPktType(0) + + #subPkt参数:索引、索引类型、地址、命令、长度、数据 + data = [0,] * 550 + + genPkt.addSubPkt(0x1000, 2, 0x0058, 0x0, 0x80+0x98+0x81+0x8c, data) + + gen_file_def_ap = gen_file_def + "_rw" + sm_idx = 0 + + genPkt.addAfterExc(genWriteTransLenCode(gen_file_def_ap, sm_idx) + +genWriteTransPktCode(gen_file_def_ap, sm_idx) + +genTrgTransPktCode(gen_file_def_ap, sm_idx) + +genReadAckPktCode(gen_file_def_ap, sm_idx) + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + + +genMessageCode("--清除中断") + +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + +genTcEndFrameCode(gen_file_def)) + + genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1, True, gen_file_def_ap) + return gen_file_def + + +def tc6(): + genPkt = GenPkt() + + gen_file_def = "ebmmu_tc06" + sm_idx = 0 + tc_des = "每个从站测试1个ebmmu[4],共4个mmu,从0x1000_027d位置向后对齐,每个设备占128个字节。\\n" \ + + "主站使用1个子包,将4个设备的数据一次性读上来。\\n"\ + + "检查内容:ebmmu工作状态、回包工作计数、SMx的状态、中断状态、统计信息、相关时序" + + #-------------------------------------------------------------------------- + #>>>>>>设置EB-MMU,测试用例6 + genPkt.clean() + genPkt.setPktType(0) + + genPkt.addSubPkt(0x0, 0, 0x0018, 0xe, 2, [0x1, 0x58]) + addr_off = 0x58 + 0x80 + 0x98 + 0x81 + 0x8c + + #subPkt参数:索引、索引类型、地址、命令、长度、数据 + data = [0,] * 30 + + addr = addr_off + 0x0 + setting_ebmmu_regs(data, 0, 0x10000000+addr, 0x0800, 0x80, 0x3, 0x1) + genPkt.addSubPkt(0x1, 0, 0x0228, 0x1, 10, data) + + data = [0,] * 30 + addr = addr + 0x80 + setting_ebmmu_regs(data, 0, 0x10000000+addr, 0x0800, 0x80, 0x3, 0x1) + genPkt.addSubPkt(0x2, 0, 0x0228, 0x1, 10, data) + + + data = [0,] * 30 + addr = addr + 0x80 + setting_ebmmu_regs(data, 0, 0x10000000+addr, 0x0800, 0x80, 0x3, 0x1) + genPkt.addSubPkt(0x3, 0, 0x0228, 0x1, 10, data) + + data = [0,] * 30 + + addr = addr + 0x80 + setting_ebmmu_regs(data, 0, 0x10000000+addr, 0x0800, 0x80, 0x3, 0x1) + genPkt.addSubPkt(0x4, 0, 0x0228, 0x1, 10, data) + + data = [0,] * 2 + data[0] = 0x80 + data[1] = 0x00 + genPkt.addSubPkt(0x0, 0, 0x302, 0xe, 2, data) + genPkt.addSubPkt(0x0, 0, 0x0018, 0xe, 2, [0x0, 0x58]) + + #gen_file_def = "ebmmu_tc6_settings" + sm_idx = 0 + + genPkt.addBeforeExc(genTcStartFrameCode(gen_file_def, tc_des) + +genMessageCode("--清除中断") + +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + ) + + genPkt.addAfterExc(genWriteTransLenCode(gen_file_def, sm_idx) + +genWriteTransPktCode(gen_file_def, sm_idx) + +genTrgTransPktCode(gen_file_def, sm_idx) + +genReadAckPktCode(gen_file_def, sm_idx) + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + + +genMessageCode("--清除中断") + +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + ) + + genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1) + + #>>>>>>用EB-MMU方式读取EB-MMU设置 + genPkt.clean() + genPkt.setPktType(0) + + #subPkt参数:索引、索引类型、地址、命令、长度、数据 + data = [0,] * 0x80 * 4 + for i in range(0x80 * 4): + if i < 0x80: + data[i] = i & 0xff + elif i < 0x80+0x80: + data[i] = (i + 2 - 0x80) & 0xff + elif i < 0x80+0x80+0x80: + data[i] = (i + 3 - 0x80 - 0x80) & 0xff + else: + data[i] = (i + 5 - 0x80 - 0x80 - 0x80) & 0xff + + genPkt.addSubPkt(0x1000, 2, addr_off, 0x1, 0x80 * 4, data) + + gen_file_def_ap = "ebmmu_tc6_rw" + sm_idx = 0 + + genPkt.addAfterExc(genWriteTransLenCode(gen_file_def_ap, sm_idx) + +genWriteTransPktCode(gen_file_def_ap, sm_idx) + +genTrgTransPktCode(gen_file_def_ap, sm_idx) + +genReadAckPktCode(gen_file_def_ap, sm_idx) + +genSlvSMReadData(1, 0, 0x80) + +genSlvSMReadData(2, 0, 0x80) + +genSlvSMReadData(3, 0, 0x80) + +genSlvSMReadData(4, 0, 0x80) + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + + +genMessageCode("--清除中断") + +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + +genTcEndFrameCode(gen_file_def)) + + genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1, True, gen_file_def_ap) + return gen_file_def + + +def tc7(): + genPkt = GenPkt() + + + gen_file_def = "ebmmu_tc07" + sm_idx = 0 + tc_des = "每个从站测试1个ebmmu[4],共4个mmu,从0x2000_027d位置向后对齐,映射每个设备的SM0,\\n" \ + + "每个设备占128个字节。主站使用1个子包,将4个设备的数据一次性写入。\\n"\ + + "检查内容:ebmmu工作状态、回包工作计数、SMx的状态、中断状态、统计信息、相关时序" + + + #-------------------------------------------------------------------------- + #>>>>>>设置EB-MMU,测试用例7 + genPkt.clean() + genPkt.setPktType(0) + + genPkt.addSubPkt(0x0, 0, 0x0018, 0xe, 2, [0x1, 0x58]) + addr_off = 0x58 + 0x80 + 0x98 + 0x81 + 0x8c + + #subPkt参数:索引、索引类型、地址、命令、长度、数据 + data = [0,] * 30 + + addr = addr_off + 0x0 + #print(hex(addr)) + setting_ebmmu_regs(data, 0, 0x10000000+addr, 0x0800, 0x80, 0x3, 0x1) + genPkt.addSubPkt(0x1, 0, 0x0228, 0x1, 10, data) + + data = [0,] * 30 + addr = addr + 0x80 + #print(hex(addr)) + setting_ebmmu_regs(data, 0, 0x10000000+addr, 0x0800, 0x80, 0x3, 0x1) + genPkt.addSubPkt(0x2, 0, 0x0228, 0x1, 10, data) + + + data = [0,] * 30 + addr = addr + 0x80 + #print(hex(addr)) + setting_ebmmu_regs(data, 0, 0x10000000+addr, 0x0800, 0x80, 0x3, 0x1) + genPkt.addSubPkt(0x3, 0, 0x0228, 0x1, 10, data) + + data = [0,] * 30 + + addr = addr + 0x80 + #print(hex(addr)) + setting_ebmmu_regs(data, 0, 0x10000000+addr, 0x0800, 0x80, 0x3, 0x1) + genPkt.addSubPkt(0x4, 0, 0x0228, 0x1, 10, data) + + data = [0,] * 2 + data[0] = 0x80 + data[1] = 0x00 + genPkt.addSubPkt(0x0, 0, 0x302, 0xe, 2, data) + + #gen_file_def = "ebmmu_tc7_settings" + sm_idx = 0 + + genPkt.addSubPkt(0x0, 0, 0x0018, 0xe, 2, [0x0, 0x58]) + + genPkt.addBeforeExc(genTcStartFrameCode(gen_file_def, tc_des) + +genMessageCode("--清除中断") + +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + ) + + genPkt.addAfterExc(genWriteTransLenCode(gen_file_def, sm_idx) + +genWriteTransPktCode(gen_file_def, sm_idx) + +genTrgTransPktCode(gen_file_def, sm_idx) + +genReadAckPktCode(gen_file_def, sm_idx) + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + + +genMessageCode("--清除中断") + +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + ) + + genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1) + + #>>>>>>用EB-MMU方式读取EB-MMU设置 + genPkt.clean() + genPkt.setPktType(0) + + #subPkt参数:索引、索引类型、地址、命令、长度、数据 + data = [0,] * 0x80 * 4 + for i in range(0x80 * 4): + if i < 0x80: + data[i] = i & 0xff + elif i < 0x80+0x80: + data[i] = (i + 2 - 0x80) & 0xff + elif i < 0x80+0x80+0x80: + data[i] = (i + 3 - 0x80 - 0x80) & 0xff + else: + data[i] = (i + 5 - 0x80 - 0x80 - 0x80) & 0xff + + genPkt.addSubPkt(0x1000, 2, addr_off, 0x1, 0x80 * 4, data) + + gen_file_def_ap = "ebmmu_tc7_rw" + sm_idx = 0 + + genPkt.addAfterExc(genWriteTransLenCode(gen_file_def_ap, sm_idx) + +genWriteTransPktCode(gen_file_def_ap, sm_idx) + +genTrgTransPktCode(gen_file_def_ap, sm_idx) + +genReadAckPktCode(gen_file_def_ap, sm_idx) + +genSlvSMReadData(1, 0, 0x80) + +genSlvSMReadData(2, 0, 0x80) + +genSlvSMReadData(3, 0, 0x80) + +genSlvSMReadData(4, 0, 0x80) + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + + +genMessageCode("--清除中断") + +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + +genTcEndFrameCode(gen_file_def)) + + genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1, True, gen_file_def_ap) + return gen_file_def + + +def tc8(): + genPkt = GenPkt() + + gen_file_def = "ebmmu_tc08" + sm_idx = 0 + tc_des = "每个从站都使用ebmmu[0],从0x1000_0000位置向后对齐,每个设备都映射0x800,每个设备占128个字节。\\n" \ + + "主站使用1个子包,将4个设备的数据一次性写下去。相当于使用单播命令模拟广播命令。\\n"\ + + "ebmmu放出的权限是0x1(只读),但子包的权限要求是只写,两相冲突,子包拒绝执行。\\n"\ + + "从站也无法得到真正有效的数据。\\n"\ + + "检查内容:ebmmu工作状态、回包工作计数、SMx的状态、中断状态、统计信息、相关时序" + + #-------------------------------------------------------------------------- + #>>>>>>设置EB-MMU,测试用例8,广播写,检查权限 + genPkt.clean() + genPkt.setPktType(0) + + genPkt.addSubPkt(0x0, 0, 0x0018, 0xe, 2, [0x1, 0x58]) + addr_off = 0x0 + + #subPkt参数:索引、索引类型、地址、命令、长度、数据 + data = [0,] * 256 + + addr = addr_off + 0x0 + setting_ebmmu_regs(data, 0, 0x10000000+addr, 0x0800, 0x80, 0x1, 0x1) + genPkt.addSubPkt(0x1, 0, 0x0200, 0xe, 160, data) + + data = [0,] * 2 + data[0] = 0x80 + data[1] = 0x00 + genPkt.addSubPkt(0x0, 0, 0x302, 0xe, 2, data) + genPkt.addSubPkt(0x0, 0, 0x0018, 0xe, 2, [0x0, 0x58]) + + sm_idx = 0 + + genPkt.addBeforeExc(genTcStartFrameCode(gen_file_def, tc_des) + +genMessageCode("--清除中断") + +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + ) + + genPkt.addAfterExc(genWriteTransLenCode(gen_file_def, sm_idx) + +genWriteTransPktCode(gen_file_def, sm_idx) + +genTrgTransPktCode(gen_file_def, sm_idx) + +genReadAckPktCode(gen_file_def, sm_idx) + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + + +genMessageCode("--清除中断") + +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + ) + + genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1) + + #>>>>>>用EB-MMU方式读取EB-MMU设置, 8 + genPkt.clean() + genPkt.setPktType(0) + + #subPkt参数:索引、索引类型、地址、命令、长度、数据 + #data = [1,] * 0x80 + data = [((i * 2) & 0xff) for i in range(0x80)] + genPkt.addSubPkt(0x1000, 2, addr_off, 0x1, 0x80, data) + + gen_file_def_ap = "ebmmu_tc8_rw" + sm_idx = 0 + + genPkt.addAfterExc(genWriteTransLenCode(gen_file_def_ap, sm_idx) + +genWriteTransPktCode(gen_file_def_ap, sm_idx) + +genTrgTransPktCode(gen_file_def_ap, sm_idx) + +genReadAckPktCode(gen_file_def_ap, sm_idx) + +genIFRwDataCode(1, 0x300, False, 0x20) + +genIFRwDataCode(2, 0x300, False, 0x20) + +genIFRwDataCode(3, 0x300, False, 0x20) + +genIFRwDataCode(4, 0x300, False, 0x20) + +genSlvSMReadData(1, 0, 0x80) + +genSlvSMReadData(2, 0, 0x80) + +genSlvSMReadData(3, 0, 0x80) + +genSlvSMReadData(4, 0, 0x80) + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + + +genMessageCode("--清除中断") + +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + +genTcEndFrameCode(gen_file_def)) + + genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1, True, gen_file_def_ap) + return gen_file_def + + + +def tc9(): + genPkt = GenPkt() + + gen_file_def = "ebmmu_tc09" + sm_idx = 0 + tc_des = "每个从站都使用ebmmu[0],共4个mmu,从0x1000_0000位置向后对齐,全部映射SM0,每个设备占256个字节。\\n" \ + + "主站使用1个子包,将4个设备的数据写下去,报文长度超过1KB,相当于使用单播变广播。\\n"\ + + "检查内容:ebmmu工作状态、回包工作计数、SMx的状态、中断状态、统计信息、相关时序" + + #-------------------------------------------------------------------------- + #>>>>>>设置EB-MMU,测试用例9,广播写,检查权限 + genPkt.clean() + genPkt.setPktType(0) + + genPkt.addSubPkt(0x0, 0, 0x0018, 0xe, 2, [0x1, 0x58]) + addr_off = 0x0 + + #subPkt参数:索引、索引类型、地址、命令、长度、数据 + data = [0,] * 256 + + addr = addr_off + 0x0 + setting_ebmmu_regs(data, 0, 0x10000000+addr, 0x0800, 0x0100, 0x2, 0x1) + genPkt.addSubPkt(0x1, 0, 0x0200, 0xe, 160, data) + + data = [0,] * 2 + data[0] = 0x00 + data[1] = 0x01 + genPkt.addSubPkt(0x0, 0, 0x302, 0xe, 2, data) + genPkt.addSubPkt(0x0, 0, 0x0018, 0xe, 2, [0x0, 0x58]) + + sm_idx = 0 + + genPkt.addBeforeExc(genTcStartFrameCode(gen_file_def, tc_des) + +genMessageCode("--清除中断") + +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + ) + + genPkt.addAfterExc(genWriteTransLenCode(gen_file_def, sm_idx) + +genWriteTransPktCode(gen_file_def, sm_idx) + +genTrgTransPktCode(gen_file_def, sm_idx) + +genReadAckPktCode(gen_file_def, sm_idx) + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + + +genMessageCode("--清除中断") + +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + ) + + genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1) + + #>>>>>>用EB-MMU方式读取EB-MMU设置, 9 + genPkt.clean() + genPkt.setPktType(0) + + #subPkt参数:索引、索引类型、地址、命令、长度、数据 + #data = [0xa5,] * 0x100 + #data[-1] = 0x5a + data = [((i + 5) & 0xff) for i in range(0x100)] + genPkt.addSubPkt(0x1000, 2, addr_off, 0x1, 0x100, data) + + gen_file_def_ap = "ebmmu_tc9_rw" + sm_idx = 0 + + genPkt.addAfterExc(genWriteTransLenCode(gen_file_def_ap, sm_idx) + +genWriteTransPktCode(gen_file_def_ap, sm_idx) + +genTrgTransPktCode(gen_file_def_ap, sm_idx) + +genReadAckPktCode(gen_file_def_ap, sm_idx) + +genIFRwDataCode(1, 0x300, False, 0x20) + +genIFRwDataCode(2, 0x300, False, 0x20) + +genIFRwDataCode(3, 0x300, False, 0x20) + +genIFRwDataCode(4, 0x300, False, 0x20) + +genSlvSMReadData(1, 0, 0x100) + +genSlvSMReadData(2, 0, 0x100) + +genSlvSMReadData(3, 0, 0x100) + +genSlvSMReadData(4, 0, 0x100) + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + + +genMessageCode("--清除中断") + +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + +genTcEndFrameCode(gen_file_def) + ) + + genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1, True, gen_file_def_ap) + return gen_file_def + + + +def tc10(): + genPkt = GenPkt() + + gen_file_def = "ebmmu_tc10" + sm_idx = 0 + tc_des = "每个从站都使用ebmmu[0],共4个mmu,从0x1000_0000位置向后对齐,映射SM0,每个设备占256个字节。\\n" \ + + "使用1包数据,将4个设备的数据一次性写下去;连续写2次。检查SM0的状态是否包含2包数据。\\n"\ + + "检查内容:ebmmu工作状态、回包工作计数、SMx的状态、中断状态、统计信息、相关时序" + + #-------------------------------------------------------------------------- + #>>>>>>设置EB-MMU,测试用例10,广播写,检查权限 + genPkt.clean() + genPkt.setPktType(0) + + addr_off = 0x0 + genPkt.addSubPkt(0x0, 0, 0x0018, 0xe, 2, [0x1, 0x58]) + #subPkt参数:索引、索引类型、地址、命令、长度、数据 + data = [0,] * 256 + + addr = addr_off + 0x0 + setting_ebmmu_regs(data, 0, 0x10000000+addr, 0x0800, 0x0100, 0x2, 0x1) + genPkt.addSubPkt(0x1, 0, 0x0200, 0xe, 160, data) + + data = [0,] * 2 + data[0] = 0x00 + data[1] = 0x01 + genPkt.addSubPkt(0x0, 0, 0x302, 0xe, 2, data) + genPkt.addSubPkt(0x0, 0, 0x0018, 0xe, 2, [0x0, 0x58]) + + sm_idx = 0 + + genPkt.addBeforeExc(genTcStartFrameCode(gen_file_def, tc_des) + +genMessageCode("--清除中断") + +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + ) + + genPkt.addAfterExc(genWriteTransLenCode(gen_file_def, sm_idx) + +genWriteTransPktCode(gen_file_def, sm_idx) + +genTrgTransPktCode(gen_file_def, sm_idx) + +genReadAckPktCode(gen_file_def, sm_idx) + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + + +genMessageCode("--清除中断") + +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + ) + + genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1) + + #>>>>>>用EB-MMU方式读取EB-MMU设置, 10,两次写入em-mmu + genPkt.clean() + genPkt.setPktType(0) + + #subPkt参数:索引、索引类型、地址、命令、长度、数据 + #data = [0xc3,] * 0x100 + #data[-1] = 0x3c + data = [((i + 0x80) & 0xff) for i in range(0x100)] + genPkt.addSubPkt(0x1000, 2, addr_off, 0x1, 0x100, data) + + gen_file_def_ap = "ebmmu_tc10_rw01" + sm_idx = 0 + + genPkt.addAfterExc(genWriteTransLenCode(gen_file_def_ap, sm_idx) + +genWriteTransPktCode(gen_file_def_ap, sm_idx) + +genTrgTransPktCode(gen_file_def_ap, sm_idx) + +genReadAckPktCode(gen_file_def_ap, sm_idx) + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + + +genMessageCode("--清除中断") + +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + ) + + genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1, True, gen_file_def_ap) + + genPkt.clean() + genPkt.setPktType(0) + + #subPkt参数:索引、索引类型、地址、命令、长度、数据 + #data = [0x81,] * 0x100 + #data[-1] = 0x18 + data = [((i + 0x40) & 0xff) for i in range(0x100)] + genPkt.addSubPkt(0x1000, 2, addr_off, 0x1, 0x100, data) + + gen_file_def_ap = "ebmmu_tc10_rw02" + sm_idx = 0 + + genPkt.addAfterExc(genWriteTransLenCode(gen_file_def_ap, sm_idx) + +genWriteTransPktCode(gen_file_def_ap, sm_idx) + +genTrgTransPktCode(gen_file_def_ap, sm_idx) + +genReadAckPktCode(gen_file_def_ap, sm_idx) + +genIFRwDataCode(1, 0x300, False, 0x20) + +genIFRwDataCode(2, 0x300, False, 0x20) + +genIFRwDataCode(3, 0x300, False, 0x20) + +genIFRwDataCode(4, 0x300, False, 0x20) + +genSlvSMReadData(1, 0, 0x100) + +genIFRwDataCode(1, 0x300, False, 0x20) + +genSlvSMReadData(1, 0, 0x100) + +genSlvSMReadData(2, 0, 0x100) + +genIFRwDataCode(2, 0x300, False, 0x20) + +genSlvSMReadData(2, 0, 0x100) + +genSlvSMReadData(3, 0, 0x100) + +genIFRwDataCode(3, 0x300, False, 0x20) + +genSlvSMReadData(3, 0, 0x100) + +genSlvSMReadData(4, 0, 0x100) + +genIFRwDataCode(4, 0x300, False, 0x20) + +genSlvSMReadData(4, 0, 0x100) + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + + +genMessageCode("--清除中断") + +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + +genTcEndFrameCode(gen_file_def)) + + genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1, True, gen_file_def_ap) + return gen_file_def + + + +def tc11(): + genPkt = GenPkt() + + gen_file_def = "ebmmu_tc11" + sm_idx = 0 + tc_des = "每个从站都使用ebmmu[0],共4个mmu,从0x1000_0000位置向后对齐,依次映射每个设备的SM1,占256个字节。\\n" \ + + "每个设备准备了2个元素的数据,使用1个子包,将4个设备的数据一次性读上来,数据超过1KB。\\n"\ + + "检查内容:ebmmu工作状态、回包工作计数、SMx的状态、中断状态、统计信息、相关时序" + + #-------------------------------------------------------------------------- + #>>>>>>设置EB-MMU,测试用例11,读,检查权限 + genPkt.clean() + genPkt.setPktType(0) + addr = 0x10000000 + addr_off = 0x0 + + genPkt.addSubPkt(0x0, 0, 0x0018, 0xe, 2, [0x1, 0x58]) + #subPkt参数:索引、索引类型、地址、命令、长度、数据 + data = [0,] * 256 + + taddr = addr + addr_off + setting_ebmmu_regs(data, 0, taddr, 0x1000, 0x100, 0x1, 0x1) + + genPkt.addSubPkt(0x1, 0, 0x0200, 0x1, 160, data) + + #subPkt参数:索引、索引类型、地址、命令、长度、数据 + addr_off = addr_off + 0x100 + data = [0,] * 256 + + taddr = addr + addr_off + #print(hex(taddr), hex(addr_off)) + setting_ebmmu_regs(data, 0, taddr, 0x1000, 0x100, 0x1, 0x1) + genPkt.addSubPkt(0x2, 0, 0x0200, 0x1, 160, data) + + + #subPkt参数:索引、索引类型、地址、命令、长度、数据 + addr_off = addr_off + 0x100 + data = [0,] * 256 + + taddr = addr + addr_off + #print(hex(taddr), hex(addr_off)) + setting_ebmmu_regs(data, 0, taddr, 0x1000, 0x100, 0x1, 0x1) + + genPkt.addSubPkt(0x3, 0, 0x0200, 0x1, 160, data) + + + #subPkt参数:索引、索引类型、地址、命令、长度、数据 + addr_off = addr_off + 0x100 + data = [0,] * 256 + + taddr = addr + addr_off + #print(hex(taddr), hex(addr_off)) + setting_ebmmu_regs(data, 0, taddr, 0x1000, 0x100, 0x1, 0x1) + genPkt.addSubPkt(0x4, 0, 0x0200, 0x1, 160, data) + + data = [0,] * 2 + data[0] = 0x00 + data[1] = 0x01 + genPkt.addSubPkt(0x0, 0, 0x306, 0xe, 2, data) + genPkt.addSubPkt(0x0, 0, 0x0018, 0xe, 2, [0x0, 0x58]) + + sm_idx = 0 + + genPkt.addBeforeExc(genTcStartFrameCode(gen_file_def, tc_des) + +genMessageCode("--清除中断") + +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + ) + + genPkt.addAfterExc(genWriteTransLenCode(gen_file_def, sm_idx) + +genWriteTransPktCode(gen_file_def, sm_idx) + +genTrgTransPktCode(gen_file_def, sm_idx) + +genReadAckPktCode(gen_file_def, sm_idx) + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + + +genMessageCode("--清除中断") + +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + ) + + genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1) + + #>>>>>>用EB-MMU方式读取EB-MMU设置, 11,两次读出eb-mmu + genPkt.clean() + genPkt.setPktType(0) + + data0 = list(range(0x100)) + data1 = list(range(0xff, -1, -1)) + + + genPkt.addBeforeExc( genIFRwDataCode(1, 0x1000, True, 0x100, data0) + + genIFRwDataCode(2, 0x1000, True, 0x100, data1) + + genIFRwDataCode(3, 0x1000, True, 0x100, data0) + + genIFRwDataCode(4, 0x1000, True, 0x100, data1) + + genIFRwDataCode(1, 0x300, False, 0x20) + + genIFRwDataCode(2, 0x300, False, 0x20) + + genIFRwDataCode(3, 0x300, False, 0x20) + + genIFRwDataCode(4, 0x300, False, 0x20) + + genIFRwDataCode(1, 0x1000, True, 0x100, data1) + + genIFRwDataCode(2, 0x1000, True, 0x100, data0) + + genIFRwDataCode(3, 0x1000, True, 0x100, data1) + + genIFRwDataCode(4, 0x1000, True, 0x100, data0) + + genIFRwDataCode(1, 0x300, False, 0x20) + + genIFRwDataCode(2, 0x300, False, 0x20) + + genIFRwDataCode(3, 0x300, False, 0x20) + + genIFRwDataCode(4, 0x300, False, 0x20) + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + + +genMessageCode("--清除中断") + +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + ) + + #subPkt参数:索引、索引类型、地址、命令、长度、数据 + data = [0, ] * 0x100 * 4 + + gen_file_def_ap = "ebmmu_tc11_rw01" + sm_idx = 0 + + genPkt.addSubPkt(0x1000, 2, 0, 0x0, 0x100 * 4, data) + + genPkt.addAfterExc(genWriteTransLenCode(gen_file_def_ap, sm_idx) + +genWriteTransPktCode(gen_file_def_ap, sm_idx) + +genTrgTransPktCode(gen_file_def_ap, sm_idx) + +genReadAckPktCode(gen_file_def_ap, sm_idx) + +genIFRwDataCode(1, 0x300, False, 0x20) + +genIFRwDataCode(2, 0x300, False, 0x20) + +genIFRwDataCode(3, 0x300, False, 0x20) + +genIFRwDataCode(4, 0x300, False, 0x20) + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + + +genMessageCode("--清除中断") + +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + ) + + genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1, True, gen_file_def_ap) + + genPkt.clean() + genPkt.setPktType(0) + + #subPkt参数:索引、索引类型、地址、命令、长度、数据 + data = [0x0,] * 0x100 * 4 + + gen_file_def_ap = "ebmmu_tc11_rw02" + sm_idx = 0 + + genPkt.addSubPkt(0x1000, 2, 0, 0x0, 0x100 * 4, data) + + genPkt.addAfterExc(genWriteTransLenCode(gen_file_def_ap, sm_idx) + +genWriteTransPktCode(gen_file_def_ap, sm_idx) + +genTrgTransPktCode(gen_file_def_ap, sm_idx) + +genReadAckPktCode(gen_file_def_ap, sm_idx) + +genIFRwDataCode(1, 0x300, False, 0x20) + +genIFRwDataCode(2, 0x300, False, 0x20) + +genIFRwDataCode(3, 0x300, False, 0x20) + +genIFRwDataCode(4, 0x300, False, 0x20) + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + + +genMessageCode("--清除中断") + +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + +genTcEndFrameCode(gen_file_def) + ) + + genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1, True, gen_file_def_ap) + return gen_file_def + + +def tc12(): + genPkt = GenPkt() + + gen_file_def = "ebmmu_tc12" + sm_idx = 0 + tc_des = "每个从站使用ebmmu[0、1、2、3],从0x1000_0000位置向后对齐,分个MMU映射SM1、SM3、SM5、SM7,\\n" \ + + "每个SM占8个字节。设备侧准备好数据,使用1个子包,将4个设备的数据一次性读上来。\\n"\ + + "检查内容:ebmmu工作状态、回包工作计数、SMx的状态、中断状态、统计信息、相关时序" + + + #-------------------------------------------------------------------------- + #>>>>>>设置EB-MMU,测试用例12,读,检查权限 + genPkt.clean() + genPkt.setPktType(0) + + addr = 0x10000000 + addr_off = 0x0 + sm_size = 0x8 + + genPkt.addSubPkt(0x0, 0, 0x0018, 0xe, 2, [0x1, 0x58]) + #subPkt参数:索引、索引类型、地址、命令、长度、数据 + data = [0,] * 256 + + taddr = addr + addr_off + #print(hex(taddr), hex(addr_off)) + setting_ebmmu_regs(data, 0, taddr, 0x1000, sm_size, 0x1, 0x1) + + addr_off = addr_off + sm_size + taddr = addr + addr_off + #print(hex(taddr), hex(addr_off)) + setting_ebmmu_regs(data, 1, taddr, 0x2000, sm_size, 0x1, 0x1) + + addr_off = addr_off + sm_size + taddr = addr + addr_off + #print(hex(taddr), hex(addr_off)) + setting_ebmmu_regs(data, 2, taddr, 0x3000, sm_size, 0x1, 0x1) + + addr_off = addr_off + sm_size + taddr = addr + addr_off + #print(hex(taddr), hex(addr_off)) + setting_ebmmu_regs(data, 3, taddr, 0x4000, sm_size, 0x1, 0x1) + + genPkt.addSubPkt(0x1, 0, 0x0200, 0x1, 160, data) + + #subPkt参数:索引、索引类型、地址、命令、长度、数据 + data = [0,] * 256 + + addr_off = addr_off + sm_size + taddr = addr + addr_off + #print(hex(taddr), hex(addr_off)) + setting_ebmmu_regs(data, 0, taddr, 0x1000, sm_size, 0x1, 0x1) + + addr_off = addr_off + sm_size + taddr = addr + addr_off + #print(hex(taddr), hex(addr_off)) + setting_ebmmu_regs(data, 1, taddr, 0x2000, sm_size, 0x1, 0x1) + + addr_off = addr_off + sm_size + taddr = addr + addr_off + #print(hex(taddr), hex(addr_off)) + setting_ebmmu_regs(data, 2, taddr, 0x3000, sm_size, 0x1, 0x1) + + addr_off = addr_off + sm_size + taddr = addr + addr_off + #print(hex(taddr), hex(addr_off)) + setting_ebmmu_regs(data, 3, taddr, 0x4000, sm_size, 0x1, 0x1) + + genPkt.addSubPkt(0x2, 0, 0x0200, 0x1, 160, data) + + + #subPkt参数:索引、索引类型、地址、命令、长度、数据 + data = [0,] * 256 + + addr_off = addr_off + sm_size + taddr = addr + addr_off + #print(hex(taddr), hex(addr_off)) + setting_ebmmu_regs(data, 0, taddr, 0x1000, sm_size, 0x1, 0x1) + + addr_off = addr_off + sm_size + taddr = addr + addr_off + #print(hex(taddr), hex(addr_off)) + setting_ebmmu_regs(data, 1, taddr, 0x2000, sm_size, 0x1, 0x1) + + addr_off = addr_off + sm_size + taddr = addr + addr_off + #print(hex(taddr), hex(addr_off)) + setting_ebmmu_regs(data, 2, taddr, 0x3000, sm_size, 0x1, 0x1) + + addr_off = addr_off + sm_size + taddr = addr + addr_off + #print(hex(taddr), hex(addr_off)) + setting_ebmmu_regs(data, 3, taddr, 0x4000, sm_size, 0x1, 0x1) + + genPkt.addSubPkt(0x3, 0, 0x0200, 0x1, 160, data) + + + #subPkt参数:索引、索引类型、地址、命令、长度、数据 + data = [0,] * 256 + + addr_off = addr_off + sm_size + taddr = addr + addr_off + #print(hex(taddr), hex(addr_off)) + setting_ebmmu_regs(data, 0, taddr, 0x1000, sm_size, 0x1, 0x1) + + addr_off = addr_off + sm_size + taddr = addr + addr_off + #print(hex(taddr), hex(addr_off)) + setting_ebmmu_regs(data, 1, taddr, 0x2000, sm_size, 0x1, 0x1) + + addr_off = addr_off + sm_size + taddr = addr + addr_off + #print(hex(taddr), hex(addr_off)) + setting_ebmmu_regs(data, 2, taddr, 0x3000, sm_size, 0x1, 0x1) + + addr_off = addr_off + sm_size + taddr = addr + addr_off + #print(hex(taddr), hex(addr_off)) + setting_ebmmu_regs(data, 3, taddr, 0x4000, sm_size, 0x1, 0x1) + + genPkt.addSubPkt(0x4, 0, 0x0200, 0x1, 160, data) + + genPkt.addSubPkt(0x0, 0, 0x0018, 0xe, 2, [0x0, 0x58]) + + data = [0,] * 2 + data[0] = (sm_size >> 0) & 0xff + data[1] = (sm_size >> 8) & 0xff + genPkt.addSubPkt(0x0, 0, 0x306, 0xe, 2, data) + + data = [0,] * 2 + data[0] = (sm_size >> 0) & 0xff + data[1] = (sm_size >> 8) & 0xff + genPkt.addSubPkt(0x0, 0, 0x30e, 0xe, 2, data) + + data = [0,] * 2 + data[0] = (sm_size >> 0) & 0xff + data[1] = (sm_size >> 8) & 0xff + genPkt.addSubPkt(0x0, 0, 0x316, 0xe, 2, data) + + + data = [0,] * 2 + data[0] = (sm_size >> 0) & 0xff + data[1] = (sm_size >> 8) & 0xff + genPkt.addSubPkt(0x0, 0, 0x31e, 0xe, 2, data) + + sm_idx = 0 + + genPkt.addBeforeExc(genTcStartFrameCode(gen_file_def, tc_des) + +genMessageCode("--清除中断") + +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + ) + + genPkt.addAfterExc(genWriteTransLenCode(gen_file_def, sm_idx) + +genWriteTransPktCode(gen_file_def, sm_idx) + +genTrgTransPktCode(gen_file_def, sm_idx) + +genReadAckPktCode(gen_file_def, sm_idx) + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + + +genMessageCode("--清除中断") + +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + ) + + genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1) + + #>>>>>>用EB-MMU方式读取EB-MMU设置, 12 + genPkt.clean() + genPkt.setPktType(0) + + data0 = list(range(0, sm_size)) + data1 = list(range(1, sm_size + 1)) + data2 = list(range(2, sm_size + 2)) + data3 = list(range(3, sm_size + 3)) + data4 = list(range(4, sm_size + 4)) + data5 = list(range(5, sm_size + 5)) + data6 = list(range(6, sm_size + 6)) + data7 = list(range(7, sm_size + 7)) + + + genPkt.addBeforeExc( genIFRwDataCode(1, 0x1000, True, sm_size, data0) + + genIFRwDataCode(1, 0x2000, True, sm_size, data1) + + genIFRwDataCode(1, 0x3000, True, sm_size, data2) + + genIFRwDataCode(1, 0x4000, True, sm_size, data3) + + + genIFRwDataCode(2, 0x1000, True, sm_size, data4) + + genIFRwDataCode(2, 0x2000, True, sm_size, data5) + + genIFRwDataCode(2, 0x3000, True, sm_size, data6) + + genIFRwDataCode(2, 0x4000, True, sm_size, data7) + + + genIFRwDataCode(3, 0x1000, True, sm_size, data7) + + genIFRwDataCode(3, 0x2000, True, sm_size, data6) + + genIFRwDataCode(3, 0x3000, True, sm_size, data5) + + genIFRwDataCode(3, 0x4000, True, sm_size, data4) + + + genIFRwDataCode(4, 0x1000, True, sm_size, data3) + + genIFRwDataCode(4, 0x2000, True, sm_size, data2) + + genIFRwDataCode(4, 0x3000, True, sm_size, data1) + + genIFRwDataCode(4, 0x4000, True, sm_size, data0) + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + + +genMessageCode("--清除中断") + +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + ) + + #subPkt参数:索引、索引类型、地址、命令、长度、数据 + data = [0, ] * sm_size * 16 + + gen_file_def_ap = "ebmmu_tc12_rw" + sm_idx = 0 + + genPkt.addSubPkt(0x1000, 2, 0, 0x0, sm_size * 16, data) + + genPkt.addAfterExc(genWriteTransLenCode(gen_file_def_ap, sm_idx) + +genWriteTransPktCode(gen_file_def_ap, sm_idx) + +genTrgTransPktCode(gen_file_def_ap, sm_idx) + +genReadAckPktCode(gen_file_def_ap, sm_idx) + +genIFRwDataCode(1, 0x300, False, 0x20) + +genIFRwDataCode(2, 0x300, False, 0x20) + +genIFRwDataCode(3, 0x300, False, 0x20) + +genIFRwDataCode(4, 0x300, False, 0x20) + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + + +genMessageCode("--清除中断") + +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + +genTcEndFrameCode(gen_file_def) + ) + + genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1, True, gen_file_def_ap) + return gen_file_def + + + +def tc13(): + genPkt = GenPkt() + + gen_file_def = "ebmmu_tc13" + sm_idx = 0 + tc_des = "每个从站测使用前8个ebmmu,从0x1000_0000位置向后对齐,每两个ebmmu映射一个SM,每个设备占8个字节。\\n" \ + + "中间无字节空洞。如ebmmu[0]、ebmmu[1]分别映射SM1的前4个字节和后4个字节。使用1子包,将4个设备的数据一次性读上来。\\n"\ + + "检查内容:ebmmu工作状态、回包工作计数、SMx的状态、中断状态、统计信息、相关时序" + + #-------------------------------------------------------------------------- + #>>>>>>设置EB-MMU,测试用例13,读,检查权限 + genPkt.clean() + genPkt.setPktType(0) + + addr = 0x10000000 + addr_off = 0x0 + sm_size = 0x8 + + genPkt.addSubPkt(0x0, 0, 0x0018, 0xe, 2, [0x1, 0x58]) + #subPkt参数:索引、索引类型、地址、命令、长度、数据 + data = [0,] * 256 + + taddr = addr + addr_off + setting_ebmmu_regs(data, 0, taddr, 0x1000, sm_size / 2, 0x1, 0x1) + setting_ebmmu_regs(data, 1, taddr + sm_size / 2, 0x1000 + sm_size / 2, sm_size / 2, 0x1, 0x1) + + addr_off = addr_off + sm_size + taddr = addr + addr_off + setting_ebmmu_regs(data, 2, taddr, 0x2000, sm_size / 2, 0x1, 0x1) + setting_ebmmu_regs(data, 3, taddr + sm_size / 2, 0x2000 + sm_size / 2, sm_size / 2, 0x1, 0x1) + + addr_off = addr_off + sm_size + taddr = addr + addr_off + setting_ebmmu_regs(data, 4, taddr, 0x3000, sm_size / 2, 0x1, 0x1) + setting_ebmmu_regs(data, 5, taddr + sm_size / 2, 0x3000 + sm_size / 2, sm_size / 2, 0x1, 0x1) + + addr_off = addr_off + sm_size + taddr = addr + addr_off + #print(hex(taddr), hex(addr_off)) + setting_ebmmu_regs(data, 6, taddr, 0x4000, sm_size / 2, 0x1, 0x1) + setting_ebmmu_regs(data, 7, taddr + sm_size / 2, 0x4000 + sm_size / 2, sm_size / 2, 0x1, 0x1) + + genPkt.addSubPkt(0x1, 0, 0x0200, 0x1, 160, data) + + #subPkt参数:索引、索引类型、地址、命令、长度、数据 + data = [0,] * 256 + + addr_off = addr_off + sm_size + taddr = addr + addr_off + setting_ebmmu_regs(data, 0, taddr, 0x1000, sm_size / 2, 0x1, 0x1) + setting_ebmmu_regs(data, 1, taddr + sm_size / 2, 0x1000 + sm_size / 2, sm_size / 2, 0x1, 0x1) + + addr_off = addr_off + sm_size + taddr = addr + addr_off + setting_ebmmu_regs(data, 2, taddr, 0x2000, sm_size / 2, 0x1, 0x1) + setting_ebmmu_regs(data, 3, taddr + sm_size / 2, 0x2000 + sm_size / 2, sm_size / 2, 0x1, 0x1) + + addr_off = addr_off + sm_size + taddr = addr + addr_off + setting_ebmmu_regs(data, 4, taddr, 0x3000, sm_size / 2, 0x1, 0x1) + setting_ebmmu_regs(data, 5, taddr + sm_size / 2, 0x3000 + sm_size / 2, sm_size / 2, 0x1, 0x1) + + addr_off = addr_off + sm_size + taddr = addr + addr_off + #print(hex(taddr), hex(addr_off)) + setting_ebmmu_regs(data, 6, taddr, 0x4000, sm_size / 2, 0x1, 0x1) + setting_ebmmu_regs(data, 7, taddr + sm_size / 2, 0x4000 + sm_size / 2, sm_size / 2, 0x1, 0x1) + + genPkt.addSubPkt(0x2, 0, 0x0200, 0x1, 160, data) + + + #subPkt参数:索引、索引类型、地址、命令、长度、数据 + data = [0,] * 256 + + addr_off = addr_off + sm_size + taddr = addr + addr_off + setting_ebmmu_regs(data, 0, taddr, 0x1000, sm_size / 2, 0x1, 0x1) + setting_ebmmu_regs(data, 1, taddr + sm_size / 2, 0x1000 + sm_size / 2, sm_size / 2, 0x1, 0x1) + + addr_off = addr_off + sm_size + taddr = addr + addr_off + setting_ebmmu_regs(data, 2, taddr, 0x2000, sm_size / 2, 0x1, 0x1) + setting_ebmmu_regs(data, 3, taddr + sm_size / 2, 0x2000 + sm_size / 2, sm_size / 2, 0x1, 0x1) + + addr_off = addr_off + sm_size + taddr = addr + addr_off + setting_ebmmu_regs(data, 4, taddr, 0x3000, sm_size / 2, 0x1, 0x1) + setting_ebmmu_regs(data, 5, taddr + sm_size / 2, 0x3000 + sm_size / 2, sm_size / 2, 0x1, 0x1) + + addr_off = addr_off + sm_size + taddr = addr + addr_off + #print(hex(taddr), hex(addr_off)) + setting_ebmmu_regs(data, 6, taddr, 0x4000, sm_size / 2, 0x1, 0x1) + setting_ebmmu_regs(data, 7, taddr + sm_size / 2, 0x4000 + sm_size / 2, sm_size / 2, 0x1, 0x1) + + genPkt.addSubPkt(0x3, 0, 0x0200, 0x1, 160, data) + + + #subPkt参数:索引、索引类型、地址、命令、长度、数据 + data = [0,] * 256 + + addr_off = addr_off + sm_size + taddr = addr + addr_off + setting_ebmmu_regs(data, 0, taddr, 0x1000, sm_size / 2, 0x1, 0x1) + setting_ebmmu_regs(data, 1, taddr + sm_size / 2, 0x1000 + sm_size / 2, sm_size / 2, 0x1, 0x1) + + addr_off = addr_off + sm_size + taddr = addr + addr_off + setting_ebmmu_regs(data, 2, taddr, 0x2000, sm_size / 2, 0x1, 0x1) + setting_ebmmu_regs(data, 3, taddr + sm_size / 2, 0x2000 + sm_size / 2, sm_size / 2, 0x1, 0x1) + + addr_off = addr_off + sm_size + taddr = addr + addr_off + setting_ebmmu_regs(data, 4, taddr, 0x3000, sm_size / 2, 0x1, 0x1) + setting_ebmmu_regs(data, 5, taddr + sm_size / 2, 0x3000 + sm_size / 2, sm_size / 2, 0x1, 0x1) + + addr_off = addr_off + sm_size + taddr = addr + addr_off + #print(hex(taddr), hex(addr_off)) + setting_ebmmu_regs(data, 6, taddr, 0x4000, sm_size / 2, 0x1, 0x1) + setting_ebmmu_regs(data, 7, taddr + sm_size / 2, 0x4000 + sm_size / 2, sm_size / 2, 0x1, 0x1) + + + genPkt.addSubPkt(0x4, 0, 0x0200, 0x1, 160, data) + + genPkt.addSubPkt(0x0, 0, 0x0018, 0xe, 2, [0x0, 0x58]) + + + data = [0,] * 2 + data[0] = (sm_size >> 0) & 0xff + data[1] = (sm_size >> 8) & 0xff + genPkt.addSubPkt(0x0, 0, 0x306, 0xe, 2, data) + + data = [0,] * 2 + data[0] = (sm_size >> 0) & 0xff + data[1] = (sm_size >> 8) & 0xff + genPkt.addSubPkt(0x0, 0, 0x30e, 0xe, 2, data) + + data = [0,] * 2 + data[0] = (sm_size >> 0) & 0xff + data[1] = (sm_size >> 8) & 0xff + genPkt.addSubPkt(0x0, 0, 0x316, 0xe, 2, data) + + + data = [0,] * 2 + data[0] = (sm_size >> 0) & 0xff + data[1] = (sm_size >> 8) & 0xff + genPkt.addSubPkt(0x0, 0, 0x31e, 0xe, 2, data) + + sm_idx = 0 + genPkt.addBeforeExc(genTcStartFrameCode(gen_file_def, tc_des) + +genMessageCode("--清除中断") + +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + ) + + genPkt.addAfterExc(genWriteTransLenCode(gen_file_def, sm_idx) + +genWriteTransPktCode(gen_file_def, sm_idx) + +genTrgTransPktCode(gen_file_def, sm_idx) + +genReadAckPktCode(gen_file_def, sm_idx) + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + + +genMessageCode("--清除中断") + +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + ) + + genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1) + + #>>>>>>用EB-MMU方式读取EB-MMU设置, 12 + genPkt.clean() + genPkt.setPktType(0) + + data0 = list(range(0, sm_size)) + data1 = list(range(1, sm_size + 1)) + data2 = list(range(2, sm_size + 2)) + data3 = list(range(3, sm_size + 3)) + data4 = list(range(4, sm_size + 4)) + data5 = list(range(5, sm_size + 5)) + data6 = list(range(6, sm_size + 6)) + data7 = list(range(7, sm_size + 7)) + + + genPkt.addBeforeExc( genIFRwDataCode(1, 0x1000, True, sm_size, data0) + + genIFRwDataCode(1, 0x2000, True, sm_size, data1) + + genIFRwDataCode(1, 0x3000, True, sm_size, data2) + + genIFRwDataCode(1, 0x4000, True, sm_size, data3) + + + genIFRwDataCode(2, 0x1000, True, sm_size, data4) + + genIFRwDataCode(2, 0x2000, True, sm_size, data5) + + genIFRwDataCode(2, 0x3000, True, sm_size, data6) + + genIFRwDataCode(2, 0x4000, True, sm_size, data7) + + + genIFRwDataCode(3, 0x1000, True, sm_size, data7) + + genIFRwDataCode(3, 0x2000, True, sm_size, data6) + + genIFRwDataCode(3, 0x3000, True, sm_size, data5) + + genIFRwDataCode(3, 0x4000, True, sm_size, data4) + + + genIFRwDataCode(4, 0x1000, True, sm_size, data3) + + genIFRwDataCode(4, 0x2000, True, sm_size, data2) + + genIFRwDataCode(4, 0x3000, True, sm_size, data1) + + genIFRwDataCode(4, 0x4000, True, sm_size, data0) + ) + + #subPkt参数:索引、索引类型、地址、命令、长度、数据 + data = [0, ] * sm_size * 16 + + gen_file_def_ap = "ebmmu_tc13_rw" + sm_idx = 0 + + genPkt.addSubPkt(0x1000, 2, 0, 0x0, sm_size * 16, data) + + genPkt.addAfterExc(genWriteTransLenCode(gen_file_def_ap, sm_idx) + +genWriteTransPktCode(gen_file_def_ap, sm_idx) + +genTrgTransPktCode(gen_file_def_ap, sm_idx) + +genReadAckPktCode(gen_file_def_ap, sm_idx) + +genIFRwDataCode(1, 0x300, False, 0x20) + +genIFRwDataCode(2, 0x300, False, 0x20) + +genIFRwDataCode(3, 0x300, False, 0x20) + +genIFRwDataCode(4, 0x300, False, 0x20) + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + + +genMessageCode("--清除中断") + +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + +genTcEndFrameCode(gen_file_def) + ) + + genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1, True, gen_file_def_ap) + return gen_file_def + + +def tc14(): + genPkt = GenPkt() + + + gen_file_def = "ebmmu_tc14" + sm_idx = 0 + tc_des = "每个从站使用4个ebmmu,从0x1000_0000位置向后对齐,分别映射SM0/2/4/6,每个设备占8个字节。\\n" \ + + "中间无字节空洞,使用1个子包,将4个设备的数据一次性写下去。\\n"\ + + "检查内容:ebmmu工作状态、回包工作计数、SMx的状态、中断状态、统计信息、相关时序" + + + #-------------------------------------------------------------------------- + #>>>>>>设置EB-MMU,测试用例14,读,检查权限 + genPkt.clean() + genPkt.setPktType(0) + + addr = 0x10000000 + addr_off = 0x0 + sm_size = 0x8 + + genPkt.addSubPkt(0x0, 0, 0x0018, 0xe, 2, [0x1, 0x58]) + #subPkt参数:索引、索引类型、地址、命令、长度、数据 + data = [0,] * 256 + + taddr = addr + addr_off + setting_ebmmu_regs(data, 0, taddr, 0x0800, sm_size, 0x2, 0x1) + + addr_off = addr_off + sm_size + taddr = addr + addr_off + setting_ebmmu_regs(data, 1, taddr, 0x1800, sm_size, 0x2, 0x1) + + addr_off = addr_off + sm_size + taddr = addr + addr_off + setting_ebmmu_regs(data, 2, taddr, 0x2800, sm_size, 0x2, 0x1) + + addr_off = addr_off + sm_size + taddr = addr + addr_off + setting_ebmmu_regs(data, 3, taddr, 0x3800, sm_size, 0x2, 0x1) + + genPkt.addSubPkt(0x1, 0, 0x0200, 0x1, 160, data) + + #subPkt参数:索引、索引类型、地址、命令、长度、数据 + data = [0,] * 256 + + addr_off = addr_off + sm_size + taddr = addr + addr_off + setting_ebmmu_regs(data, 0, taddr, 0x0800, sm_size, 0x2, 0x1) + + addr_off = addr_off + sm_size + taddr = addr + addr_off + setting_ebmmu_regs(data, 1, taddr, 0x1800, sm_size, 0x2, 0x1) + + addr_off = addr_off + sm_size + taddr = addr + addr_off + setting_ebmmu_regs(data, 2, taddr, 0x2800, sm_size, 0x2, 0x1) + + addr_off = addr_off + sm_size + taddr = addr + addr_off + setting_ebmmu_regs(data, 3, taddr, 0x3800, sm_size, 0x2, 0x1) + + genPkt.addSubPkt(0x2, 0, 0x0200, 0x1, 160, data) + + + #subPkt参数:索引、索引类型、地址、命令、长度、数据 + data = [0,] * 256 + + addr_off = addr_off + sm_size + taddr = addr + addr_off + setting_ebmmu_regs(data, 0, taddr, 0x0800, sm_size, 0x2, 0x1) + + addr_off = addr_off + sm_size + taddr = addr + addr_off + setting_ebmmu_regs(data, 1, taddr, 0x1800, sm_size, 0x2, 0x1) + + addr_off = addr_off + sm_size + taddr = addr + addr_off + setting_ebmmu_regs(data, 2, taddr, 0x2800, sm_size, 0x2, 0x1) + + addr_off = addr_off + sm_size + taddr = addr + addr_off + setting_ebmmu_regs(data, 3, taddr, 0x3800, sm_size, 0x2, 0x1) + + genPkt.addSubPkt(0x3, 0, 0x0200, 0x1, 160, data) + + + #subPkt参数:索引、索引类型、地址、命令、长度、数据 + data = [0,] * 256 + + addr_off = addr_off + sm_size + taddr = addr + addr_off + setting_ebmmu_regs(data, 0, taddr, 0x0800, sm_size, 0x2, 0x1) + + addr_off = addr_off + sm_size + taddr = addr + addr_off + setting_ebmmu_regs(data, 1, taddr, 0x1800, sm_size, 0x2, 0x1) + + addr_off = addr_off + sm_size + taddr = addr + addr_off + setting_ebmmu_regs(data, 2, taddr, 0x2800, sm_size, 0x2, 0x1) + + addr_off = addr_off + sm_size + taddr = addr + addr_off + setting_ebmmu_regs(data, 3, taddr, 0x3800, sm_size, 0x2, 0x1) + + + genPkt.addSubPkt(0x4, 0, 0x0200, 0x1, 160, data) + + genPkt.addSubPkt(0x0, 0, 0x0018, 0xe, 2, [0x0, 0x58]) + + data = [0,] * 2 + data[0] = (sm_size >> 0) & 0xff + data[1] = (sm_size >> 8) & 0xff + genPkt.addSubPkt(0x0, 0, 0x302, 0xe, 2, data) + + data = [0,] * 2 + data[0] = (sm_size >> 0) & 0xff + data[1] = (sm_size >> 8) & 0xff + genPkt.addSubPkt(0x0, 0, 0x30a, 0xe, 2, data) + + data = [0,] * 2 + data[0] = (sm_size >> 0) & 0xff + data[1] = (sm_size >> 8) & 0xff + genPkt.addSubPkt(0x0, 0, 0x312, 0xe, 2, data) + + + data = [0,] * 2 + data[0] = (sm_size >> 0) & 0xff + data[1] = (sm_size >> 8) & 0xff + genPkt.addSubPkt(0x0, 0, 0x31a, 0xe, 2, data) + + sm_idx = 0 + + genPkt.addBeforeExc(genTcStartFrameCode(gen_file_def, tc_des) + +genMessageCode("--清除中断") + +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + ) + + genPkt.addAfterExc(genWriteTransLenCode(gen_file_def, sm_idx) + +genWriteTransPktCode(gen_file_def, sm_idx) + +genTrgTransPktCode(gen_file_def, sm_idx) + +genReadAckPktCode(gen_file_def, sm_idx) + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + + +genMessageCode("--清除中断") + +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + ) + + genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1) + + #>>>>>>用EB-MMU方式读取EB-MMU设置, 14 + genPkt.clean() + genPkt.setPktType(0) + + #subPkt参数:索引、索引类型、地址、命令、长度、数据 + data = [(i & 0xff) for i in range(sm_size * 16)] + + gen_file_def_ap = "ebmmu_tc14_rw" + sm_idx = 0 + + genPkt.addSubPkt(0x1000, 2, 0, 0x1, sm_size * 16, data) + + genPkt.addAfterExc(genWriteTransLenCode(gen_file_def_ap, sm_idx) + +genWriteTransPktCode(gen_file_def_ap, sm_idx) + +genTrgTransPktCode(gen_file_def_ap, sm_idx) + +genReadAckPktCode(gen_file_def_ap, sm_idx) + +genIFRwDataCode(1, 0x300, False, 0x20) + +genIFRwDataCode(2, 0x300, False, 0x20) + +genIFRwDataCode(3, 0x300, False, 0x20) + +genIFRwDataCode(4, 0x300, False, 0x20) + +genSlvSMReadData(1, 0, sm_size) + +genSlvSMReadData(1, 2, sm_size) + +genSlvSMReadData(1, 4, sm_size) + +genSlvSMReadData(1, 6, sm_size) + +genSlvSMReadData(2, 0, sm_size) + +genSlvSMReadData(2, 2, sm_size) + +genSlvSMReadData(2, 4, sm_size) + +genSlvSMReadData(2, 6, sm_size) + +genSlvSMReadData(3, 0, sm_size) + +genSlvSMReadData(3, 2, sm_size) + +genSlvSMReadData(3, 4, sm_size) + +genSlvSMReadData(3, 6, sm_size) + +genSlvSMReadData(4, 0, sm_size) + +genSlvSMReadData(4, 2, sm_size) + +genSlvSMReadData(4, 4, sm_size) + +genSlvSMReadData(4, 6, sm_size) + +genIFRwDataCode(1, 0x300, False, 0x20) + +genIFRwDataCode(2, 0x300, False, 0x20) + +genIFRwDataCode(3, 0x300, False, 0x20) + +genIFRwDataCode(4, 0x300, False, 0x20) + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + + +genMessageCode("--清除中断") + +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + +genTcEndFrameCode(gen_file_def) + ) + + genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1, True, gen_file_def_ap) + return gen_file_def + + +def tc15(): + genPkt = GenPkt() + + gen_file_def = "ebmmu_tc15" + sm_idx = 0 + tc_des = "测试16个ebmmu全配置下运行,每4个ebmmu对应一个SM,映射4个字节。分别映射SM0/2/4/6, \\n" \ + + "每个映射了16个字节。中间无字节空洞。使用1个子包,将数据写下去。每个ebmmu必须对齐、足长的写入,\\n" \ + + "对应的sm才能正常工作。QSPI/SPI侧能正常的读到相关的数据。" + + #-------------------------------------------------------------------------- + #>>>>>>设置EB-MMU,测试用例15,读,检查权限 + genPkt.clean() + genPkt.setPktType(0) + + addr = 0x10000000 + addr_off = 0x0 + sm_size = 16 + + genPkt.addSubPkt(0x0, 0, 0x0018, 0xe, 2, [0x1, 0x58]) + #subPkt参数:索引、索引类型、地址、命令、长度、数据 + data = [0,] * 256 + + taddr = addr + addr_off + ebmmu_offset = 0 + for i in range(4): + setting_ebmmu_regs(data, + ebmmu_offset, + taddr + i * int(sm_size / 4), + 0x0800 + i * int(sm_size / 4), + sm_size / 4, + 0x2, + 0x1 + ) + #print(ebmmu_offset, hex(taddr + i * int(sm_size / 4)), hex(0x0800 + i * int(sm_size / 4))) + ebmmu_offset = ebmmu_offset + 1 + + addr_off = addr_off + sm_size + taddr = addr + addr_off + for i in range(4): + setting_ebmmu_regs(data, + ebmmu_offset, + taddr + i * int(sm_size / 4), + 0x1800 + i * int(sm_size / 4), + sm_size / 4, + 0x2, + 0x1 + ) + #print(ebmmu_offset, hex(taddr + i * int(sm_size / 4)), hex(0x0800 + i * int(sm_size / 4))) + ebmmu_offset = ebmmu_offset + 1 + + addr_off = addr_off + sm_size + taddr = addr + addr_off + for i in range(4): + setting_ebmmu_regs(data, + ebmmu_offset, + taddr + i * int(sm_size / 4), + 0x2800 + i * int(sm_size / 4), + sm_size / 4, + 0x2, + 0x1 + ) + #print(ebmmu_offset, hex(taddr + i * int(sm_size / 4)), hex(0x0800 + i * int(sm_size / 4))) + ebmmu_offset = ebmmu_offset + 1 + + addr_off = addr_off + sm_size + taddr = addr + addr_off + for i in range(4): + setting_ebmmu_regs(data, + ebmmu_offset, + taddr + i * int(sm_size / 4), + 0x3800 + i * int(sm_size / 4), + sm_size / 4, + 0x2, + 0x1 + ) + #print(ebmmu_offset, hex(taddr + i * int(sm_size / 4)), hex(0x0800 + i * int(sm_size / 4))) + ebmmu_offset = ebmmu_offset + 1 + + genPkt.addSubPkt(0x1, 0, 0x0200, 0x1, 160, data) + + #subPkt参数:索引、索引类型、地址、命令、长度、数据 + data = [0,] * 256 + + addr_off = addr_off + sm_size + taddr = addr + addr_off + ebmmu_offset = 0 + for i in range(4): + setting_ebmmu_regs(data, + ebmmu_offset, + taddr + i * int(sm_size / 4), + 0x0800 + i * int(sm_size / 4), + sm_size / 4, + 0x2, + 0x1 + ) + #print(ebmmu_offset, hex(taddr + i * int(sm_size / 4)), hex(0x0800 + i * int(sm_size / 4))) + ebmmu_offset = ebmmu_offset + 1 + + addr_off = addr_off + sm_size + taddr = addr + addr_off + for i in range(4): + setting_ebmmu_regs(data, + ebmmu_offset, + taddr + i * int(sm_size / 4), + 0x1800 + i * int(sm_size / 4), + sm_size / 4, + 0x2, + 0x1 + ) + #print(ebmmu_offset, hex(taddr + i * int(sm_size / 4)), hex(0x0800 + i * int(sm_size / 4))) + ebmmu_offset = ebmmu_offset + 1 + + addr_off = addr_off + sm_size + taddr = addr + addr_off + for i in range(4): + setting_ebmmu_regs(data, + ebmmu_offset, + taddr + i * int(sm_size / 4), + 0x2800 + i * int(sm_size / 4), + sm_size / 4, + 0x2, + 0x1 + ) + #print(ebmmu_offset, hex(taddr + i * int(sm_size / 4)), hex(0x0800 + i * int(sm_size / 4))) + ebmmu_offset = ebmmu_offset + 1 + + addr_off = addr_off + sm_size + taddr = addr + addr_off + for i in range(4): + setting_ebmmu_regs(data, + ebmmu_offset, + taddr + i * int(sm_size / 4), + 0x3800 + i * int(sm_size / 4), + sm_size / 4, + 0x2, + 0x1 + ) + #print(ebmmu_offset, hex(taddr + i * int(sm_size / 4)), hex(0x0800 + i * int(sm_size / 4))) + ebmmu_offset = ebmmu_offset + 1 + + genPkt.addSubPkt(0x2, 0, 0x0200, 0x1, 160, data) + + + #subPkt参数:索引、索引类型、地址、命令、长度、数据 + data = [0,] * 256 + + addr_off = addr_off + sm_size + taddr = addr + addr_off + ebmmu_offset = 0 + for i in range(4): + setting_ebmmu_regs(data, + ebmmu_offset, + taddr + i * int(sm_size / 4), + 0x0800 + i * int(sm_size / 4), + sm_size / 4, + 0x2, + 0x1 + ) + #print(ebmmu_offset, hex(taddr + i * int(sm_size / 4)), hex(0x0800 + i * int(sm_size / 4))) + ebmmu_offset = ebmmu_offset + 1 + + addr_off = addr_off + sm_size + taddr = addr + addr_off + for i in range(4): + setting_ebmmu_regs(data, + ebmmu_offset, + taddr + i * int(sm_size / 4), + 0x1800 + i * int(sm_size / 4), + sm_size / 4, + 0x2, + 0x1 + ) + #print(ebmmu_offset, hex(taddr + i * int(sm_size / 4)), hex(0x0800 + i * int(sm_size / 4))) + ebmmu_offset = ebmmu_offset + 1 + + addr_off = addr_off + sm_size + taddr = addr + addr_off + for i in range(4): + setting_ebmmu_regs(data, + ebmmu_offset, + taddr + i * int(sm_size / 4), + 0x2800 + i * int(sm_size / 4), + sm_size / 4, + 0x2, + 0x1 + ) + #print(ebmmu_offset, hex(taddr + i * int(sm_size / 4)), hex(0x0800 + i * int(sm_size / 4))) + ebmmu_offset = ebmmu_offset + 1 + + addr_off = addr_off + sm_size + taddr = addr + addr_off + for i in range(4): + setting_ebmmu_regs(data, + ebmmu_offset, + taddr + i * int(sm_size / 4), + 0x3800 + i * int(sm_size / 4), + sm_size / 4, + 0x2, + 0x1 + ) + #print(ebmmu_offset, hex(taddr + i * int(sm_size / 4)), hex(0x0800 + i * int(sm_size / 4))) + ebmmu_offset = ebmmu_offset + 1 + + genPkt.addSubPkt(0x3, 0, 0x0200, 0x1, 160, data) + + + #subPkt参数:索引、索引类型、地址、命令、长度、数据 + data = [0,] * 256 + + addr_off = addr_off + sm_size + taddr = addr + addr_off + ebmmu_offset = 0 + for i in range(4): + setting_ebmmu_regs(data, + ebmmu_offset, + taddr + i * int(sm_size / 4), + 0x0800 + i * int(sm_size / 4), + sm_size / 4, + 0x2, + 0x1 + ) + #print(ebmmu_offset, hex(taddr + i * int(sm_size / 4)), hex(0x0800 + i * int(sm_size / 4))) + ebmmu_offset = ebmmu_offset + 1 + + addr_off = addr_off + sm_size + taddr = addr + addr_off + for i in range(4): + setting_ebmmu_regs(data, + ebmmu_offset, + taddr + i * int(sm_size / 4), + 0x1800 + i * int(sm_size / 4), + sm_size / 4, + 0x2, + 0x1 + ) + #print(ebmmu_offset, hex(taddr + i * int(sm_size / 4)), hex(0x0800 + i * int(sm_size / 4))) + ebmmu_offset = ebmmu_offset + 1 + + addr_off = addr_off + sm_size + taddr = addr + addr_off + for i in range(4): + setting_ebmmu_regs(data, + ebmmu_offset, + taddr + i * int(sm_size / 4), + 0x2800 + i * int(sm_size / 4), + sm_size / 4, + 0x2, + 0x1 + ) + #print(ebmmu_offset, hex(taddr + i * int(sm_size / 4)), hex(0x0800 + i * int(sm_size / 4))) + ebmmu_offset = ebmmu_offset + 1 + + addr_off = addr_off + sm_size + taddr = addr + addr_off + for i in range(4): + setting_ebmmu_regs(data, + ebmmu_offset, + taddr + i * int(sm_size / 4), + 0x3800 + i * int(sm_size / 4), + sm_size / 4, + 0x2, + 0x1 + ) + #print(ebmmu_offset, hex(taddr + i * int(sm_size / 4)), hex(0x0800 + i * int(sm_size / 4))) + ebmmu_offset = ebmmu_offset + 1 + + + genPkt.addSubPkt(0x4, 0, 0x0200, 0x1, 160, data) + genPkt.addSubPkt(0x0, 0, 0x0018, 0xe, 2, [0x0, 0x58]) + + data = [0,] * 2 + data[0] = (sm_size >> 0) & 0xff + data[1] = (sm_size >> 8) & 0xff + genPkt.addSubPkt(0x0, 0, 0x302, 0xe, 2, data) + + data = [0,] * 2 + data[0] = (sm_size >> 0) & 0xff + data[1] = (sm_size >> 8) & 0xff + genPkt.addSubPkt(0x0, 0, 0x30a, 0xe, 2, data) + + data = [0,] * 2 + data[0] = (sm_size >> 0) & 0xff + data[1] = (sm_size >> 8) & 0xff + genPkt.addSubPkt(0x0, 0, 0x312, 0xe, 2, data) + + + data = [0,] * 2 + data[0] = (sm_size >> 0) & 0xff + data[1] = (sm_size >> 8) & 0xff + genPkt.addSubPkt(0x0, 0, 0x31a, 0xe, 2, data) + + genPkt.addBeforeExc(genTcStartFrameCode(gen_file_def, tc_des) + +genMessageCode("--清除中断") + +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + ) + + genPkt.addAfterExc(genWriteTransLenCode(gen_file_def, sm_idx) + +genWriteTransPktCode(gen_file_def, sm_idx) + +genTrgTransPktCode(gen_file_def, sm_idx) + +genReadAckPktCode(gen_file_def, sm_idx) + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + + +genMessageCode("--清除中断") + +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + ) + + genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1) + + #>>>>>>用EB-MMU方式读取EB-MMU设置, 15 + genPkt.clean() + genPkt.setPktType(0) + + #subPkt参数:索引、索引类型、地址、命令、长度、数据 + data = [(i & 0xff) for i in range(sm_size * 16)] + + gen_file_def_ap = "ebmmu_tc15_rw" + sm_idx = 0 + + genPkt.addSubPkt(0x1000, 2, 0, 0x1, sm_size * 16, data) + + genPkt.addAfterExc(genWriteTransLenCode(gen_file_def_ap, sm_idx) + +genWriteTransPktCode(gen_file_def_ap, sm_idx) + +genTrgTransPktCode(gen_file_def_ap, sm_idx) + +genReadAckPktCode(gen_file_def_ap, sm_idx) + +genIFRwDataCode(1, 0x300, False, 0x20) + +genIFRwDataCode(2, 0x300, False, 0x20) + +genIFRwDataCode(3, 0x300, False, 0x20) + +genIFRwDataCode(4, 0x300, False, 0x20) + +genSlvSMReadData(1, 0, sm_size) + +genSlvSMReadData(1, 2, sm_size) + +genSlvSMReadData(1, 4, sm_size) + +genSlvSMReadData(1, 6, sm_size) + +genSlvSMReadData(2, 0, sm_size) + +genSlvSMReadData(2, 2, sm_size) + +genSlvSMReadData(2, 4, sm_size) + +genSlvSMReadData(2, 6, sm_size) + +genSlvSMReadData(3, 0, sm_size) + +genSlvSMReadData(3, 2, sm_size) + +genSlvSMReadData(3, 4, sm_size) + +genSlvSMReadData(3, 6, sm_size) + +genSlvSMReadData(4, 0, sm_size) + +genSlvSMReadData(4, 2, sm_size) + +genSlvSMReadData(4, 4, sm_size) + +genSlvSMReadData(4, 6, sm_size) + +genIFRwDataCode(1, 0x300, False, 0x20) + +genIFRwDataCode(2, 0x300, False, 0x20) + +genIFRwDataCode(3, 0x300, False, 0x20) + +genIFRwDataCode(4, 0x300, False, 0x20) + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + + +genMessageCode("--清除中断") + +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + + +genTcEndFrameCode(gen_file_def) + ) + + genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1, True, gen_file_def_ap) + return gen_file_def + + +def tc16(): + genPkt = GenPkt() + + gen_file_def = "ebmmu_tc16" + sm_idx = 0 + tc_des = "测试16个ebmmu全配置下运行,每4个ebmmu对应一个sm,映射4个字节。映射了sm0/2/4/6,共16个字节。\\n" \ + + "每个ebmmu必须对齐、足长的写入,对应的sm才能正常工作。两次写入数据,复位设备1的SM1,SM1状态复原,\\n"\ + + "第二次设备1的SM0不能读取到有效的数据。测试用例能成功运行完毕,除设备1的SM0,其余的SMx都能获得正确的数据。\\n" \ + + "检查内容:ebmmu工作状态、回包工作计数、SMx的状态、中断状态、统计信息、相关时序" + + genPkt.clean() + genPkt.setPktType(0) + + addr = 0x10000000 + addr_off = 0x0 + sm_size = 16 + + genPkt.addSubPkt(0x0, 0, 0x0018, 0xe, 2, [0x1, 0x58]) + #subPkt参数:索引、索引类型、地址、命令、长度、数据 + data = [0,] * 256 + + taddr = addr + addr_off + ebmmu_offset = 0 + for i in range(4): + setting_ebmmu_regs(data, + ebmmu_offset, + taddr + i * int(sm_size / 4), + 0x0800 + i * int(sm_size / 4), + sm_size / 4, + 0x2, + 0x1 + ) + #print(ebmmu_offset, hex(taddr + i * int(sm_size / 4)), hex(0x0800 + i * int(sm_size / 4))) + ebmmu_offset = ebmmu_offset + 1 + + addr_off = addr_off + sm_size + taddr = addr + addr_off + for i in range(4): + setting_ebmmu_regs(data, + ebmmu_offset, + taddr + i * int(sm_size / 4), + 0x1800 + i * int(sm_size / 4), + sm_size / 4, + 0x2, + 0x1 + ) + #print(ebmmu_offset, hex(taddr + i * int(sm_size / 4)), hex(0x1800 + i * int(sm_size / 4))) + ebmmu_offset = ebmmu_offset + 1 + + + addr_off = addr_off + sm_size + taddr = addr + addr_off + for i in range(4): + setting_ebmmu_regs(data, + ebmmu_offset, + taddr + i * int(sm_size / 4), + 0x2800 + i * int(sm_size / 4), + sm_size / 4, + 0x2, + 0x1 + ) + #print(ebmmu_offset + i, hex(taddr + i * int(sm_size / 4)), hex(0x2800 + i * int(sm_size / 4))) + ebmmu_offset = ebmmu_offset + 1 + + + addr_off = addr_off + sm_size + taddr = addr + addr_off + for i in range(4): + setting_ebmmu_regs(data, + ebmmu_offset, + taddr + i * int(sm_size / 4), + 0x3800 + i * int(sm_size / 4), + sm_size / 4, + 0x2, + 0x1 + ) + #print(ebmmu_offset, hex(taddr + i * int(sm_size / 4)), hex(0x3800 + i * int(sm_size / 4))) + ebmmu_offset = ebmmu_offset + 1 + + genPkt.addSubPkt(0x1, 0, 0x0200, 0x1, 160, data) + + #subPkt参数:索引、索引类型、地址、命令、长度、数据 + data = [0,] * 256 + + addr_off = addr_off + sm_size + taddr = addr + addr_off + ebmmu_offset = 0 + for i in range(4): + setting_ebmmu_regs(data, + ebmmu_offset, + taddr + i * int(sm_size / 4), + 0x0800 + i * int(sm_size / 4), + sm_size / 4, + 0x2, + 0x1 + ) + #print(ebmmu_offset, hex(taddr + i * int(sm_size / 4)), hex(0x0800 + i * int(sm_size / 4))) + ebmmu_offset = ebmmu_offset + 1 + + addr_off = addr_off + sm_size + taddr = addr + addr_off + for i in range(4): + setting_ebmmu_regs(data, + ebmmu_offset, + taddr + i * int(sm_size / 4), + 0x1800 + i * int(sm_size / 4), + sm_size / 4, + 0x2, + 0x1 + ) + #print(ebmmu_offset, hex(taddr + i * int(sm_size / 4)), hex(0x1800 + i * int(sm_size / 4))) + ebmmu_offset = ebmmu_offset + 1 + + + addr_off = addr_off + sm_size + taddr = addr + addr_off + for i in range(4): + setting_ebmmu_regs(data, + ebmmu_offset, + taddr + i * int(sm_size / 4), + 0x2800 + i * int(sm_size / 4), + sm_size / 4, + 0x2, + 0x1 + ) + #print(ebmmu_offset + i, hex(taddr + i * int(sm_size / 4)), hex(0x2800 + i * int(sm_size / 4))) + ebmmu_offset = ebmmu_offset + 1 + + + addr_off = addr_off + sm_size + taddr = addr + addr_off + for i in range(4): + setting_ebmmu_regs(data, + ebmmu_offset, + taddr + i * int(sm_size / 4), + 0x3800 + i * int(sm_size / 4), + sm_size / 4, + 0x2, + 0x1 + ) + #print(ebmmu_offset, hex(taddr + i * int(sm_size / 4)), hex(0x3800 + i * int(sm_size / 4))) + ebmmu_offset = ebmmu_offset + 1 + + genPkt.addSubPkt(0x2, 0, 0x0200, 0x1, 160, data) + + + #subPkt参数:索引、索引类型、地址、命令、长度、数据 + data = [0,] * 256 + + addr_off = addr_off + sm_size + taddr = addr + addr_off + ebmmu_offset = 0 + for i in range(4): + setting_ebmmu_regs(data, + ebmmu_offset, + taddr + i * int(sm_size / 4), + 0x0800 + i * int(sm_size / 4), + sm_size / 4, + 0x2, + 0x1 + ) + #print(ebmmu_offset, hex(taddr + i * int(sm_size / 4)), hex(0x0800 + i * int(sm_size / 4))) + ebmmu_offset = ebmmu_offset + 1 + + addr_off = addr_off + sm_size + taddr = addr + addr_off + for i in range(4): + setting_ebmmu_regs(data, + ebmmu_offset, + taddr + i * int(sm_size / 4), + 0x1800 + i * int(sm_size / 4), + sm_size / 4, + 0x2, + 0x1 + ) + #print(ebmmu_offset, hex(taddr + i * int(sm_size / 4)), hex(0x1800 + i * int(sm_size / 4))) + ebmmu_offset = ebmmu_offset + 1 + + + addr_off = addr_off + sm_size + taddr = addr + addr_off + for i in range(4): + setting_ebmmu_regs(data, + ebmmu_offset, + taddr + i * int(sm_size / 4), + 0x2800 + i * int(sm_size / 4), + sm_size / 4, + 0x2, + 0x1 + ) + #print(ebmmu_offset + i, hex(taddr + i * int(sm_size / 4)), hex(0x2800 + i * int(sm_size / 4))) + ebmmu_offset = ebmmu_offset + 1 + + + addr_off = addr_off + sm_size + taddr = addr + addr_off + for i in range(4): + setting_ebmmu_regs(data, + ebmmu_offset, + taddr + i * int(sm_size / 4), + 0x3800 + i * int(sm_size / 4), + sm_size / 4, + 0x2, + 0x1 + ) + #print(ebmmu_offset, hex(taddr + i * int(sm_size / 4)), hex(0x3800 + i * int(sm_size / 4))) + ebmmu_offset = ebmmu_offset + 1 + + genPkt.addSubPkt(0x3, 0, 0x0200, 0x1, 160, data) + + + #subPkt参数:索引、索引类型、地址、命令、长度、数据 + data = [0,] * 256 + + addr_off = addr_off + sm_size + taddr = addr + addr_off + ebmmu_offset = 0 + for i in range(4): + setting_ebmmu_regs(data, + ebmmu_offset, + taddr + i * int(sm_size / 4), + 0x0800 + i * int(sm_size / 4), + sm_size / 4, + 0x2, + 0x1 + ) + #print(ebmmu_offset, hex(taddr + i * int(sm_size / 4)), hex(0x0800 + i * int(sm_size / 4))) + ebmmu_offset = ebmmu_offset + 1 + + addr_off = addr_off + sm_size + taddr = addr + addr_off + for i in range(4): + setting_ebmmu_regs(data, + ebmmu_offset, + taddr + i * int(sm_size / 4), + 0x1800 + i * int(sm_size / 4), + sm_size / 4, + 0x2, + 0x1 + ) + #print(ebmmu_offset, hex(taddr + i * int(sm_size / 4)), hex(0x1800 + i * int(sm_size / 4))) + ebmmu_offset = ebmmu_offset + 1 + + + addr_off = addr_off + sm_size + taddr = addr + addr_off + for i in range(4): + setting_ebmmu_regs(data, + ebmmu_offset, + taddr + i * int(sm_size / 4), + 0x2800 + i * int(sm_size / 4), + sm_size / 4, + 0x2, + 0x1 + ) + #print(ebmmu_offset + i, hex(taddr + i * int(sm_size / 4)), hex(0x2800 + i * int(sm_size / 4))) + ebmmu_offset = ebmmu_offset + 1 + + + addr_off = addr_off + sm_size + taddr = addr + addr_off + for i in range(4): + setting_ebmmu_regs(data, + ebmmu_offset, + taddr + i * int(sm_size / 4), + 0x3800 + i * int(sm_size / 4), + sm_size / 4, + 0x2, + 0x1 + ) + #print(ebmmu_offset, hex(taddr + i * int(sm_size / 4)), hex(0x3800 + i * int(sm_size / 4))) + ebmmu_offset = ebmmu_offset + 1 + + + genPkt.addSubPkt(0x4, 0, 0x0200, 0x1, 160, data) + + genPkt.addSubPkt(0x0, 0, 0x0018, 0xe, 2, [0x0, 0x58]) + + data = [0,] * 2 + data[0] = (sm_size >> 0) & 0xff + data[1] = (sm_size >> 8) & 0xff + genPkt.addSubPkt(0x0, 0, 0x302, 0xe, 2, data) + + data = [0,] * 2 + data[0] = (sm_size >> 0) & 0xff + data[1] = (sm_size >> 8) & 0xff + genPkt.addSubPkt(0x0, 0, 0x30a, 0xe, 2, data) + + data = [0,] * 2 + data[0] = (sm_size >> 0) & 0xff + data[1] = (sm_size >> 8) & 0xff + genPkt.addSubPkt(0x0, 0, 0x312, 0xe, 2, data) + + + data = [0,] * 2 + data[0] = (sm_size >> 0) & 0xff + data[1] = (sm_size >> 8) & 0xff + genPkt.addSubPkt(0x0, 0, 0x31a, 0xe, 2, data) + + + genPkt.addBeforeExc(genTcStartFrameCode(gen_file_def, tc_des) + +genMessageCode("--清除中断") + +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + ) + + genPkt.addAfterExc( genWriteTransLenCode(gen_file_def, sm_idx) + +genWriteTransPktCode(gen_file_def, sm_idx) + +genTrgTransPktCode(gen_file_def, sm_idx) + +genReadAckPktCode(gen_file_def, sm_idx) + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + + +genMessageCode("--清除中断") + +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + ) + + genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1) + + #>>>>>>用EB-MMU方式读取EB-MMU设置, 15 + genPkt.clean() + genPkt.setPktType(0) + + #subPkt参数:索引、索引类型、地址、命令、长度、数据 + data = [(i & 0xff) for i in range(sm_size * 16)] + + gen_file_def_ap = "ebmmu_tc16_rw" + sm_idx = 0 + + genPkt.addSubPkt(0x1000, 2, 0, 0x1, sm_size * 16, data) + + data = [((i * 2)& 0xff) for i in range(sm_size * 16)] + genPkt.addSubPkt(0x1000, 2, 0, 0x1, sm_size * 16, data) + + rst_data=[0x0, ] + + genPkt.addAfterExc(genWriteTransLenCode(gen_file_def_ap, sm_idx) + +genWriteTransPktCode(gen_file_def_ap, sm_idx) + +genTrgTransPktCode(gen_file_def_ap, sm_idx) + +genReadAckPktCode(gen_file_def_ap, sm_idx) + +genIFRwDataCode(1, 0x300, False, 0x20) + +genIFRwDataCode(2, 0x300, False, 0x20) + +genIFRwDataCode(3, 0x300, False, 0x20) + +genIFRwDataCode(4, 0x300, False, 0x20) + +genSlvSMReadData(1, 0, sm_size) + +genSlvSMReadData(1, 2, sm_size) + +genSlvSMReadData(1, 4, sm_size) + +genSlvSMReadData(1, 6, sm_size) + +genSlvSMReadData(2, 0, sm_size) + +genSlvSMReadData(2, 2, sm_size) + +genSlvSMReadData(2, 4, sm_size) + +genSlvSMReadData(2, 6, sm_size) + +genSlvSMReadData(3, 0, sm_size) + +genSlvSMReadData(3, 2, sm_size) + +genSlvSMReadData(3, 4, sm_size) + +genSlvSMReadData(3, 6, sm_size) + +genSlvSMReadData(4, 0, sm_size) + +genSlvSMReadData(4, 2, sm_size) + +genSlvSMReadData(4, 4, sm_size) + +genSlvSMReadData(4, 6, sm_size) + +genIFRwDataCode(1, 0x300, False, 0x20) + +genIFRwDataCode(1, 0x300, True, 1, rst_data) + +genIFRwDataCode(1, 0x300, False, 0x20) + +genIFRwDataCode(2, 0x300, False, 0x20) + +genIFRwDataCode(3, 0x300, False, 0x20) + +genIFRwDataCode(4, 0x300, False, 0x20) + +genSlvSMReadData(1, 0, sm_size) + +genSlvSMReadData(1, 2, sm_size) + +genSlvSMReadData(1, 4, sm_size) + +genSlvSMReadData(1, 6, sm_size) + +genSlvSMReadData(2, 0, sm_size) + +genSlvSMReadData(2, 2, sm_size) + +genSlvSMReadData(2, 4, sm_size) + +genSlvSMReadData(2, 6, sm_size) + +genSlvSMReadData(3, 0, sm_size) + +genSlvSMReadData(3, 2, sm_size) + +genSlvSMReadData(3, 4, sm_size) + +genSlvSMReadData(3, 6, sm_size) + +genSlvSMReadData(4, 0, sm_size) + +genSlvSMReadData(4, 2, sm_size) + +genSlvSMReadData(4, 4, sm_size) + +genSlvSMReadData(4, 6, sm_size) + +genIFRwDataCode(1, 0x300, False, 0x20) + +genIFRwDataCode(2, 0x300, False, 0x20) + +genIFRwDataCode(3, 0x300, False, 0x20) + +genIFRwDataCode(4, 0x300, False, 0x20) + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + + +genMessageCode("--清除中断") + +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + +genTcEndFrameCode(gen_file_def)) + + genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1, True, gen_file_def_ap) + return gen_file_def + +def tc17(): + genPkt = GenPkt() + + gen_file_def = "ebmmu_tc17" + sm_idx = 0 + tc_des = "测试16个ebmmu全配置下运行,每4个ebmmu对应一个SM,映射4个字节。分别映射SM1/3/5/7, \\n" \ + + "每个映射了16个字节。中间无字节空洞。使用1个子包,将数据读上来。每个ebmmu必须对齐、足长的写入,\\n" \ + + "对应的sm才能正常工作。QSPI/SPI侧能正常的读到相关的数据。" + + #-------------------------------------------------------------------------- + #>>>>>>设置EB-MMU,测试用例15,读,检查权限 + genPkt.clean() + genPkt.setPktType(0) + + addr = 0x10000000 + addr_off = 0x0 + sm_size = 16 + + genPkt.addSubPkt(0x0, 0, 0x0018, 0xe, 2, [0x1, 0x58]) + #subPkt参数:索引、索引类型、地址、命令、长度、数据 + data = [0,] * 256 + + taddr = addr + addr_off + ebmmu_offset = 0 + for i in range(4): + setting_ebmmu_regs(data, + ebmmu_offset, + taddr + i * int(sm_size / 4), + 0x1000 + i * int(sm_size / 4), + sm_size / 4, + 0x1, + 0x1 + ) + #print(ebmmu_offset, hex(taddr + i * int(sm_size / 4)), hex(0x0800 + i * int(sm_size / 4))) + ebmmu_offset = ebmmu_offset + 1 + + addr_off = addr_off + sm_size + taddr = addr + addr_off + for i in range(4): + setting_ebmmu_regs(data, + ebmmu_offset, + taddr + i * int(sm_size / 4), + 0x2000 + i * int(sm_size / 4), + sm_size / 4, + 0x1, + 0x1 + ) + #print(ebmmu_offset, hex(taddr + i * int(sm_size / 4)), hex(0x0800 + i * int(sm_size / 4))) + ebmmu_offset = ebmmu_offset + 1 + + addr_off = addr_off + sm_size + taddr = addr + addr_off + for i in range(4): + setting_ebmmu_regs(data, + ebmmu_offset, + taddr + i * int(sm_size / 4), + 0x3000 + i * int(sm_size / 4), + sm_size / 4, + 0x1, + 0x1 + ) + #print(ebmmu_offset, hex(taddr + i * int(sm_size / 4)), hex(0x0800 + i * int(sm_size / 4))) + ebmmu_offset = ebmmu_offset + 1 + + addr_off = addr_off + sm_size + taddr = addr + addr_off + for i in range(4): + setting_ebmmu_regs(data, + ebmmu_offset, + taddr + i * int(sm_size / 4), + 0x4000 + i * int(sm_size / 4), + sm_size / 4, + 0x1, + 0x1 + ) + #print(ebmmu_offset, hex(taddr + i * int(sm_size / 4)), hex(0x0800 + i * int(sm_size / 4))) + ebmmu_offset = ebmmu_offset + 1 + + genPkt.addSubPkt(0x1, 0, 0x0200, 0x1, 160, data) + + #subPkt参数:索引、索引类型、地址、命令、长度、数据 + data = [0,] * 256 + + addr_off = addr_off + sm_size + taddr = addr + addr_off + ebmmu_offset = 0 + for i in range(4): + setting_ebmmu_regs(data, + ebmmu_offset, + taddr + i * int(sm_size / 4), + 0x1000 + i * int(sm_size / 4), + sm_size / 4, + 0x1, + 0x1 + ) + #print(ebmmu_offset, hex(taddr + i * int(sm_size / 4)), hex(0x0800 + i * int(sm_size / 4))) + ebmmu_offset = ebmmu_offset + 1 + + addr_off = addr_off + sm_size + taddr = addr + addr_off + for i in range(4): + setting_ebmmu_regs(data, + ebmmu_offset, + taddr + i * int(sm_size / 4), + 0x2000 + i * int(sm_size / 4), + sm_size / 4, + 0x1, + 0x1 + ) + #print(ebmmu_offset, hex(taddr + i * int(sm_size / 4)), hex(0x0800 + i * int(sm_size / 4))) + ebmmu_offset = ebmmu_offset + 1 + + addr_off = addr_off + sm_size + taddr = addr + addr_off + for i in range(4): + setting_ebmmu_regs(data, + ebmmu_offset, + taddr + i * int(sm_size / 4), + 0x3000 + i * int(sm_size / 4), + sm_size / 4, + 0x1, + 0x1 + ) + #print(ebmmu_offset, hex(taddr + i * int(sm_size / 4)), hex(0x0800 + i * int(sm_size / 4))) + ebmmu_offset = ebmmu_offset + 1 + + addr_off = addr_off + sm_size + taddr = addr + addr_off + for i in range(4): + setting_ebmmu_regs(data, + ebmmu_offset, + taddr + i * int(sm_size / 4), + 0x4000 + i * int(sm_size / 4), + sm_size / 4, + 0x1, + 0x1 + ) + #print(ebmmu_offset, hex(taddr + i * int(sm_size / 4)), hex(0x0800 + i * int(sm_size / 4))) + ebmmu_offset = ebmmu_offset + 1 + + genPkt.addSubPkt(0x2, 0, 0x0200, 0x1, 160, data) + + + #subPkt参数:索引、索引类型、地址、命令、长度、数据 + data = [0,] * 256 + + addr_off = addr_off + sm_size + taddr = addr + addr_off + ebmmu_offset = 0 + for i in range(4): + setting_ebmmu_regs(data, + ebmmu_offset, + taddr + i * int(sm_size / 4), + 0x1000 + i * int(sm_size / 4), + sm_size / 4, + 0x1, + 0x1 + ) + #print(ebmmu_offset, hex(taddr + i * int(sm_size / 4)), hex(0x0800 + i * int(sm_size / 4))) + ebmmu_offset = ebmmu_offset + 1 + + addr_off = addr_off + sm_size + taddr = addr + addr_off + for i in range(4): + setting_ebmmu_regs(data, + ebmmu_offset, + taddr + i * int(sm_size / 4), + 0x2000 + i * int(sm_size / 4), + sm_size / 4, + 0x1, + 0x1 + ) + #print(ebmmu_offset, hex(taddr + i * int(sm_size / 4)), hex(0x0800 + i * int(sm_size / 4))) + ebmmu_offset = ebmmu_offset + 1 + + addr_off = addr_off + sm_size + taddr = addr + addr_off + for i in range(4): + setting_ebmmu_regs(data, + ebmmu_offset, + taddr + i * int(sm_size / 4), + 0x3000 + i * int(sm_size / 4), + sm_size / 4, + 0x1, + 0x1 + ) + #print(ebmmu_offset, hex(taddr + i * int(sm_size / 4)), hex(0x0800 + i * int(sm_size / 4))) + ebmmu_offset = ebmmu_offset + 1 + + addr_off = addr_off + sm_size + taddr = addr + addr_off + for i in range(4): + setting_ebmmu_regs(data, + ebmmu_offset, + taddr + i * int(sm_size / 4), + 0x4000 + i * int(sm_size / 4), + sm_size / 4, + 0x1, + 0x1 + ) + #print(ebmmu_offset, hex(taddr + i * int(sm_size / 4)), hex(0x0800 + i * int(sm_size / 4))) + ebmmu_offset = ebmmu_offset + 1 + + genPkt.addSubPkt(0x3, 0, 0x0200, 0x1, 160, data) + + + #subPkt参数:索引、索引类型、地址、命令、长度、数据 + data = [0,] * 256 + + addr_off = addr_off + sm_size + taddr = addr + addr_off + ebmmu_offset = 0 + for i in range(4): + setting_ebmmu_regs(data, + ebmmu_offset, + taddr + i * int(sm_size / 4), + 0x1000 + i * int(sm_size / 4), + sm_size / 4, + 0x1, + 0x1 + ) + #print(ebmmu_offset, hex(taddr + i * int(sm_size / 4)), hex(0x0800 + i * int(sm_size / 4))) + ebmmu_offset = ebmmu_offset + 1 + + addr_off = addr_off + sm_size + taddr = addr + addr_off + for i in range(4): + setting_ebmmu_regs(data, + ebmmu_offset, + taddr + i * int(sm_size / 4), + 0x2000 + i * int(sm_size / 4), + sm_size / 4, + 0x1, + 0x1 + ) + #print(ebmmu_offset, hex(taddr + i * int(sm_size / 4)), hex(0x0800 + i * int(sm_size / 4))) + ebmmu_offset = ebmmu_offset + 1 + + addr_off = addr_off + sm_size + taddr = addr + addr_off + for i in range(4): + setting_ebmmu_regs(data, + ebmmu_offset, + taddr + i * int(sm_size / 4), + 0x3000 + i * int(sm_size / 4), + sm_size / 4, + 0x1, + 0x1 + ) + #print(ebmmu_offset, hex(taddr + i * int(sm_size / 4)), hex(0x0800 + i * int(sm_size / 4))) + ebmmu_offset = ebmmu_offset + 1 + + addr_off = addr_off + sm_size + taddr = addr + addr_off + for i in range(4): + setting_ebmmu_regs(data, + ebmmu_offset, + taddr + i * int(sm_size / 4), + 0x4000 + i * int(sm_size / 4), + sm_size / 4, + 0x1, + 0x1 + ) + #print(ebmmu_offset, hex(taddr + i * int(sm_size / 4)), hex(0x0800 + i * int(sm_size / 4))) + ebmmu_offset = ebmmu_offset + 1 + + genPkt.addSubPkt(0x4, 0, 0x0200, 0x1, 160, data) + genPkt.addSubPkt(0x0, 0, 0x0018, 0xe, 2, [0x0, 0x58]) + + data = [0,] * 2 + data[0] = (sm_size >> 0) & 0xff + data[1] = (sm_size >> 8) & 0xff + genPkt.addSubPkt(0x0, 0, 0x306, 0xe, 2, data) + + data = [0,] * 2 + data[0] = (sm_size >> 0) & 0xff + data[1] = (sm_size >> 8) & 0xff + genPkt.addSubPkt(0x0, 0, 0x30e, 0xe, 2, data) + + data = [0,] * 2 + data[0] = (sm_size >> 0) & 0xff + data[1] = (sm_size >> 8) & 0xff + genPkt.addSubPkt(0x0, 0, 0x316, 0xe, 2, data) + + + data = [0,] * 2 + data[0] = (sm_size >> 0) & 0xff + data[1] = (sm_size >> 8) & 0xff + genPkt.addSubPkt(0x0, 0, 0x31e, 0xe, 2, data) + + genPkt.addBeforeExc(genTcStartFrameCode(gen_file_def, tc_des) + +genMessageCode("--清除中断") + +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + ) + + genPkt.addAfterExc(genWriteTransLenCode(gen_file_def, sm_idx) + +genWriteTransPktCode(gen_file_def, sm_idx) + +genTrgTransPktCode(gen_file_def, sm_idx) + +genReadAckPktCode(gen_file_def, sm_idx) + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + + +genMessageCode("--清除中断") + +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + ) + + genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1) + + #>>>>>>用EB-MMU方式读取EB-MMU设置, 15 + genPkt.clean() + genPkt.setPktType(0) + + #subPkt参数:索引、索引类型、地址、命令、长度、数据 + data = [(i & 0xff) for i in range(sm_size * 16)] + + gen_file_def_ap = gen_file_def + "_rw" + sm_idx = 0 + + genPkt.addSubPkt(0x1000, 2, 0, 0x0, sm_size * 16, data) + + genPkt.addBeforeExc(genSlvSMWriteData(1, 1, sm_size, list(range(0, sm_size))) + +genSlvSMWriteData(1, 3, sm_size, list(range(0, sm_size * 2, 2))) + +genSlvSMWriteData(1, 5, sm_size, list(range(0, sm_size * 3, 3))) + +genSlvSMWriteData(1, 7, sm_size, list(range(0, sm_size * 4, 4))) + +genSlvSMWriteData(2, 1, sm_size, list(range(0, sm_size * 5, 5))) + +genSlvSMWriteData(2, 3, sm_size, list(range(0, sm_size * 6, 6))) + +genSlvSMWriteData(2, 5, sm_size, list(range(0, sm_size * 7, 7))) + +genSlvSMWriteData(2, 7, sm_size, list(range(0, sm_size * 8, 8))) + +genSlvSMWriteData(3, 1, sm_size, list(range(0, sm_size * 9, 9))) + +genSlvSMWriteData(3, 3, sm_size, list(range(0, sm_size * 8, 8))) + +genSlvSMWriteData(3, 5, sm_size, list(range(0, sm_size * 7, 7))) + +genSlvSMWriteData(3, 7, sm_size, list(range(0, sm_size * 6, 6))) + +genSlvSMWriteData(4, 1, sm_size, list(range(0, sm_size * 5, 5))) + +genSlvSMWriteData(4, 3, sm_size, list(range(0, sm_size * 4, 4))) + +genSlvSMWriteData(4, 5, sm_size, list(range(0, sm_size * 3, 3))) + +genSlvSMWriteData(4, 7, sm_size, list(range(0, sm_size * 2, 2))) + ) + + genPkt.addAfterExc(genWriteTransLenCode(gen_file_def_ap, sm_idx) + +genWriteTransPktCode(gen_file_def_ap, sm_idx) + +genTrgTransPktCode(gen_file_def_ap, sm_idx) + +genReadAckPktCode(gen_file_def_ap, sm_idx) + + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + + +genMessageCode("--清除中断") + +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + + +genTcEndFrameCode(gen_file_def) + ) + + genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1, True, gen_file_def_ap) + return gen_file_def + + +def tc18(): + genPkt = GenPkt() + + gen_file_def = "ebmmu_tc18" + sm_idx = 0 + tc_des = "测试16个ebmmu全配置下运行,每4个ebmmu对应一个SM,映射4个字节。分别映射SM1/3/4/6, \\n" \ + + "每个映射了16个字节。中间无字节空洞。使用1个子包,将数据读写上来。每个ebmmu必须对齐、足长的写入,\\n" \ + + "对应的sm才能正常工作。这里注意,子包是读写的,但是ebmmu是有权限的,通过权限合理的分配,实现一个子包既读又写。" + + #-------------------------------------------------------------------------- + #>>>>>>设置EB-MMU,测试用例15,读,检查权限 + genPkt.clean() + genPkt.setPktType(0) + + addr = 0x10000000 + addr_off = 0x0 + sm_size = 16 + + genPkt.addSubPkt(0x0, 0, 0x0018, 0xe, 2, [0x1, 0x58]) + #subPkt参数:索引、索引类型、地址、命令、长度、数据 + data = [0,] * 256 + + taddr = addr + addr_off + ebmmu_offset = 0 + for i in range(4): + setting_ebmmu_regs(data, + ebmmu_offset, + taddr + i * int(sm_size / 4), + 0x1000 + i * int(sm_size / 4), + sm_size / 4, + 0x1, + 0x1 + ) + #print(ebmmu_offset, hex(taddr + i * int(sm_size / 4)), hex(0x0800 + i * int(sm_size / 4))) + ebmmu_offset = ebmmu_offset + 1 + + addr_off = addr_off + sm_size + taddr = addr + addr_off + for i in range(4): + setting_ebmmu_regs(data, + ebmmu_offset, + taddr + i * int(sm_size / 4), + 0x2000 + i * int(sm_size / 4), + sm_size / 4, + 0x1, + 0x1 + ) + #print(ebmmu_offset, hex(taddr + i * int(sm_size / 4)), hex(0x0800 + i * int(sm_size / 4))) + ebmmu_offset = ebmmu_offset + 1 + + addr_off = addr_off + sm_size + taddr = addr + addr_off + for i in range(4): + setting_ebmmu_regs(data, + ebmmu_offset, + taddr + i * int(sm_size / 4), + 0x2800 + i * int(sm_size / 4), + sm_size / 4, + 0x2, + 0x1 + ) + #print(ebmmu_offset, hex(taddr + i * int(sm_size / 4)), hex(0x0800 + i * int(sm_size / 4))) + ebmmu_offset = ebmmu_offset + 1 + + addr_off = addr_off + sm_size + taddr = addr + addr_off + for i in range(4): + setting_ebmmu_regs(data, + ebmmu_offset, + taddr + i * int(sm_size / 4), + 0x3800 + i * int(sm_size / 4), + sm_size / 4, + 0x2, + 0x1 + ) + #print(ebmmu_offset, hex(taddr + i * int(sm_size / 4)), hex(0x0800 + i * int(sm_size / 4))) + ebmmu_offset = ebmmu_offset + 1 + + genPkt.addSubPkt(0x1, 0, 0x0200, 0x1, 160, data) + + #subPkt参数:索引、索引类型、地址、命令、长度、数据 + data = [0,] * 256 + + addr_off = addr_off + sm_size + taddr = addr + addr_off + ebmmu_offset = 0 + for i in range(4): + setting_ebmmu_regs(data, + ebmmu_offset, + taddr + i * int(sm_size / 4), + 0x1000 + i * int(sm_size / 4), + sm_size / 4, + 0x1, + 0x1 + ) + #print(ebmmu_offset, hex(taddr + i * int(sm_size / 4)), hex(0x0800 + i * int(sm_size / 4))) + ebmmu_offset = ebmmu_offset + 1 + + addr_off = addr_off + sm_size + taddr = addr + addr_off + for i in range(4): + setting_ebmmu_regs(data, + ebmmu_offset, + taddr + i * int(sm_size / 4), + 0x2000 + i * int(sm_size / 4), + sm_size / 4, + 0x1, + 0x1 + ) + #print(ebmmu_offset, hex(taddr + i * int(sm_size / 4)), hex(0x0800 + i * int(sm_size / 4))) + ebmmu_offset = ebmmu_offset + 1 + + addr_off = addr_off + sm_size + taddr = addr + addr_off + for i in range(4): + setting_ebmmu_regs(data, + ebmmu_offset, + taddr + i * int(sm_size / 4), + 0x2800 + i * int(sm_size / 4), + sm_size / 4, + 0x2, + 0x1 + ) + #print(ebmmu_offset, hex(taddr + i * int(sm_size / 4)), hex(0x0800 + i * int(sm_size / 4))) + ebmmu_offset = ebmmu_offset + 1 + + addr_off = addr_off + sm_size + taddr = addr + addr_off + for i in range(4): + setting_ebmmu_regs(data, + ebmmu_offset, + taddr + i * int(sm_size / 4), + 0x3800 + i * int(sm_size / 4), + sm_size / 4, + 0x2, + 0x1 + ) + #print(ebmmu_offset, hex(taddr + i * int(sm_size / 4)), hex(0x0800 + i * int(sm_size / 4))) + ebmmu_offset = ebmmu_offset + 1 + + genPkt.addSubPkt(0x2, 0, 0x0200, 0x1, 160, data) + + + #subPkt参数:索引、索引类型、地址、命令、长度、数据 + data = [0,] * 256 + + addr_off = addr_off + sm_size + taddr = addr + addr_off + ebmmu_offset = 0 + for i in range(4): + setting_ebmmu_regs(data, + ebmmu_offset, + taddr + i * int(sm_size / 4), + 0x1000 + i * int(sm_size / 4), + sm_size / 4, + 0x1, + 0x1 + ) + #print(ebmmu_offset, hex(taddr + i * int(sm_size / 4)), hex(0x0800 + i * int(sm_size / 4))) + ebmmu_offset = ebmmu_offset + 1 + + addr_off = addr_off + sm_size + taddr = addr + addr_off + for i in range(4): + setting_ebmmu_regs(data, + ebmmu_offset, + taddr + i * int(sm_size / 4), + 0x2000 + i * int(sm_size / 4), + sm_size / 4, + 0x1, + 0x1 + ) + #print(ebmmu_offset, hex(taddr + i * int(sm_size / 4)), hex(0x0800 + i * int(sm_size / 4))) + ebmmu_offset = ebmmu_offset + 1 + + addr_off = addr_off + sm_size + taddr = addr + addr_off + for i in range(4): + setting_ebmmu_regs(data, + ebmmu_offset, + taddr + i * int(sm_size / 4), + 0x2800 + i * int(sm_size / 4), + sm_size / 4, + 0x2, + 0x1 + ) + #print(ebmmu_offset, hex(taddr + i * int(sm_size / 4)), hex(0x0800 + i * int(sm_size / 4))) + ebmmu_offset = ebmmu_offset + 1 + + addr_off = addr_off + sm_size + taddr = addr + addr_off + for i in range(4): + setting_ebmmu_regs(data, + ebmmu_offset, + taddr + i * int(sm_size / 4), + 0x3800 + i * int(sm_size / 4), + sm_size / 4, + 0x2, + 0x1 + ) + #print(ebmmu_offset, hex(taddr + i * int(sm_size / 4)), hex(0x0800 + i * int(sm_size / 4))) + ebmmu_offset = ebmmu_offset + 1 + + genPkt.addSubPkt(0x3, 0, 0x0200, 0x1, 160, data) + + + #subPkt参数:索引、索引类型、地址、命令、长度、数据 + data = [0,] * 256 + + addr_off = addr_off + sm_size + taddr = addr + addr_off + ebmmu_offset = 0 + for i in range(4): + setting_ebmmu_regs(data, + ebmmu_offset, + taddr + i * int(sm_size / 4), + 0x1000 + i * int(sm_size / 4), + sm_size / 4, + 0x1, + 0x1 + ) + #print(ebmmu_offset, hex(taddr + i * int(sm_size / 4)), hex(0x0800 + i * int(sm_size / 4))) + ebmmu_offset = ebmmu_offset + 1 + + addr_off = addr_off + sm_size + taddr = addr + addr_off + for i in range(4): + setting_ebmmu_regs(data, + ebmmu_offset, + taddr + i * int(sm_size / 4), + 0x2000 + i * int(sm_size / 4), + sm_size / 4, + 0x1, + 0x1 + ) + #print(ebmmu_offset, hex(taddr + i * int(sm_size / 4)), hex(0x0800 + i * int(sm_size / 4))) + ebmmu_offset = ebmmu_offset + 1 + + addr_off = addr_off + sm_size + taddr = addr + addr_off + for i in range(4): + setting_ebmmu_regs(data, + ebmmu_offset, + taddr + i * int(sm_size / 4), + 0x2800 + i * int(sm_size / 4), + sm_size / 4, + 0x2, + 0x1 + ) + #print(ebmmu_offset, hex(taddr + i * int(sm_size / 4)), hex(0x0800 + i * int(sm_size / 4))) + ebmmu_offset = ebmmu_offset + 1 + + addr_off = addr_off + sm_size + taddr = addr + addr_off + for i in range(4): + setting_ebmmu_regs(data, + ebmmu_offset, + taddr + i * int(sm_size / 4), + 0x3800 + i * int(sm_size / 4), + sm_size / 4, + 0x2, + 0x1 + ) + #print(ebmmu_offset, hex(taddr + i * int(sm_size / 4)), hex(0x0800 + i * int(sm_size / 4))) + ebmmu_offset = ebmmu_offset + 1 + + genPkt.addSubPkt(0x4, 0, 0x0200, 0x1, 160, data) + genPkt.addSubPkt(0x0, 0, 0x0018, 0xe, 2, [0x0, 0x58]) + + data = [0,] * 2 + data[0] = (sm_size >> 0) & 0xff + data[1] = (sm_size >> 8) & 0xff + genPkt.addSubPkt(0x0, 0, 0x306, 0xe, 2, data) + + data = [0,] * 2 + data[0] = (sm_size >> 0) & 0xff + data[1] = (sm_size >> 8) & 0xff + genPkt.addSubPkt(0x0, 0, 0x30e, 0xe, 2, data) + + data = [0,] * 2 + data[0] = (sm_size >> 0) & 0xff + data[1] = (sm_size >> 8) & 0xff + genPkt.addSubPkt(0x0, 0, 0x312, 0xe, 2, data) + + + data = [0,] * 2 + data[0] = (sm_size >> 0) & 0xff + data[1] = (sm_size >> 8) & 0xff + genPkt.addSubPkt(0x0, 0, 0x31a, 0xe, 2, data) + + genPkt.addBeforeExc(genTcStartFrameCode(gen_file_def, tc_des) + +genMessageCode("--清除中断") + +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + ) + + genPkt.addAfterExc(genWriteTransLenCode(gen_file_def, sm_idx) + +genWriteTransPktCode(gen_file_def, sm_idx) + +genTrgTransPktCode(gen_file_def, sm_idx) + +genReadAckPktCode(gen_file_def, sm_idx) + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + + +genMessageCode("--清除中断") + +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + ) + + genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1) + + #>>>>>>用EB-MMU方式读取EB-MMU设置, 15 + genPkt.clean() + genPkt.setPktType(0) + + #subPkt参数:索引、索引类型、地址、命令、长度、数据 + data = [(i & 0xff) for i in range(sm_size * 16)] + + gen_file_def_ap = gen_file_def + "_rw" + sm_idx = 0 + + genPkt.addSubPkt(0x1000, 2, 0, 0x2, sm_size * 16, data) + + genPkt.addBeforeExc(genSlvSMWriteData(1, 1, sm_size, list(range(0, sm_size))) + +genSlvSMWriteData(1, 3, sm_size, list(range(0, sm_size * 2, 2))) + #+genSlvSMWriteData(1, 5, sm_size, list(range(0, sm_size * 3, 3))) + #+genSlvSMWriteData(1, 7, sm_size, list(range(0, sm_size * 4, 4))) + +genSlvSMWriteData(2, 1, sm_size, list(range(0, sm_size * 5, 5))) + +genSlvSMWriteData(2, 3, sm_size, list(range(0, sm_size * 6, 6))) + #+genSlvSMWriteData(2, 5, sm_size, list(range(0, sm_size * 7, 7))) + #+genSlvSMWriteData(2, 7, sm_size, list(range(0, sm_size * 8, 8))) + +genSlvSMWriteData(3, 1, sm_size, list(range(0, sm_size * 9, 9))) + +genSlvSMWriteData(3, 3, sm_size, list(range(0, sm_size * 8, 8))) + #+genSlvSMWriteData(3, 5, sm_size, list(range(0, sm_size * 7, 7))) + #+genSlvSMWriteData(3, 7, sm_size, list(range(0, sm_size * 6, 6))) + +genSlvSMWriteData(4, 1, sm_size, list(range(0, sm_size * 5, 5))) + +genSlvSMWriteData(4, 3, sm_size, list(range(0, sm_size * 4, 4))) + #+genSlvSMWriteData(4, 5, sm_size, list(range(0, sm_size * 3, 3))) + #+genSlvSMWriteData(4, 7, sm_size, list(range(0, sm_size * 2, 2))) + ) + + genPkt.addAfterExc(genWriteTransLenCode(gen_file_def_ap, sm_idx) + +genWriteTransPktCode(gen_file_def_ap, sm_idx) + +genTrgTransPktCode(gen_file_def_ap, sm_idx) + +genReadAckPktCode(gen_file_def_ap, sm_idx) + + +genSlvSMReadData(1, 4, sm_size) + +genSlvSMReadData(1, 6, sm_size) + +genSlvSMReadData(2, 4, sm_size) + +genSlvSMReadData(2, 6, sm_size) + +genSlvSMReadData(3, 4, sm_size) + +genSlvSMReadData(3, 6, sm_size) + +genSlvSMReadData(4, 4, sm_size) + +genSlvSMReadData(4, 6, sm_size) + + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + + +genMessageCode("--清除中断") + +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + + +genTcEndFrameCode(gen_file_def) + ) + + genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1, True, gen_file_def_ap) + return gen_file_def + +def tc19(): + genPkt = GenPkt() + + gen_file_def = "ebmmu_tc19" + sm_idx = 0 + tc_des = "测试16个ebmmu全配置下运行,前8个ebmmu映射的是SM的元素个数寄存器,每一个对应一个SM,1个字节,\\n"\ + + "4个设备共32字节;后8个ebmmu,每1个ebmmu对应一个sm,映射8个字节。映射了sm0/2/4/6,\\n"\ + + "然后映射sm1/3/5/7,共64个字节,4个从设备总共256个字节。每个ebmmu必须对齐、足长的写入,\\n"\ + + "对应的sm才能正常工作。检查内容:ebmmu工作状态、回包工作计数、SMx的状态、中断状态、统计信息、相关时序" + + genPkt.clean() + genPkt.setPktType(0) + + addr = 0x20000000 + addr_off = 0x0 + sm_size = 8 + + genPkt.addSubPkt(0x0, 0, 0x0018, 0xe, 2, [0x1, 0x58]) + + sm_vaddr = 0x10000000 + sm_addr_off = 0x0 + + #subPkt参数:索引、索引类型、地址、命令、长度、数据 + data = [0,] * 256 + + taddr = addr + addr_off + ebmmu_offset = 0 + for i in range(8): + setting_ebmmu_regs(data, ebmmu_offset, + taddr + ebmmu_offset * 1, + 0x301 + ebmmu_offset * 4, + 1, + 0x1, + 0x1 + ) + #print(ebmmu_offset, hex(taddr + ebmmu_offset * 1), hex(0x301 + ebmmu_offset * 4), hex(1)) + ebmmu_offset = ebmmu_offset + 1 + + addr_off = addr_off + ebmmu_offset * 1 + + + tsm_vaddr = sm_vaddr + sm_addr_off + for i in range(4): + setting_ebmmu_regs(data, ebmmu_offset, + tsm_vaddr + i * sm_size, + 0x0800 + i * 0x1000, sm_size, 0x2, 0x1) + #print(ebmmu_offset, hex(tsm_vaddr + i * sm_size), hex(0x0800 + i * 0x1000), hex(sm_size)) + ebmmu_offset = ebmmu_offset + 1 + + sm_addr_off = sm_addr_off + 4 * sm_size + tsm_vaddr = sm_vaddr + sm_addr_off + for i in range(4): + setting_ebmmu_regs(data, ebmmu_offset, + tsm_vaddr + i * sm_size, + 0x1000 + i * 0x1000, sm_size, 0x1, 0x1) + #print(ebmmu_offset, hex(tsm_vaddr + i * sm_size), hex(0x1000 + i * 0x1000), hex(sm_size)) + ebmmu_offset = ebmmu_offset + 1 + sm_addr_off = sm_addr_off + 4 * sm_size + + genPkt.addSubPkt(0x1, 0, 0x0200, 0x1, 160, data) + + data = [0,] * 256 + taddr = addr + addr_off + ebmmu_offset = 0 + for i in range(8): + setting_ebmmu_regs(data, ebmmu_offset, + taddr + ebmmu_offset * 1, + 0x301 + ebmmu_offset * 4, + 1, + 0x1, + 0x1 + ) + #print(ebmmu_offset, hex(taddr + ebmmu_offset * 1), hex(0x301 + ebmmu_offset * 4), hex(1)) + ebmmu_offset = ebmmu_offset + 1 + + addr_off = addr_off + ebmmu_offset * 1 + + + tsm_vaddr = sm_vaddr + sm_addr_off + for i in range(4): + setting_ebmmu_regs(data, ebmmu_offset, + tsm_vaddr + i * sm_size, + 0x0800 + i * 0x1000, sm_size, 0x2, 0x1) + #print(ebmmu_offset, hex(tsm_vaddr + i * sm_size), hex(0x0800 + i * 0x1000), hex(sm_size)) + ebmmu_offset = ebmmu_offset + 1 + + sm_addr_off = sm_addr_off + 4 * sm_size + tsm_vaddr = sm_vaddr + sm_addr_off + for i in range(4): + setting_ebmmu_regs(data, ebmmu_offset, + tsm_vaddr + i * sm_size, + 0x1000 + i * 0x1000, sm_size, 0x1, 0x1) + #print(ebmmu_offset, hex(tsm_vaddr + i * sm_size), hex(0x1000 + i * 0x1000), hex(sm_size)) + ebmmu_offset = ebmmu_offset + 1 + sm_addr_off = sm_addr_off + 4 * sm_size + + genPkt.addSubPkt(0x2, 0, 0x0200, 0x1, 160, data) + + data = [0,] * 256 + taddr = addr + addr_off + ebmmu_offset = 0 + for i in range(8): + setting_ebmmu_regs(data, ebmmu_offset, + taddr + ebmmu_offset * 1, + 0x301 + ebmmu_offset * 4, + 1, + 0x1, + 0x1 + ) + #print(ebmmu_offset, hex(taddr + ebmmu_offset * 1), hex(0x301 + ebmmu_offset * 4), hex(1)) + ebmmu_offset = ebmmu_offset + 1 + + addr_off = addr_off + ebmmu_offset * 1 + + + tsm_vaddr = sm_vaddr + sm_addr_off + for i in range(4): + setting_ebmmu_regs(data, ebmmu_offset, + tsm_vaddr + i * sm_size, + 0x0800 + i * 0x1000, sm_size, 0x2, 0x1) + #print(ebmmu_offset, hex(tsm_vaddr + i * sm_size), hex(0x0800 + i * 0x1000), hex(sm_size)) + ebmmu_offset = ebmmu_offset + 1 + + sm_addr_off = sm_addr_off + 4 * sm_size + tsm_vaddr = sm_vaddr + sm_addr_off + for i in range(4): + setting_ebmmu_regs(data, ebmmu_offset, + tsm_vaddr + i * sm_size, + 0x1000 + i * 0x1000, sm_size, 0x1, 0x1) + #print(ebmmu_offset, hex(tsm_vaddr + i * sm_size), hex(0x1000 + i * 0x1000), hex(sm_size)) + ebmmu_offset = ebmmu_offset + 1 + sm_addr_off = sm_addr_off + 4 * sm_size + + genPkt.addSubPkt(0x3, 0, 0x0200, 0x1, 160, data) + + + data = [0,] * 256 + taddr = addr + addr_off + ebmmu_offset = 0 + for i in range(8): + setting_ebmmu_regs(data, ebmmu_offset, + taddr + ebmmu_offset * 1, + 0x301 + ebmmu_offset * 4, + 1, + 0x1, + 0x1 + ) + #print(ebmmu_offset, hex(taddr + ebmmu_offset * 1), hex(0x301 + ebmmu_offset * 4), hex(1)) + ebmmu_offset = ebmmu_offset + 1 + + addr_off = addr_off + ebmmu_offset * 1 + + + tsm_vaddr = sm_vaddr + sm_addr_off + for i in range(4): + setting_ebmmu_regs(data, ebmmu_offset, + tsm_vaddr + i * sm_size, + 0x0800 + i * 0x1000, sm_size, 0x2, 0x1) + #print(ebmmu_offset, hex(tsm_vaddr + i * sm_size), hex(0x0800 + i * 0x1000), hex(sm_size)) + ebmmu_offset = ebmmu_offset + 1 + + sm_addr_off = sm_addr_off + 4 * sm_size + tsm_vaddr = sm_vaddr + sm_addr_off + for i in range(4): + setting_ebmmu_regs(data, ebmmu_offset, + tsm_vaddr + i * sm_size, + 0x1000 + i * 0x1000, sm_size, 0x1, 0x1) + #print(ebmmu_offset, hex(tsm_vaddr + i * sm_size), hex(0x1000 + i * 0x1000), hex(sm_size)) + ebmmu_offset = ebmmu_offset + 1 + sm_addr_off = sm_addr_off + 4 * sm_size + + genPkt.addSubPkt(0x4, 0, 0x0200, 0x1, 160, data) + genPkt.addSubPkt(0x0, 0, 0x0018, 0xe, 2, [0x0, 0x58]) + + data = [0,] * 2 + data[0] = (sm_size >> 0) & 0xff + data[1] = (sm_size >> 8) & 0xff + genPkt.addSubPkt(0x0, 0, 0x302, 0xe, 2, data) + + ''' + data = [0,] * 2 + data[0] = (sm_size >> 0) & 0xff + data[1] = (sm_size >> 8) & 0xff + genPkt.addSubPkt(0x0, 0, 0x306, 0xe, 2, data) + ''' + + data = [0,] * 2 + data[0] = (sm_size >> 0) & 0xff + data[1] = (sm_size >> 8) & 0xff + genPkt.addSubPkt(0x0, 0, 0x30a, 0xe, 2, data) + + ''' + data = [0,] * 2 + data[0] = (sm_size >> 0) & 0xff + data[1] = (sm_size >> 8) & 0xff + genPkt.addSubPkt(0x0, 0, 0x30e, 0xe, 2, data) + ''' + + data = [0,] * 2 + data[0] = (sm_size >> 0) & 0xff + data[1] = (sm_size >> 8) & 0xff + genPkt.addSubPkt(0x0, 0, 0x312, 0xe, 2, data) + + ''' + data = [0,] * 2 + data[0] = (sm_size >> 0) & 0xff + data[1] = (sm_size >> 8) & 0xff + genPkt.addSubPkt(0x0, 0, 0x316, 0xe, 2, data) + ''' + + + data = [0,] * 2 + data[0] = (sm_size >> 0) & 0xff + data[1] = (sm_size >> 8) & 0xff + genPkt.addSubPkt(0x0, 0, 0x31a, 0xe, 2, data) + + ''' + data = [0,] * 2 + data[0] = (sm_size >> 0) & 0xff + data[1] = (sm_size >> 8) & 0xff + genPkt.addSubPkt(0x0, 0, 0x31e, 0xe, 2, data) + ''' + + genPkt.addBeforeExc(genTcStartFrameCode(gen_file_def, tc_des) + +genMessageCode("--清除中断") + +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + ) + + genPkt.addAfterExc(genWriteTransLenCode(gen_file_def, sm_idx) + +genWriteTransPktCode(gen_file_def, sm_idx) + +genTrgTransPktCode(gen_file_def, sm_idx) + +genReadAckPktCode(gen_file_def, sm_idx) + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + + +genMessageCode("--清除中断") + +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + ) + + genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1) + + #>>>>>>用EB-MMU方式读取EB-MMU设置, 15 + genPkt.clean() + genPkt.setPktType(0) + + #subPkt参数:索引、索引类型、地址、命令、长度、数据 + data = [(i & 0xff) for i in range(sm_size * 16)] + + gen_file_def_ap = gen_file_def + "_rw01" + sm_idx = 0 + + genPkt.addSubPkt(0x1000, 2, 0, 0x2, sm_size * 8 * 4, list(range(sm_size * 8 * 4))) + + genPkt.addBeforeExc(genMessageCode("\\n--写设备1数据") + +genSlvSMWriteData(1, 1, sm_size, list(range(0, sm_size))) + +genSlvSMWriteData(1, 3, sm_size, list(range(0, sm_size * 2, 2))) + +genSlvSMWriteData(1, 5, sm_size, list(range(0, sm_size * 3, 3))) + +genSlvSMWriteData(1, 7, sm_size, list(range(0, sm_size * 4, 4))) + + +genMessageCode("\\n--写设备2数据") + +genSlvSMWriteData(2, 1, sm_size, list(range(0, sm_size * 5, 5))) + +genSlvSMWriteData(2, 3, sm_size, list(range(0, sm_size * 6, 6))) + +genSlvSMWriteData(2, 5, sm_size, list(range(0, sm_size * 7, 7))) + +genSlvSMWriteData(2, 7, sm_size, list(range(0, sm_size * 8, 8))) + + +genMessageCode("\\n--写设备3数据") + +genSlvSMWriteData(3, 1, sm_size, list(range(0, sm_size * 9, 9))) + +genSlvSMWriteData(3, 3, sm_size, list(range(0, sm_size * 8, 8))) + +genSlvSMWriteData(3, 5, sm_size, list(range(0, sm_size * 7, 7))) + +genSlvSMWriteData(3, 7, sm_size, list(range(0, sm_size * 6, 6))) + + +genMessageCode("\\n--写设备4数据") + +genSlvSMWriteData(4, 1, sm_size, list(range(0, sm_size * 5, 5))) + +genSlvSMWriteData(4, 3, sm_size, list(range(0, sm_size * 4, 4))) + +genSlvSMWriteData(4, 5, sm_size, list(range(0, sm_size * 3, 3))) + +genSlvSMWriteData(4, 7, sm_size, list(range(0, sm_size * 2, 2))) + ) + + genPkt.addAfterExc(genWriteTransLenCode(gen_file_def_ap, sm_idx) + +genWriteTransPktCode(gen_file_def_ap, sm_idx) + +genTrgTransPktCode(gen_file_def_ap, sm_idx) + +genReadAckPktCode(gen_file_def_ap, sm_idx) + + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + + +genMessageCode("--清除中断") + +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + ) + genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1, True, gen_file_def_ap) + + + genPkt.clean() + genPkt.setPktType(0) + + gen_file_def_ap = gen_file_def + "_rw02" + sm_idx = 0 + + genPkt.addSubPkt(0x2000, 2, 0, 0x0, 8 * 4, [0, ] * 32) + + genPkt.addAfterExc(genWriteTransLenCode(gen_file_def_ap, sm_idx) + +genWriteTransPktCode(gen_file_def_ap, sm_idx) + +genTrgTransPktCode(gen_file_def_ap, sm_idx) + +genReadAckPktCode(gen_file_def_ap, sm_idx) + + +genMessageCode("\\n--读设备1数据") + +genSlvSMReadData(1, 0, sm_size) + +genSlvSMReadData(1, 2, sm_size) + +genSlvSMReadData(1, 4, sm_size) + +genSlvSMReadData(1, 6, sm_size) + + +genMessageCode("\\n--读设备2数据") + +genSlvSMReadData(2, 0, sm_size) + +genSlvSMReadData(2, 2, sm_size) + +genSlvSMReadData(2, 4, sm_size) + +genSlvSMReadData(2, 6, sm_size) + + +genMessageCode("\\n--读设备3数据") + +genSlvSMReadData(3, 0, sm_size) + +genSlvSMReadData(3, 2, sm_size) + +genSlvSMReadData(3, 4, sm_size) + +genSlvSMReadData(3, 6, sm_size) + + +genMessageCode("\\n--读设备4数据") + +genSlvSMReadData(4, 0, sm_size) + +genSlvSMReadData(4, 2, sm_size) + +genSlvSMReadData(4, 4, sm_size) + +genSlvSMReadData(4, 6, sm_size) + + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + + +genMessageCode("--清除中断") + +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + + +genTcEndFrameCode(gen_file_def) + ) + + genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1, True, gen_file_def_ap) + return gen_file_def + + + + diff --git a/tb/shinTest/testcase/environment.py b/tb/shinTest/testcase/environment.py index 8162ff8..1316a32 100644 --- a/tb/shinTest/testcase/environment.py +++ b/tb/shinTest/testcase/environment.py @@ -1,475 +1,475 @@ -from pyutils import * - - -global_dev_num = 4 -global_setting_dev_clk = dict() -global_using_8b10b = False -global_spi_type = 0 -global_cdr_type = 0 - -def bringup(): - gen_file_def = "sys_bringup" - sm_idx = 0 - tc_des = "系统环境建立,包括:1.配置主从栈的角色;2.网络建立,嗅探、设置顺序地址、嗅探;3.配置中断。\\n" \ - + "\\n注意:网络建立第一次嗅探包发送主要是为了建立拓扑,每个从站都知道了自己的邻居状况;发送顺序地址,\\n"\ - + "则是让每个从站拥有合适的地址。第二次发送嗅探包非必要,主要是用于更新从站的邻居信息。" - - genPkt = GenPkt() - - genPkt.clean() - - genPkt.addBeforeExc(genTcStartFrameCode(gen_file_def, tc_des) - +genMessageCode("--设置合适的工作模式:底层编码4b5b or 8b10b/设置CDR/SPI接口") - +using_proper_workmode(0) - +using_proper_workmode(1) - +using_proper_workmode(2) - +using_proper_workmode(3) - +using_proper_workmode(4) - - +genMessageCode("--读取中断状态") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - +genMessageCode("--清除中断") - +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - ) - - main_dev = [0x01, ] - slave_dev =[0x02, ] - genPkt.addAfterExc(genMessageCode("--设置主站,协议栈工作在主站模式") - +genIFRwDataCode(0, 0x0, True, 1, main_dev) - +"#5000\n" - +genMessageCode("--设置从站,协议栈工作在从站模式") - +genIFRwDataCode(1, 0x0, True, 1, slave_dev) - +genIFRwDataCode(2, 0x0, True, 1, slave_dev) - +genIFRwDataCode(3, 0x0, True, 1, slave_dev) - +genIFRwDataCode(4, 0x0, True, 1, slave_dev) - +genMessageCode("--读取寄存器,检查相关的配置") - +genIFRwDataCode(0, 0x0, False, 1) - +genIFRwDataCode(1, 0x0, False, 1) - +genIFRwDataCode(2, 0x0, False, 1) - +genIFRwDataCode(3, 0x0, False, 1) - +genIFRwDataCode(4, 0x0, False, 1) - - +genMessageCode("--使能中断") - +genIFRwDataCode(0, 0x70, True, 4, [0x03, 0x00, 0x00, 0xf0]) - +genIFRwDataCode(1, 0x70, True, 4, [0x00, 0x00, 0x00, 0xf0]) - +genIFRwDataCode(2, 0x70, True, 4, [0x00, 0x00, 0x00, 0xf0]) - +genIFRwDataCode(3, 0x70, True, 4, [0x00, 0x00, 0x00, 0xf0]) - +genIFRwDataCode(4, 0x70, True, 4, [0x00, 0x00, 0x00, 0xf0]) - - +genMessageCode("--设置中断为脉冲模式") - +genIFRwDataCode(0, 0x7c, True, 2, [0x10, 0x80]) - +genIFRwDataCode(1, 0x7c, True, 2, [0x10, 0x80]) - +genIFRwDataCode(2, 0x7c, True, 2, [0x10, 0x80]) - +genIFRwDataCode(3, 0x7c, True, 2, [0x10, 0x80]) - +genIFRwDataCode(4, 0x7c, True, 2, [0x10, 0x80]) - ) - - genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1) - - - genPkt.clean() - genPkt.setPktType(1) - gen_file_def_ap = gen_file_def+"_step01" - sm_idx = 0 - - genPkt.addBeforeExc(genMessageCode("--设置环境,进行第一次嗅探")) - - genPkt.addAfterExc(genWriteTransLenCode(gen_file_def_ap, sm_idx) - +genWriteTransPktCode(gen_file_def_ap, sm_idx) - +genTrgTransPktCode(gen_file_def_ap, sm_idx) - +genReadAckPktCode(gen_file_def_ap, sm_idx) - +genMessageCode("--嗅探后检查链路状态寄存器") - +genIFRwDataCode(1, 0xc0, False, 4) - +genIFRwDataCode(2, 0xc0, False, 4) - +genIFRwDataCode(3, 0xc0, False, 4) - +genIFRwDataCode(4, 0xc0, False, 4) - - +genMessageCode("--清除主中断") - +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - ) - genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1, True, gen_file_def_ap) - - #------------------------------------------------------------------------------ - genPkt.clean() - genPkt.setPktType(0) - - gen_file_def_ap = gen_file_def + "_step02" - sm_idx = 0 - - data = [0x3f, 0xff] - genPkt.addSubPkt(0x0, 0, 0x0, 0xb, 2, data) - - genPkt.addAfterExc(genMessageCode("--设置顺序地址") - +genWriteTransLenCode(gen_file_def_ap, sm_idx) - +genWriteTransPktCode(gen_file_def_ap, sm_idx) - +genTrgTransPktCode(gen_file_def_ap, sm_idx) - +genReadAckPktCode(gen_file_def_ap, sm_idx) - #+genTcEndFrameCode(gen_file_def) - +genIFRwDataCode(1, 0xc0, False, 4) - +genIFRwDataCode(2, 0xc0, False, 4) - +genIFRwDataCode(3, 0xc0, False, 4) - +genIFRwDataCode(4, 0xc0, False, 4) - - +genMessageCode("--清除主中断") - +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - ) - - genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1, True, gen_file_def_ap) - - genPkt.clean() - genPkt.setPktType(1) - gen_file_def_ap = gen_file_def+"_step03" - sm_idx = 0 - - genPkt.addBeforeExc(genMessageCode("--设置环境,进行第二次嗅探")) - - - genPkt.addAfterExc(genWriteTransLenCode(gen_file_def_ap, sm_idx) - +genWriteTransPktCode(gen_file_def_ap, sm_idx) - +genTrgTransPktCode(gen_file_def_ap, sm_idx) - +genReadAckPktCode(gen_file_def_ap, sm_idx) - - +genMessageCode("--嗅探后检查链路状态寄存器") - +genIFRwDataCode(1, 0xc0, False, 4) - +genIFRwDataCode(2, 0xc0, False, 4) - +genIFRwDataCode(3, 0xc0, False, 4) - +genIFRwDataCode(4, 0xc0, False, 4) - - +genMessageCode("--清除中断") - +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - - +genMessageCode("--读取中断状态") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - - +genMessageCode("--清除中断") - +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - - +genMessageCode("--读取中断状态") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - - +genMessageCode("--读取看门狗") - +genIFRwDataCode(0, 0x400, False, 8) - +genIFRwDataCode(1, 0x400, False, 8) - +genIFRwDataCode(2, 0x400, False, 8) - +genIFRwDataCode(3, 0x400, False, 8) - +genIFRwDataCode(4, 0x400, False, 8) - - #+genIFRwDataCode(1, 0x0044, True, 4, [0x12, 0x34, 0x56, 0x78]) - #+genIFRwDataCode(1, 0x0044, False, 4) - - +genTcEndFrameCode(gen_file_def) - ) - genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1, True, gen_file_def_ap) - - - add_tc_2_runlist(gen_file_def) - -def __GenDevice(id, TerminateNode = False): - global global_setting_dev_clk - dout_code = "dDat_w[%d]"%(id + 1, ) - din_code = "uDat_w[%d]"%(id + 1, ) - if TerminateNode: - dout_code = "" - din_code = "1'b0" - - clk = "multiCLK[0]" - multiclk = "multiCLK" - try: - v = global_setting_dev_clk[id + 1] - clk = "multiCLK%d[0]"%(id + 1, ) - multiclk = "multiCLK%d"%(id + 1, ) - except: - pass - - - code_device = ("\tShinTop s_ShinTop_slv%d(\n"%(id, ) - +"\t.clock(%s),\n"%(clk, ) - +"\t.reset(reset | isSoftReset_reg[%d]),\n\n"%(id + 1,) - - +"\t.io_multiCLK_0(%s[0]),\n"%(multiclk, ) - +"\t.io_multiCLK_1(%s[1]),\n"%(multiclk, ) - +"\t.io_multiCLK_2(%s[2]),\n"%(multiclk, ) - +"\t.io_multiCLK_3(%s[3]),\n"%(multiclk, ) - +"\t.io_multiCLK_4(%s[4]),\n"%(multiclk, ) - +"\t.io_multiCLK_5(%s[5]),\n"%(multiclk, ) - +"\t.io_multiCLK_6(%s[6]),\n"%(multiclk, ) - +"\t.io_multiCLK_7(%s[7]),\n"%(multiclk, ) - +"\t.io_multiCLK_8(%s[8]),\n"%(multiclk, ) - +"\t.io_multiCLK_9(%s[9]),\n"%(multiclk, ) - +"\t.io_multiCLK_10(%s[10]),\n"%(multiclk, ) - +"\t.io_multiCLK_11(%s[11]),\n"%(multiclk, ) - +"\t.io_multiCLK_12(%s[12]),\n"%(multiclk, ) - +"\t.io_multiCLK_13(%s[13]),\n"%(multiclk, ) - +"\t.io_multiCLK_14(%s[14]),\n"%(multiclk, ) - +"\t.io_multiCLK_15(%s[15]),\n\n"%(multiclk, ) - - +"\t.io_multiCLKDiv4_0(%s[0]),\n"%(multiclk, ) - +"\t.io_multiCLKDiv4_1(%s[4]),\n"%(multiclk, ) - +"\t.io_multiCLKDiv4_2(%s[8]),\n"%(multiclk, ) - +"\t.io_multiCLKDiv4_3(%s[12]),\n\n"%(multiclk, ) - - +"\t.io_dDatIn(dDat_w[%d]),\n"%(id, ) - +"\t.io_dDatOut(%s),\n"%(dout_code, ) - +"\t.io_uDatIn(%s),\n"%(din_code, ) - +"\t.io_uDatOut(uDat_w[%d]),\n\n"%(id, ) - - +"\t.io_iqspi_sck(qspi_sck),\n" - +"\t.io_iqspi_mosi(qspi_mosi),\n" - +"\t.io_iqspi_miso(`IQSPI_MISO(%d)),\n"%(id + 1, ) - +"\t.io_iqspi_isDirIn(),\n" - +"\t.io_iqspi_csn(`IQSPI_CSN(%d)),\n\n"%(id + 1, ) - - +"\t.io_ospi_sck (spi_sck),\n" - +"\t.io_ospi_mosi(spi_mosi),\n" - +"\t.io_ospi_miso(spi_miso[%d]),\n"%(id + 1, ) - +"\t.io_ospi_csn (`ESPI_CSN(%d)),\n\n"%(id + 1, ) - - +"\t.io_oqspi_sck(qspi_sck),\n" - +"\t.io_oqspi_mosi(qspi_mosi),\n" - +"\t.io_oqspi_miso(`EQSPI_MISO(%d)),\n"%(id + 1, ) - +"\t.io_oqspi_isDirIn(),\n" - +"\t.io_oqspi_csn(`EQSPI_CSN(%d)),\n\n"%(id + 1, ) - - +"\t.io_aqspi_sck(qspi_sck),\n" - +"\t.io_aqspi_mosi(qspi_mosi),\n" - +"\t.io_aqspi_miso(`AQSPI_MISO(%d)),\n"%(id + 1, ) - +"\t.io_aqspi_isDirIn(),\n" - +"\t.io_aqspi_csn(`AQSPI_CSN(%d)),\n"%(id + 1, ) - - +"\t.io_isSoftReset(isSoftReset[%d]),\n"%(id + 1, ) - +"\t.io_interrupt(io_int_sig[%d]),\n"%(id + 1, ) - +"\t.io_latchPin_0(latch0),\n" - +"\t.io_latchPin_1(latch1),\n" - +"\t.io_hwSerial(`HW_SERIAL),\n" - +"\t.io_uniCode(64'h0)\n" - +"\t);\n\n\n" - ) - return code_device - -def __gen_slv_dev_predef(num): - - global global_setting_dev_clk - global global_spi_type - - code_for_clk = "" - for k in global_setting_dev_clk: - code_for_clk = code_for_clk + "reg [15:0] multiCLK%d;\n"%(k, ) - - spi_type_str = "USING_IQSPI" - if global_spi_type == 1: - spi_type_str = "USING_OSPI" - elif global_spi_type == 2: - spi_type_str = "USING_OQSPI" - elif global_spi_type == 3: - spi_type_str = "USING_AQSPI" - else: - spi_type_str = "USING_IQSPI" - - code_predef =("`define %s \n"%(spi_type_str, ) - +"`define DEV_NUM %d //slave num\n"%(num, ) - +"`define ALL_DEV_NUM (`DEV_NUM + 1) // slave + master\n" - +"`define SPI_CSN_NUM (`ALL_DEV_NUM * 4)\n\n" - - +"`define HW_SERIAL 48'h31303050584c //(48'h4c5850303031)\n\n" - - +"`define IQSPI_PINS(N) (N*4+3):(N*4)\n" - +"`define EQSPI_PINS(N) ((N + `ALL_DEV_NUM)*4+3):((N + `ALL_DEV_NUM)*4)\n" - +"`define AQSPI_PINS(N) ((N + `ALL_DEV_NUM * 2)*4+3):((N + `ALL_DEV_NUM * 2)*4)\n\n" - - +"`define IQSPI_MISO(N) qspi_miso[`IQSPI_PINS(N)]\n" - +"`define EQSPI_MISO(N) qspi_miso[`EQSPI_PINS(N)]\n" - +"`define AQSPI_MISO(N) qspi_miso[`AQSPI_PINS(N)]\n\n" - - +"`define IQSPI_CSN_NUM(id) (id)\n" - +"`define ESPI_CSN_NUM(id) ((id)+(`ALL_DEV_NUM))\n" - +"`define EQSPI_CSN_NUM(id) ((id)+(`ALL_DEV_NUM)*2)\n" - +"`define AQSPI_CSN_NUM(id) ((id)+(`ALL_DEV_NUM)*3)\n\n" - - +"`define IQSPI_CSN(id) spi_csn[`IQSPI_CSN_NUM(id)]\n" - +"`define ESPI_CSN(id) spi_csn[`ESPI_CSN_NUM(id)]\n" - +"`define EQSPI_CSN(id) spi_csn[`EQSPI_CSN_NUM(id)]\n" - +"`define AQSPI_CSN(id) spi_csn[`AQSPI_CSN_NUM(id)]\n\n" - ) - - code_qspi_mux_init = "`define QSPI_MUX_MISO_INIT \\\n" - code_qspi_mux_init_item = "" - for i in range(num): - code_qspi_mux_init_item = code_qspi_mux_init_item + "\t\t(`IQSPI_MISO(%d) & ~{4{`IQSPI_CSN(%d)}}) |\\\n"%(i, i) - code_qspi_mux_init_item = code_qspi_mux_init_item + "\t\t(`IQSPI_MISO(%d) & ~{4{`IQSPI_CSN(%d)}}) |\\\n"%(num, num) - - for i in range(num): - code_qspi_mux_init_item = code_qspi_mux_init_item + "\t\t(`EQSPI_MISO(%d) & ~{4{`EQSPI_CSN(%d)}}) |\\\n"%(i, i) - code_qspi_mux_init_item = code_qspi_mux_init_item + "\t\t(`EQSPI_MISO(%d) & ~{4{`EQSPI_CSN(%d)}}) |\\\n"%(num, num) - - for i in range(num): - code_qspi_mux_init_item = code_qspi_mux_init_item + "\t\t(`AQSPI_MISO(%d) & ~{4{`AQSPI_CSN(%d)}}) |\\\n"%(i, i) - code_qspi_mux_init_item = code_qspi_mux_init_item + "\t\t(`AQSPI_MISO(%d) & ~{4{`AQSPI_CSN(%d)}})\n\n"%(num, num) - - code_qspi_mux_init = code_qspi_mux_init + code_qspi_mux_init_item - - - code_spi_mux_init = "`define SPI_MUX_MISO_INIT \\\n" - code_spi_mux_init_item = "" - for i in range(num): - code_spi_mux_init_item = code_spi_mux_init_item + "\t\t( spi_miso[%d] & ~`ESPI_CSN(%d)) |\\\n"%(i, i) - code_spi_mux_init_item = code_spi_mux_init_item + "\t\t( spi_miso[%d] & ~`ESPI_CSN(%d))\n\n"%(num, num) - code_spi_mux_init = code_spi_mux_init + code_spi_mux_init_item - - genPkt = GenPkt() - - genPkt.clean() - - gen_file_def = "dev_predef" - - code = code_for_clk + code_predef + code_qspi_mux_init + code_spi_mux_init - - genPkt.addAfterExc(code) - - genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1) - - -def get_slv_dev_num(): - global global_dev_num - - return global_dev_num - -def gen_slv_dev_num(num): - global global_dev_num - - global_dev_num = num - - __gen_slv_dev_predef(num) - - genPkt = GenPkt() - - genPkt.clean() - - gen_file_def = "slave_dev_def" - - code = "" - for id in range(num - 1): - code = code + __GenDevice(id) - - code = code + __GenDevice(num - 1, True) - - genPkt.addAfterExc(code) - - genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1) - - -def gen_slv_dev_for_clk(num): - __gen_slv_dev_predef(num) - - genPkt = GenPkt() - - genPkt.clean() - - gen_file_def = "slave_dev_def" - - code = "" - for id in range(num - 1): - code = code + __GenDevice(id) - - code = code + __GenDevice(num - 1, True) - - genPkt.addAfterExc(code) - - genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1) - - -def set_dev_clk(cfg): - global global_setting_dev_clk - global_setting_dev_clk = cfg - - code_for_clk = "" - for k in global_setting_dev_clk: - v = global_setting_dev_clk[k] - ph = int(8 * 1000000 * (int(abs(v[0]))%360) / 360.0) - period = int(1000000 + v[1]) - code_for_clk = code_for_clk + __gen_slv_clk(k, ph, period) - - genPkt = GenPkt() - genPkt.clean() - gen_file_def = "slave_dev_clk" - genPkt.addAfterExc(code_for_clk) - genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1) - - - -def __gen_slv_clk(clk, ph, period): - slv_code =( - "" - #"\tinitial begin\n" - #+"\t\tforever begin #%d clock%d <= ~clock%d; end\n"%(period * 8, clk, clk) - #+"\tend\n\n" - - +"\tgenerate\n" - +"\tfor( genvar i = 0; i < 16; i = i + 1 ) begin\n" - +"\t\tinitial begin\n" - + "\t\t\t//相位信息\n" - + "\t\t\t#%d\n"%(ph) - + "\t\t\tmultiCLK%d[i] = 0;\n"%(clk, ) - + "\t\t\tfor( integer j = 0; j < i; j = j + 1 ) begin\n" - + "\t\t\t\t#%d\n"%(period, ) - + "\t\t\t\t;\n" - + "\t\t\tend\n" - + "\t\t\tforever begin #%d multiCLK%d[i] <= ~multiCLK%d[i]; end\n"%(period * 8, clk, clk) - +"\t\tend\n" - +"\tend\n" - +"\tendgenerate\n") - - return slv_code - -def teardown(): - #add_tc_2_runlist("") - pass - -def set_spi_interface(spi_type): - global global_spi_type - global_spi_type = spi_type - -def set_using_8b10b(isUsing8b10b): - global global_using_8b10b - global_using_8b10b = isUsing8b10b - -def set_cdr_type(cdr_type): - global global_cdr_type - global_cdr_type = cdr_type - -def using_proper_workmode(dev, iface=1): - global global_using_8b10b - global global_spi_type - global global_cdr_type - - trans_code = 0x0 - - if global_using_8b10b: - trans_code = 0x1 - - return genIFRwDataCode(dev, 0x09, True, 1, [global_spi_type, ], wlog=False, iface=iface)\ - +genIFRwDataCode(dev, 0x004c, True, 2, [trans_code, 0x59], wlog = False)\ - +genIFRwDataCode(dev, 0x004e, True, 2, [global_cdr_type, 0x60], wlog = False) +from pyutils import * + + +global_dev_num = 4 +global_setting_dev_clk = dict() +global_using_8b10b = False +global_spi_type = 0 +global_cdr_type = 0 + +def bringup(): + gen_file_def = "sys_bringup" + sm_idx = 0 + tc_des = "系统环境建立,包括:1.配置主从栈的角色;2.网络建立,嗅探、设置顺序地址、嗅探;3.配置中断。\\n" \ + + "\\n注意:网络建立第一次嗅探包发送主要是为了建立拓扑,每个从站都知道了自己的邻居状况;发送顺序地址,\\n"\ + + "则是让每个从站拥有合适的地址。第二次发送嗅探包非必要,主要是用于更新从站的邻居信息。" + + genPkt = GenPkt() + + genPkt.clean() + + genPkt.addBeforeExc(genTcStartFrameCode(gen_file_def, tc_des) + +genMessageCode("--设置合适的工作模式:底层编码4b5b or 8b10b/设置CDR/SPI接口") + +using_proper_workmode(0) + +using_proper_workmode(1) + +using_proper_workmode(2) + +using_proper_workmode(3) + +using_proper_workmode(4) + + +genMessageCode("--读取中断状态") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + +genMessageCode("--清除中断") + +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + ) + + main_dev = [0x01, ] + slave_dev =[0x02, ] + genPkt.addAfterExc(genMessageCode("--设置主站,协议栈工作在主站模式") + +genIFRwDataCode(0, 0x0, True, 1, main_dev) + +"#5000\n" + +genMessageCode("--设置从站,协议栈工作在从站模式") + +genIFRwDataCode(1, 0x0, True, 1, slave_dev) + +genIFRwDataCode(2, 0x0, True, 1, slave_dev) + +genIFRwDataCode(3, 0x0, True, 1, slave_dev) + +genIFRwDataCode(4, 0x0, True, 1, slave_dev) + +genMessageCode("--读取寄存器,检查相关的配置") + +genIFRwDataCode(0, 0x0, False, 1) + +genIFRwDataCode(1, 0x0, False, 1) + +genIFRwDataCode(2, 0x0, False, 1) + +genIFRwDataCode(3, 0x0, False, 1) + +genIFRwDataCode(4, 0x0, False, 1) + + +genMessageCode("--使能中断") + +genIFRwDataCode(0, 0x70, True, 4, [0x03, 0x00, 0x00, 0xf0]) + +genIFRwDataCode(1, 0x70, True, 4, [0x00, 0x00, 0x00, 0xf0]) + +genIFRwDataCode(2, 0x70, True, 4, [0x00, 0x00, 0x00, 0xf0]) + +genIFRwDataCode(3, 0x70, True, 4, [0x00, 0x00, 0x00, 0xf0]) + +genIFRwDataCode(4, 0x70, True, 4, [0x00, 0x00, 0x00, 0xf0]) + + +genMessageCode("--设置中断为脉冲模式") + +genIFRwDataCode(0, 0x7c, True, 2, [0x10, 0x80]) + +genIFRwDataCode(1, 0x7c, True, 2, [0x10, 0x80]) + +genIFRwDataCode(2, 0x7c, True, 2, [0x10, 0x80]) + +genIFRwDataCode(3, 0x7c, True, 2, [0x10, 0x80]) + +genIFRwDataCode(4, 0x7c, True, 2, [0x10, 0x80]) + ) + + genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1) + + + genPkt.clean() + genPkt.setPktType(1) + gen_file_def_ap = gen_file_def+"_step01" + sm_idx = 0 + + genPkt.addBeforeExc(genMessageCode("--设置环境,进行第一次嗅探")) + + genPkt.addAfterExc(genWriteTransLenCode(gen_file_def_ap, sm_idx) + +genWriteTransPktCode(gen_file_def_ap, sm_idx) + +genTrgTransPktCode(gen_file_def_ap, sm_idx) + +genReadAckPktCode(gen_file_def_ap, sm_idx) + +genMessageCode("--嗅探后检查链路状态寄存器") + +genIFRwDataCode(1, 0xc0, False, 4) + +genIFRwDataCode(2, 0xc0, False, 4) + +genIFRwDataCode(3, 0xc0, False, 4) + +genIFRwDataCode(4, 0xc0, False, 4) + + +genMessageCode("--清除主中断") + +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + ) + genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1, True, gen_file_def_ap) + + #------------------------------------------------------------------------------ + genPkt.clean() + genPkt.setPktType(0) + + gen_file_def_ap = gen_file_def + "_step02" + sm_idx = 0 + + data = [0x3f, 0xff] + genPkt.addSubPkt(0x0, 0, 0x0, 0xb, 2, data) + + genPkt.addAfterExc(genMessageCode("--设置顺序地址") + +genWriteTransLenCode(gen_file_def_ap, sm_idx) + +genWriteTransPktCode(gen_file_def_ap, sm_idx) + +genTrgTransPktCode(gen_file_def_ap, sm_idx) + +genReadAckPktCode(gen_file_def_ap, sm_idx) + #+genTcEndFrameCode(gen_file_def) + +genIFRwDataCode(1, 0xc0, False, 4) + +genIFRwDataCode(2, 0xc0, False, 4) + +genIFRwDataCode(3, 0xc0, False, 4) + +genIFRwDataCode(4, 0xc0, False, 4) + + +genMessageCode("--清除主中断") + +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + ) + + genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1, True, gen_file_def_ap) + + genPkt.clean() + genPkt.setPktType(1) + gen_file_def_ap = gen_file_def+"_step03" + sm_idx = 0 + + genPkt.addBeforeExc(genMessageCode("--设置环境,进行第二次嗅探")) + + + genPkt.addAfterExc(genWriteTransLenCode(gen_file_def_ap, sm_idx) + +genWriteTransPktCode(gen_file_def_ap, sm_idx) + +genTrgTransPktCode(gen_file_def_ap, sm_idx) + +genReadAckPktCode(gen_file_def_ap, sm_idx) + + +genMessageCode("--嗅探后检查链路状态寄存器") + +genIFRwDataCode(1, 0xc0, False, 4) + +genIFRwDataCode(2, 0xc0, False, 4) + +genIFRwDataCode(3, 0xc0, False, 4) + +genIFRwDataCode(4, 0xc0, False, 4) + + +genMessageCode("--清除中断") + +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + + +genMessageCode("--读取中断状态") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + + +genMessageCode("--清除中断") + +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + + +genMessageCode("--读取中断状态") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + + +genMessageCode("--读取看门狗") + +genIFRwDataCode(0, 0x400, False, 8) + +genIFRwDataCode(1, 0x400, False, 8) + +genIFRwDataCode(2, 0x400, False, 8) + +genIFRwDataCode(3, 0x400, False, 8) + +genIFRwDataCode(4, 0x400, False, 8) + + #+genIFRwDataCode(1, 0x0044, True, 4, [0x12, 0x34, 0x56, 0x78]) + #+genIFRwDataCode(1, 0x0044, False, 4) + + +genTcEndFrameCode(gen_file_def) + ) + genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1, True, gen_file_def_ap) + + + add_tc_2_runlist(gen_file_def) + +def __GenDevice(id, TerminateNode = False): + global global_setting_dev_clk + dout_code = "dDat_w[%d]"%(id + 1, ) + din_code = "uDat_w[%d]"%(id + 1, ) + if TerminateNode: + dout_code = "" + din_code = "1'b0" + + clk = "multiCLK[0]" + multiclk = "multiCLK" + try: + v = global_setting_dev_clk[id + 1] + clk = "multiCLK%d[0]"%(id + 1, ) + multiclk = "multiCLK%d"%(id + 1, ) + except: + pass + + + code_device = ("\tShinTop s_ShinTop_slv%d(\n"%(id, ) + +"\t.clock(%s),\n"%(clk, ) + +"\t.reset(reset | isSoftReset_reg[%d]),\n\n"%(id + 1,) + + +"\t.io_multiCLK_0(%s[0]),\n"%(multiclk, ) + +"\t.io_multiCLK_1(%s[1]),\n"%(multiclk, ) + +"\t.io_multiCLK_2(%s[2]),\n"%(multiclk, ) + +"\t.io_multiCLK_3(%s[3]),\n"%(multiclk, ) + +"\t.io_multiCLK_4(%s[4]),\n"%(multiclk, ) + +"\t.io_multiCLK_5(%s[5]),\n"%(multiclk, ) + +"\t.io_multiCLK_6(%s[6]),\n"%(multiclk, ) + +"\t.io_multiCLK_7(%s[7]),\n"%(multiclk, ) + +"\t.io_multiCLK_8(%s[8]),\n"%(multiclk, ) + +"\t.io_multiCLK_9(%s[9]),\n"%(multiclk, ) + +"\t.io_multiCLK_10(%s[10]),\n"%(multiclk, ) + +"\t.io_multiCLK_11(%s[11]),\n"%(multiclk, ) + +"\t.io_multiCLK_12(%s[12]),\n"%(multiclk, ) + +"\t.io_multiCLK_13(%s[13]),\n"%(multiclk, ) + +"\t.io_multiCLK_14(%s[14]),\n"%(multiclk, ) + +"\t.io_multiCLK_15(%s[15]),\n\n"%(multiclk, ) + + +"\t.io_multiCLKDiv4_0(%s[0]),\n"%(multiclk, ) + +"\t.io_multiCLKDiv4_1(%s[4]),\n"%(multiclk, ) + +"\t.io_multiCLKDiv4_2(%s[8]),\n"%(multiclk, ) + +"\t.io_multiCLKDiv4_3(%s[12]),\n\n"%(multiclk, ) + + +"\t.io_dDatIn(dDat_w[%d]),\n"%(id, ) + +"\t.io_dDatOut(%s),\n"%(dout_code, ) + +"\t.io_uDatIn(%s),\n"%(din_code, ) + +"\t.io_uDatOut(uDat_w[%d]),\n\n"%(id, ) + + +"\t.io_iqspi_sck(qspi_sck),\n" + +"\t.io_iqspi_mosi(qspi_mosi),\n" + +"\t.io_iqspi_miso(`IQSPI_MISO(%d)),\n"%(id + 1, ) + +"\t.io_iqspi_isDirIn(),\n" + +"\t.io_iqspi_csn(`IQSPI_CSN(%d)),\n\n"%(id + 1, ) + + +"\t.io_ospi_sck (spi_sck),\n" + +"\t.io_ospi_mosi(spi_mosi),\n" + +"\t.io_ospi_miso(spi_miso[%d]),\n"%(id + 1, ) + +"\t.io_ospi_csn (`ESPI_CSN(%d)),\n\n"%(id + 1, ) + + +"\t.io_oqspi_sck(qspi_sck),\n" + +"\t.io_oqspi_mosi(qspi_mosi),\n" + +"\t.io_oqspi_miso(`EQSPI_MISO(%d)),\n"%(id + 1, ) + +"\t.io_oqspi_isDirIn(),\n" + +"\t.io_oqspi_csn(`EQSPI_CSN(%d)),\n\n"%(id + 1, ) + + +"\t.io_aqspi_sck(qspi_sck),\n" + +"\t.io_aqspi_mosi(qspi_mosi),\n" + +"\t.io_aqspi_miso(`AQSPI_MISO(%d)),\n"%(id + 1, ) + +"\t.io_aqspi_isDirIn(),\n" + +"\t.io_aqspi_csn(`AQSPI_CSN(%d)),\n"%(id + 1, ) + + +"\t.io_isSoftReset(isSoftReset[%d]),\n"%(id + 1, ) + +"\t.io_interrupt(io_int_sig[%d]),\n"%(id + 1, ) + +"\t.io_latchPin_0(latch0),\n" + +"\t.io_latchPin_1(latch1),\n" + +"\t.io_hwSerial(`HW_SERIAL),\n" + +"\t.io_uniCode(64'h0)\n" + +"\t);\n\n\n" + ) + return code_device + +def __gen_slv_dev_predef(num): + + global global_setting_dev_clk + global global_spi_type + + code_for_clk = "" + for k in global_setting_dev_clk: + code_for_clk = code_for_clk + "reg [15:0] multiCLK%d;\n"%(k, ) + + spi_type_str = "USING_IQSPI" + if global_spi_type == 1: + spi_type_str = "USING_OSPI" + elif global_spi_type == 2: + spi_type_str = "USING_OQSPI" + elif global_spi_type == 3: + spi_type_str = "USING_AQSPI" + else: + spi_type_str = "USING_IQSPI" + + code_predef =("`define %s \n"%(spi_type_str, ) + +"`define DEV_NUM %d //slave num\n"%(num, ) + +"`define ALL_DEV_NUM (`DEV_NUM + 1) // slave + master\n" + +"`define SPI_CSN_NUM (`ALL_DEV_NUM * 4)\n\n" + + +"`define HW_SERIAL 48'h31303050584c //(48'h4c5850303031)\n\n" + + +"`define IQSPI_PINS(N) (N*4+3):(N*4)\n" + +"`define EQSPI_PINS(N) ((N + `ALL_DEV_NUM)*4+3):((N + `ALL_DEV_NUM)*4)\n" + +"`define AQSPI_PINS(N) ((N + `ALL_DEV_NUM * 2)*4+3):((N + `ALL_DEV_NUM * 2)*4)\n\n" + + +"`define IQSPI_MISO(N) qspi_miso[`IQSPI_PINS(N)]\n" + +"`define EQSPI_MISO(N) qspi_miso[`EQSPI_PINS(N)]\n" + +"`define AQSPI_MISO(N) qspi_miso[`AQSPI_PINS(N)]\n\n" + + +"`define IQSPI_CSN_NUM(id) (id)\n" + +"`define ESPI_CSN_NUM(id) ((id)+(`ALL_DEV_NUM))\n" + +"`define EQSPI_CSN_NUM(id) ((id)+(`ALL_DEV_NUM)*2)\n" + +"`define AQSPI_CSN_NUM(id) ((id)+(`ALL_DEV_NUM)*3)\n\n" + + +"`define IQSPI_CSN(id) spi_csn[`IQSPI_CSN_NUM(id)]\n" + +"`define ESPI_CSN(id) spi_csn[`ESPI_CSN_NUM(id)]\n" + +"`define EQSPI_CSN(id) spi_csn[`EQSPI_CSN_NUM(id)]\n" + +"`define AQSPI_CSN(id) spi_csn[`AQSPI_CSN_NUM(id)]\n\n" + ) + + code_qspi_mux_init = "`define QSPI_MUX_MISO_INIT \\\n" + code_qspi_mux_init_item = "" + for i in range(num): + code_qspi_mux_init_item = code_qspi_mux_init_item + "\t\t(`IQSPI_MISO(%d) & ~{4{`IQSPI_CSN(%d)}}) |\\\n"%(i, i) + code_qspi_mux_init_item = code_qspi_mux_init_item + "\t\t(`IQSPI_MISO(%d) & ~{4{`IQSPI_CSN(%d)}}) |\\\n"%(num, num) + + for i in range(num): + code_qspi_mux_init_item = code_qspi_mux_init_item + "\t\t(`EQSPI_MISO(%d) & ~{4{`EQSPI_CSN(%d)}}) |\\\n"%(i, i) + code_qspi_mux_init_item = code_qspi_mux_init_item + "\t\t(`EQSPI_MISO(%d) & ~{4{`EQSPI_CSN(%d)}}) |\\\n"%(num, num) + + for i in range(num): + code_qspi_mux_init_item = code_qspi_mux_init_item + "\t\t(`AQSPI_MISO(%d) & ~{4{`AQSPI_CSN(%d)}}) |\\\n"%(i, i) + code_qspi_mux_init_item = code_qspi_mux_init_item + "\t\t(`AQSPI_MISO(%d) & ~{4{`AQSPI_CSN(%d)}})\n\n"%(num, num) + + code_qspi_mux_init = code_qspi_mux_init + code_qspi_mux_init_item + + + code_spi_mux_init = "`define SPI_MUX_MISO_INIT \\\n" + code_spi_mux_init_item = "" + for i in range(num): + code_spi_mux_init_item = code_spi_mux_init_item + "\t\t( spi_miso[%d] & ~`ESPI_CSN(%d)) |\\\n"%(i, i) + code_spi_mux_init_item = code_spi_mux_init_item + "\t\t( spi_miso[%d] & ~`ESPI_CSN(%d))\n\n"%(num, num) + code_spi_mux_init = code_spi_mux_init + code_spi_mux_init_item + + genPkt = GenPkt() + + genPkt.clean() + + gen_file_def = "dev_predef" + + code = code_for_clk + code_predef + code_qspi_mux_init + code_spi_mux_init + + genPkt.addAfterExc(code) + + genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1) + + +def get_slv_dev_num(): + global global_dev_num + + return global_dev_num + +def gen_slv_dev_num(num): + global global_dev_num + + global_dev_num = num + + __gen_slv_dev_predef(num) + + genPkt = GenPkt() + + genPkt.clean() + + gen_file_def = "slave_dev_def" + + code = "" + for id in range(num - 1): + code = code + __GenDevice(id) + + code = code + __GenDevice(num - 1, True) + + genPkt.addAfterExc(code) + + genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1) + + +def gen_slv_dev_for_clk(num): + __gen_slv_dev_predef(num) + + genPkt = GenPkt() + + genPkt.clean() + + gen_file_def = "slave_dev_def" + + code = "" + for id in range(num - 1): + code = code + __GenDevice(id) + + code = code + __GenDevice(num - 1, True) + + genPkt.addAfterExc(code) + + genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1) + + +def set_dev_clk(cfg): + global global_setting_dev_clk + global_setting_dev_clk = cfg + + code_for_clk = "" + for k in global_setting_dev_clk: + v = global_setting_dev_clk[k] + ph = int(8 * 1000000 * (int(abs(v[0]))%360) / 360.0) + period = int(1000000 + v[1]) + code_for_clk = code_for_clk + __gen_slv_clk(k, ph, period) + + genPkt = GenPkt() + genPkt.clean() + gen_file_def = "slave_dev_clk" + genPkt.addAfterExc(code_for_clk) + genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1) + + + +def __gen_slv_clk(clk, ph, period): + slv_code =( + "" + #"\tinitial begin\n" + #+"\t\tforever begin #%d clock%d <= ~clock%d; end\n"%(period * 8, clk, clk) + #+"\tend\n\n" + + +"\tgenerate\n" + +"\tfor( genvar i = 0; i < 16; i = i + 1 ) begin\n" + +"\t\tinitial begin\n" + + "\t\t\t//相位信息\n" + + "\t\t\t#%d\n"%(ph) + + "\t\t\tmultiCLK%d[i] = 0;\n"%(clk, ) + + "\t\t\tfor( integer j = 0; j < i; j = j + 1 ) begin\n" + + "\t\t\t\t#%d\n"%(period, ) + + "\t\t\t\t;\n" + + "\t\t\tend\n" + + "\t\t\tforever begin #%d multiCLK%d[i] <= ~multiCLK%d[i]; end\n"%(period * 8, clk, clk) + +"\t\tend\n" + +"\tend\n" + +"\tendgenerate\n") + + return slv_code + +def teardown(): + #add_tc_2_runlist("") + pass + +def set_spi_interface(spi_type): + global global_spi_type + global_spi_type = spi_type + +def set_using_8b10b(isUsing8b10b): + global global_using_8b10b + global_using_8b10b = isUsing8b10b + +def set_cdr_type(cdr_type): + global global_cdr_type + global_cdr_type = cdr_type + +def using_proper_workmode(dev, iface=1): + global global_using_8b10b + global global_spi_type + global global_cdr_type + + trans_code = 0x0 + + if global_using_8b10b: + trans_code = 0x1 + + return genIFRwDataCode(dev, 0x09, True, 1, [global_spi_type, ], wlog=False, iface=iface)\ + +genIFRwDataCode(dev, 0x004c, True, 2, [trans_code, 0x59], wlog = False)\ + +genIFRwDataCode(dev, 0x004e, True, 2, [global_cdr_type, 0x60], wlog = False) diff --git a/tb/shinTest/testcase/errorPkt.py b/tb/shinTest/testcase/errorPkt.py index 6fc1bd5..83cc1e8 100644 --- a/tb/shinTest/testcase/errorPkt.py +++ b/tb/shinTest/testcase/errorPkt.py @@ -1,1026 +1,1026 @@ -from pyutils import * -import time -import random - -def tc1(): - random.seed(int(time.time() * 1000)) - genPkt = GenPkt() - - gen_file_def = "error_pkt_tc01" - sm_idx = 0 - tc_des = "发送错误的数据包,导致设备出问题,出问题的设备在没有恢复的情况下,采取直通状态。\\n" \ - + "清除中断后,错误消失,出问题的设备恢复正常。" - - #------------------------------------------------------------------------- - #>>>>>>错误的数据包1 - genPkt.clean() - - data = [0x57, 0x17, 0xfd, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x40] - for i in range(64): - data.append(random.randint(0, 255)) - data = data + [0, 0, 0x00, 0x0c, 0x00, 0xc0, 0x00, 0x40] - for i in range(64): - data.append(random.randint(0, 255)) - data = data + [0, 0] - - genPkt.setPkt(2, data) - - genPkt.addBeforeExc(genTcStartFrameCode(gen_file_def, tc_des) - +genMessageCode("--清除中断") - +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(0, 0x80, False, 24) - +genIFRwDataCode(0, 0xa0, False, 24) - +genIFRwDataCode(1, 0x80, False, 24) - +genIFRwDataCode(2, 0x80, False, 24) - +genIFRwDataCode(3, 0x80, False, 24) - +genIFRwDataCode(4, 0x80, False, 24) - ) - - genPkt.addAfterExc(genWriteTransLenCode(gen_file_def, sm_idx) - +genWriteTransPktCode(gen_file_def, sm_idx) - +genTrgTransPktCode(gen_file_def, sm_idx) - +genReadAckPktCode(gen_file_def, sm_idx) - - +genMessageCode("--清除中断") - +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - - +genMessageCode("--清除主站错误") - +genIFRwDataCode(0, 0x300 + sm_idx * 4, True, 1, [0x1, ], wlog = False) - - +genMessageCode("--读取统计寄存器") - +genIFRwDataCode(0, 0x80, False, 24) - +genIFRwDataCode(0, 0xa0, False, 24) - +genIFRwDataCode(1, 0x80, False, 24) - +genIFRwDataCode(2, 0x80, False, 24) - +genIFRwDataCode(3, 0x80, False, 24) - +genIFRwDataCode(4, 0x80, False, 24) - - +genMessageCode("--数据包状态寄存器") - +genIFRwDataCode(0, 0x22, False, 2) - +genIFRwDataCode(0, 0x22, True, 2, [0xff, 0xff]) - +genIFRwDataCode(0, 0x22, False, 2) - ) - genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1) - - genPkt.clean() - gen_file_def_ap = gen_file_def + "_rw" - sm_idx = 0 - - data = [0, ] * 32 - genPkt.addSubPkt(0, 0, 0, 0xd, 32, data) - - clear_int = [0xff, 0xff, 0xff, 0xff] - - genPkt.addAfterExc(genWriteTransLenCode(gen_file_def_ap, sm_idx) - +genWriteTransPktCode(gen_file_def_ap, sm_idx) - +genTrgTransPktCode(gen_file_def_ap, sm_idx) - +genReadAckPktCode(gen_file_def_ap, sm_idx) - - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - - +genIFRwDataCode(1, 0x78, True, 4, clear_int) - +genIFRwDataCode(2, 0x78, True, 4, clear_int) - +genIFRwDataCode(3, 0x78, True, 4, clear_int) - +genIFRwDataCode(4, 0x78, True, 4, clear_int) - - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - - +genMessageCode("--读取统计寄存器") - +genIFRwDataCode(0, 0x80, False, 24) - +genIFRwDataCode(0, 0xa0, False, 24) - +genIFRwDataCode(1, 0x80, False, 24) - +genIFRwDataCode(2, 0x80, False, 24) - +genIFRwDataCode(3, 0x80, False, 24) - +genIFRwDataCode(4, 0x80, False, 24) - - +genMessageCode("--数据包状态寄存器") - +genIFRwDataCode(0, 0x22, False, 2) - +genIFRwDataCode(0, 0x22, True, 2, [0xff, 0xff]) - +genIFRwDataCode(0, 0x22, False, 2) - - +genTcEndFrameCode(gen_file_def)) - - genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1, True, gen_file_def_ap) - - return gen_file_def - - -def tc2(): - random.seed(int(time.time() * 1000)) - genPkt = GenPkt() - - gen_file_def = "error_pkt_tc02" - sm_idx = 0 - tc_des = "发送错误的数据包,导致设备出问题,出问题的设备在没有恢复的情况下,采取直通状态。\\n" \ - + "清除中断后,错误消失,出问题的设备恢复正常。" - - #------------------------------------------------------------------------- - #>>>>>>错误的数据包2 - genPkt.clean() - - data = list() - ''' - for i in range(128): - data.append(random.randint(0, 255)) - ''' - - data = data + [0xb2, 0x4e, 0xd3, 0xe2, 0xa8, 0xd3, 0x86, 0x01, 0x44, 0x3f] - for i in range(64): - data.append(random.randint(0, 255)) - data = data + [0, 0, 0x00, 0x0c, 0x00, 0xc0, 0x00, 0x40] - for i in range(64): - data.append(random.randint(0, 255)) - data = data + [0, 0] - - genPkt.setPkt(2, data) - - sm_idx = 0 - genPkt.addBeforeExc(genTcStartFrameCode(gen_file_def, tc_des) - +genMessageCode("--清除中断") - +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - ) - - genPkt.addAfterExc(genWriteTransLenCode(gen_file_def, sm_idx) - +genWriteTransPktCode(gen_file_def, sm_idx) - +genTrgTransPktCode(gen_file_def, sm_idx) - +genReadAckPktCode(gen_file_def, sm_idx) - - +genMessageCode("--清除中断") - +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - - +genMessageCode("--数据包状态寄存器") - +genIFRwDataCode(0, 0x22, False, 2) - +genIFRwDataCode(0, 0x22, True, 2, [0xff, 0xff]) - +genIFRwDataCode(0, 0x22, False, 2) - ) - genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1) - - genPkt.clean() - - gen_file_def_ap = gen_file_def + "_rw" - sm_idx = 0 - - data = [0,] * 32 - genPkt.addSubPkt(0, 0, 0, 0xd, 32, data) - - genPkt.addAfterExc(genWriteTransLenCode(gen_file_def_ap, sm_idx) - +genWriteTransPktCode(gen_file_def_ap, sm_idx) - +genTrgTransPktCode(gen_file_def_ap, sm_idx) - +genReadAckPktCode(gen_file_def_ap, sm_idx) - - +"\n#50000\n" - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - - +genMessageCode("--清除中断") - +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - - +genMessageCode("--清除主站错误") - +genIFRwDataCode(0, 0x300 + sm_idx * 4, True, 1, [0x1, ], wlog = False) - - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - - +genMessageCode("--数据包状态寄存器") - +genIFRwDataCode(0, 0x22, False, 2) - +genIFRwDataCode(0, 0x22, True, 2, [0xff, 0xff]) - +genIFRwDataCode(0, 0x22, False, 2) - - - +genTcEndFrameCode(gen_file_def)) - genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1, True, gen_file_def_ap) - - return gen_file_def - - -def tc3(): - random.seed(int(time.time() * 1000)) - - gen_file_def = "error_pkt_tc03" - sm_idx = 0 - tc_des = "发送错误的数据包,导致设备出问题,出问题的设备在没有恢复的情况下,采取直通状态。\\n" \ - + "清除中断后,错误消失,出问题的设备恢复正常。" - - genPkt = GenPkt() - #------------------------------------------------------------------------- - #>>>>>>错误的数据包3 - genPkt.clean() - - data = list() - for i in range(1024): - data.append(random.randint(0, 255)) - - genPkt.setPkt(2, data) - sm_idx = 0 - - genPkt.addBeforeExc(genTcStartFrameCode(gen_file_def, tc_des) - +genMessageCode("--清除中断") - +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - ) - - genPkt.addAfterExc(genWriteTransLenCode(gen_file_def, sm_idx) - +genWriteTransPktCode(gen_file_def, sm_idx) - +genTrgTransPktCode(gen_file_def, sm_idx) - +genReadAckPktCode(gen_file_def, sm_idx) - - +genMessageCode("--数据包状态寄存器") - +genIFRwDataCode(0, 0x22, False, 2) - +genIFRwDataCode(0, 0x22, True, 2, [0xff, 0xff]) - +genIFRwDataCode(0, 0x22, False, 2) - - +"\n#50000\n" - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - - +genMessageCode("--清除中断") - +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - - +genMessageCode("--清除主站错误") - +genIFRwDataCode(0, 0x300 + sm_idx * 4, True, 1, [0x1, ], wlog = False) - - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - - +genTcEndFrameCode(gen_file_def)) - genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1) - return gen_file_def - - -def tc4(): - genPkt = GenPkt() - #------------------------------------------------------------------------- - #>>>>>>错误的嗅探数据包 - gen_file_def = "error_pkt_tc04" - sm_idx = 0 - tc_des = "发送错误的数据包,导致设备出问题,出问题的设备在没有恢复的情况下,采取直通状态。\\n" \ - + "清除中断后,错误消失,出问题的设备恢复正常。" - - genPkt.clean() - genPkt.setPkt(2, [0, 0, 0, 0]) - - sm_idx = 0 - - genPkt.addBeforeExc(genTcStartFrameCode(gen_file_def, tc_des) - +genMessageCode("--清除中断") - +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - ) - - genPkt.addAfterExc(genWriteTransLenCode(gen_file_def, sm_idx) - +genWriteTransPktCode(gen_file_def, sm_idx) - +genTrgTransPktCode(gen_file_def, sm_idx) - +genReadAckPktCode(gen_file_def, sm_idx) - +genMessageCode("--清除中断") - +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genMessageCode("--清除主站错误") - +genIFRwDataCode(0, 0x300 + sm_idx * 4, True, 1, [0x1, ], wlog = False) - ) - - genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1) - - genPkt.clean() - - gen_file_def_ap = gen_file_def + "_rw" - sm_idx = 0 - - data = [0,] * 32 - genPkt.addSubPkt(0, 0, 0, 0xd, 32, data) - - - genPkt.addAfterExc(genWriteTransLenCode(gen_file_def_ap, sm_idx) - +genWriteTransPktCode(gen_file_def_ap, sm_idx) - +genTrgTransPktCode(gen_file_def_ap, sm_idx) - +genReadAckPktCode(gen_file_def_ap, sm_idx) - - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - - +genMessageCode("--清除中断") - +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - - - +genMessageCode("--数据包状态寄存器") - +genIFRwDataCode(0, 0x22, False, 2) - +genIFRwDataCode(0, 0x22, True, 2, [0xff, 0xff]) - +genIFRwDataCode(0, 0x22, False, 2) - - +genTcEndFrameCode(gen_file_def)) - genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1, True, gen_file_def_ap) - - return gen_file_def - -def tc5(): - random.seed(int(time.time() * 1000)) - genPkt = GenPkt() - - gen_file_def = "error_pkt_tc05" - sm_idx = 0 - tc_des = "发送错误的数据包,导致设备出问题,出问题的设备在没有恢复的情况下,采取直通状态。\\n" \ - + "清除中断后,错误消失,出问题的设备恢复正常。" - - #------------------------------------------------------------------------- - #>>>>>>错误的数据包2 - genPkt.clean() - - data = list() - ''' - for i in range(128): - data.append(random.randint(0, 255)) - ''' - - data = data + [0x1a, 0x40, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0xd0, 0x40] - for i in range(64): - data.append(random.randint(0, 255)) - data = data + [0, 0, 0x00, 0x0c, 0x00, 0xc0, 0x00, 0x50] - for i in range(64): - data.append(random.randint(0, 255)) - data = data + [0, 0] - - genPkt.setPkt(2, data) - - sm_idx = 0 - genPkt.addBeforeExc(genTcStartFrameCode(gen_file_def, tc_des) - +genMessageCode("--清除中断") - +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - - +genMessageCode("--读取统计寄存器") - +genIFRwDataCode(0, 0x80, False, 24) - +genIFRwDataCode(0, 0xa0, False, 24)) - - genPkt.addAfterExc(genWriteTransLenCode(gen_file_def, sm_idx) - +genWriteTransPktCode(gen_file_def, sm_idx) - +genTrgTransPktCode(gen_file_def, sm_idx) - +genReadAckPktCode(gen_file_def, sm_idx) - +genMessageCode("--清除中断") - +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - - +genMessageCode("--清除主站错误") - +genIFRwDataCode(0, 0x300 + sm_idx * 4, True, 1, [0x1, ], wlog = False) - - - +genMessageCode("--数据包状态寄存器") - +genIFRwDataCode(0, 0x22, False, 2) - +genIFRwDataCode(0, 0x22, True, 2, [0xff, 0xff]) - +genIFRwDataCode(0, 0x22, False, 2) - - +genMessageCode("--读取统计寄存器") - +genIFRwDataCode(0, 0x80, False, 24) - +genIFRwDataCode(0, 0xa0, False, 24)) - genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1) - - genPkt.clean() - - gen_file_def_ap = gen_file_def + "_rw01" - sm_idx = 0 - - data = [0,] * 32 - genPkt.addSubPkt(0, 0, 0, 0xd, 32, data) - - genPkt.addAfterExc(genWriteTransLenCode(gen_file_def_ap, sm_idx) - +genWriteTransPktCode(gen_file_def_ap, sm_idx) - +genTrgTransPktCode(gen_file_def_ap, sm_idx) - +genReadAckPktCode(gen_file_def_ap, sm_idx) - - +genMessageCode("--数据包状态寄存器") - +genIFRwDataCode(0, 0x22, False, 2) - +genIFRwDataCode(0, 0x22, True, 2, [0xff, 0xff]) - +genIFRwDataCode(0, 0x22, False, 2) - - +genMessageCode("--读取统计寄存器") - +genIFRwDataCode(0, 0x80, False, 24) - +genIFRwDataCode(0, 0xa0, False, 24) - - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - - +genMessageCode("--清除中断") - +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - ) - genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1, True, gen_file_def_ap) - - genPkt.clean() - gen_file_def_ap = gen_file_def + "_rw02" - sm_idx = 0 - - data = [0,] * 32 - genPkt.addSubPkt(0, 0, 0, 0xd, 32, data) - - genPkt.addAfterExc(genWriteTransLenCode(gen_file_def_ap, sm_idx) - +genWriteTransPktCode(gen_file_def_ap, sm_idx) - +genTrgTransPktCode(gen_file_def_ap, sm_idx) - +genReadAckPktCode(gen_file_def_ap, sm_idx) - - +genMessageCode("--数据包状态寄存器") - +genIFRwDataCode(0, 0x22, False, 2) - +genIFRwDataCode(0, 0x22, True, 2, [0xff, 0xff]) - +genIFRwDataCode(0, 0x22, False, 2) - - +genMessageCode("--读取统计寄存器") - +genIFRwDataCode(0, 0x80, False, 24) - +genIFRwDataCode(0, 0xa0, False, 24) - - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - - +genMessageCode("--清除中断") - +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - - +genIFRwDataCode(0, 0x7c, False, 2) - +genIFRwDataCode(1, 0x7c, False, 2) - +genIFRwDataCode(2, 0x7c, False, 2) - +genIFRwDataCode(3, 0x7c, False, 2) - +genIFRwDataCode(4, 0x7c, False, 2) - - +genTcEndFrameCode(gen_file_def)) - genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1, True, gen_file_def_ap) - - - return gen_file_def - - -def tc6(): - random.seed(int(time.time() * 1000)) - genPkt = GenPkt() - - gen_file_def = "error_pkt_tc06" - sm_idx = 0 - tc_des = ("发送错误的数据包,导致设备出问题。出问题后,恢复错误,其中误操作的寄存器全部恢复正常。\\n" - "清除错误后,数据应该恢复正常。" - ) - - - genPkt.clean() - genPkt.addSubPkt(0x0, 0x0, 0x302, 0xe, 2, [0x20, 0x00]) - - genPkt.addBeforeExc(genTcStartFrameCode(gen_file_def, tc_des) - +genMessageCode("--清除中断") - +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - ) - - - - genPkt.addAfterExc(genWriteTransLenCode(gen_file_def, sm_idx) - +genWriteTransPktCode(gen_file_def, sm_idx) - +genTrgTransPktCode(gen_file_def, sm_idx) - +genReadAckPktCode(gen_file_def, sm_idx) - - - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - - +genMessageCode("--清除中断") - +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - ) - genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1) - - genPkt.clean() - - data = list() - - ''' - 00 04 03 02 20 02 // type: 0 dev: 1 addr:0x0302 cmd:0x2 len: 2 - {{ 20 00 }} - 00 02 - - 00 00 03 0a e0 02 // type: 0 dev: 0 addr:0x030a cmd:0xe len: 2 - {{ 20 00 }} - 00 04 - ''' - - - - data = data + [0x1a, 0x40, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0xd0, 0x40] - for i in range(64): - data.append(random.randint(0, 255)) - data = data + [0x00, 0x00] - - data = data + [0x00, 0x00, 0x03, 0x02, 0xe0, 0x02, 0x40, 0x01, 0x00, 0x00] - - #data = data + [0x00, 0x0c, 0x00, 0xc0, 0x00, 0x80] - for i in range(128): - data.append(random.randint(0, 255)) - data = data + [0, 0] - - genPkt.setPkt(2, data) - - sm_idx = 0 - genPkt.addBeforeExc(genMessageCode("--读取统计寄存器") - +genIFRwDataCode(0, 0x80, False, 24) - +genIFRwDataCode(0, 0xa0, False, 24) - +genIFRwDataCode(1, 0x80, False, 24) - +genIFRwDataCode(1, 0xa0, False, 24) - ) - - gen_file_def_ap = gen_file_def + "_rw01" - genPkt.addAfterExc(genWriteTransLenCode(gen_file_def_ap, sm_idx) - +genWriteTransPktCode(gen_file_def_ap, sm_idx) - +genTrgTransPktCode(gen_file_def_ap, sm_idx) - +genReadAckPktCode(gen_file_def_ap, sm_idx) - - +genMessageCode("--数据包状态寄存器") - +genIFRwDataCode(0, 0x22, False, 2) - +genIFRwDataCode(0, 0x22, True, 2, [0xff, 0xff]) - +genIFRwDataCode(0, 0x22, False, 2) - - +genMessageCode("--读取统计寄存器") - +genIFRwDataCode(0, 0x80, False, 24) - +genIFRwDataCode(0, 0xa0, False, 24) - +genIFRwDataCode(1, 0x80, False, 24) - +genIFRwDataCode(1, 0xa0, False, 24) - - - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - - +genMessageCode("--清除中断") - +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - - +genMessageCode("--清除主站错误") - +genIFRwDataCode(0, 0x300 + sm_idx * 4, True, 1, [0x1, ], wlog = False) - - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - ) - genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1, True, gen_file_def_ap) - - genPkt.clean() - - gen_file_def_ap = gen_file_def + "_rw02" - sm_idx = 0 - - data = [0,] * 32 - genPkt.addSubPkt(1, 0, 0x302, 0x0, 2, data) - genPkt.addSubPkt(2, 0, 0x302, 0x0, 2, data) - genPkt.addSubPkt(3, 0, 0x302, 0x0, 2, data) - genPkt.addSubPkt(4, 0, 0x302, 0x0, 2, data) - - genPkt.addAfterExc(genWriteTransLenCode(gen_file_def_ap, sm_idx) - +genWriteTransPktCode(gen_file_def_ap, sm_idx) - +genTrgTransPktCode(gen_file_def_ap, sm_idx) - +genReadAckPktCode(gen_file_def_ap, sm_idx) - - +genMessageCode("--数据包状态寄存器") - +genIFRwDataCode(0, 0x22, False, 2) - +genIFRwDataCode(0, 0x22, True, 2, [0xff, 0xff]) - +genIFRwDataCode(0, 0x22, False, 2) - - #+genMessageCode("--读取统计寄存器") - #+genIFRwDataCode(0, 0x80, False, 24) - #+genIFRwDataCode(0, 0xa0, False, 24) - - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - - +genMessageCode("--清除中断") - +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - - +genTcEndFrameCode(gen_file_def)) - genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1, True, gen_file_def_ap) - - return gen_file_def - - - -def mk_subpkt(dev, type, addr, cmd, len, dat): - ret_dat = list() - - temp = ((dev & 0x3fff) << 2) | (type & 0x3) - ret_dat = ret_dat + [(temp >> 8) & 0xff, temp & 0xff, (addr >> 8) & 0xff, addr & 0xff] - - temp = ((cmd & 0xf) << 12) | (len & 0xfff) - ret_dat = ret_dat + [(temp >>8) & 0xff, temp & 0xff] - - ret_dat = ret_dat + dat + [0, 0] - - return ret_dat - -def sm_wr_err_test(tc_id, sm_id, pre_g_pkt = 1, good_pkt_in_bad = 1, after_g_pkt = 1, data_size = 0x10, dev = 1, cmd = 0x1): - random.seed(int(time.time() * 1000)) - genPkt = GenPkt() - - gen_file_def = "error_pkt_tc%02d"%(tc_id, ) - sm_idx = 0 - tc_des = (f"测试SM{sm_id},先写入正确的数据包,包含{pre_g_pkt}个操作SM{sm_id}的子包,然后写入错误的数据包,其中包含正确的操作SM{sm_id}的数据子包有{good_pkt_in_bad}个,\\n" - f"然后再发送正确的数据包,其中包含{after_g_pkt}个操作SM{sm_id}的子包。然后检查SM{sm_id}的状态以及数据。\\n" - f"所有数据包的长度都是{data_size}字节,设备{dev}, 命令{cmd}。没有比对数据,需要手动检查。" - ) - - - genPkt.clean() - genPkt.addSubPkt(0x0, 0x0, 0x302 + 4 * sm_id, 0xe, 2, [(data_size & 0xff), ((data_size >> 8)&0xff)]) - for pkt_num in range(pre_g_pkt): - genPkt.addSubPkt(dev, 0x0, 0x800 + 0x800 * sm_id, cmd, data_size, [((i * (pkt_num + 1)) & 0xff) for i in range(data_size)]) - - genPkt.addBeforeExc(genTcStartFrameCode(gen_file_def, tc_des) - +genMessageCode("--清除主中断") - +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - ) - - genPkt.addAfterExc(genWriteTransLenCode(gen_file_def, sm_idx) - +genWriteTransPktCode(gen_file_def, sm_idx) - +genTrgTransPktCode(gen_file_def, sm_idx) - +genReadAckPktCode(gen_file_def, sm_idx) - - - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - - +genMessageCode("--清除中断") - +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - - +genMessageCode("--MB状态寄存器") - +genIFRwDataCode(1, 0x301 + sm_id * 0x4, False, 1) - +genIFRwDataCode(2, 0x301 + sm_id * 0x4, False, 1) - +genIFRwDataCode(3, 0x301 + sm_id * 0x4, False, 1) - +genIFRwDataCode(4, 0x301 + sm_id * 0x4, False, 1) - ) - genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1) - - genPkt.clean() - - temp = ((data_size * 6) & 0xfff) << 4 - data = [(temp >> 8)&0xff, temp & 0xff, 0, 0] - - for i in range(good_pkt_in_bad): - data = data + mk_subpkt(dev, 0, 0x800 + 0x800 * sm_id, cmd, data_size, [((j * (i + 1) + 1) & 0xff) for j in range(data_size)]) - - for i in range(128): - data.append(random.randint(0, 255)) - data = data + [0, 0] - - genPkt.setPkt(2, data) - - sm_idx = 0 - genPkt.addBeforeExc(genMessageCode("--读取统计寄存器") - +genIFRwDataCode(0, 0x80, False, 24) - +genIFRwDataCode(0, 0xa0, False, 24) - +genIFRwDataCode(1, 0x80, False, 24) - +genIFRwDataCode(1, 0xa0, False, 24) - ) - - gen_file_def_ap = gen_file_def + "_rw01" - genPkt.addAfterExc(genWriteTransLenCode(gen_file_def_ap, sm_idx) - +genWriteTransPktCode(gen_file_def_ap, sm_idx) - +genTrgTransPktCode(gen_file_def_ap, sm_idx) - +genReadAckPktCode(gen_file_def_ap, sm_idx) - - +genMessageCode("--数据包状态寄存器") - +genIFRwDataCode(0, 0x22, False, 2) - +genIFRwDataCode(0, 0x22, True, 2, [0xff, 0xff]) - +genIFRwDataCode(0, 0x22, False, 2) - - +genMessageCode("--读取统计寄存器") - +genIFRwDataCode(0, 0x80, False, 24) - +genIFRwDataCode(0, 0xa0, False, 24) - +genIFRwDataCode(1, 0x80, False, 24) - +genIFRwDataCode(1, 0xa0, False, 24) - - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - - +genMessageCode("--清除中断") - +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - - +genMessageCode("--清除主站错误") - +genIFRwDataCode(0, 0x300 + sm_idx * 4, True, 1, [0x1, ], wlog = False) - - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - - +genMessageCode("--MB状态寄存器") - +genIFRwDataCode(1, 0x301 + sm_id * 0x4, False, 1) - +genIFRwDataCode(2, 0x301 + sm_id * 0x4, False, 1) - +genIFRwDataCode(3, 0x301 + sm_id * 0x4, False, 1) - +genIFRwDataCode(4, 0x301 + sm_id * 0x4, False, 1) - ) - genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1, True, gen_file_def_ap) - - genPkt.clean() - - gen_file_def_ap = gen_file_def + "_rw02" - sm_idx = 0 - - genPkt.addSubPkt(0, 0, 0, 0, 8, [0, ] * 8) - - for pkt_num in range(after_g_pkt): - genPkt.addSubPkt(dev, 0x0, 0x800 + 0x800 * sm_id, cmd, data_size, [((i * (pkt_num + 1) - 1) & 0xff) for i in range(data_size)]) - - if sm_id < 4: - code_str = (genIFRwDataCode(dev, 0x800 + sm_id * 0x800, False, data_size) - +genIFRwDataCode(dev, 0x800 + sm_id * 0x800, False, data_size) - +genIFRwDataCode(dev, 0x800 + sm_id * 0x800, False, data_size) - +genIFRwDataCode(dev, 0x800 + sm_id * 0x800, False, data_size)) - else: - code_str = (genIFRwDataCode(dev, 0x800 + sm_id * 0x800, False, data_size) - +genIFRwDataCode(dev, 0x800 + sm_id * 0x800, False, data_size)) - - genPkt.addAfterExc(genWriteTransLenCode(gen_file_def_ap, sm_idx) - +genWriteTransPktCode(gen_file_def_ap, sm_idx) - +genTrgTransPktCode(gen_file_def_ap, sm_idx) - +genReadAckPktCode(gen_file_def_ap, sm_idx) - - +genMessageCode("--数据包状态寄存器") - +genIFRwDataCode(0, 0x22, False, 2) - +genIFRwDataCode(0, 0x22, True, 2, [0xff, 0xff]) - +genIFRwDataCode(0, 0x22, False, 2) - - #+genMessageCode("--读取统计寄存器") - #+genIFRwDataCode(0, 0x80, False, 24) - #+genIFRwDataCode(0, 0xa0, False, 24) - - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - - +genMessageCode("--清除中断") - +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - - +genMessageCode("--MB状态寄存器") - +genIFRwDataCode(1, 0x301 + sm_id * 0x4, False, 1) - +genIFRwDataCode(2, 0x301 + sm_id * 0x4, False, 1) - +genIFRwDataCode(3, 0x301 + sm_id * 0x4, False, 1) - +genIFRwDataCode(4, 0x301 + sm_id * 0x4, False, 1) - - +genMessageCode("--读取MB数据") - +code_str - - #+genMessageCode("--复位MB状态") - #+genIFRwDataCode(1, 0x300 + sm_id * 0x4, True, 1, [0, ]) - #+genIFRwDataCode(2, 0x300 + sm_id * 0x4, True, 1, [0, ]) - #+genIFRwDataCode(3, 0x300 + sm_id * 0x4, True, 1, [0, ]) - #+genIFRwDataCode(4, 0x300 + sm_id * 0x4, True, 1, [0, ]) - - +genTcEndFrameCode(gen_file_def)) - genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1, True, gen_file_def_ap) - - return gen_file_def - -''' -测试SM0 -''' -def tc7(): - return sm_wr_err_test(7, 0, 1, 2, 1, 32) - -def tc8(): - return sm_wr_err_test(8, 0, 2, 2, 1, 32) - -def tc9(): - return sm_wr_err_test(9, 0, 4, 2, 1, 16) - -def tc10(): - return sm_wr_err_test(10, 0, 0, 5, 1, 16) - -def tc11(): - return sm_wr_err_test(11, 0, 0, 5, 3, 64) - -def tc12(): - return sm_wr_err_test(12, 0, 1, 1, 4, 64) - -def tc13(): - return sm_wr_err_test(13, 0, 0, 5, 0, 128) - -def tc14(): - return sm_wr_err_test(14, 0, 4, 5, 4, 128) - - -''' -测试SM2 -''' -def tc15(): - return sm_wr_err_test(15, 2, 1, 2, 1, 32) - -def tc16(): - return sm_wr_err_test(16, 2, 2, 2, 1, 32) - -def tc17(): - return sm_wr_err_test(17, 2, 4, 2, 1, 16) - -def tc18(): - return sm_wr_err_test(18, 2, 0, 5, 1, 16) - -def tc19(): - return sm_wr_err_test(19, 2, 0, 5, 3, 64) - -def tc20(): - return sm_wr_err_test(20, 2, 1, 1, 4, 64) - -def tc21(): - return sm_wr_err_test(21, 2, 0, 5, 0, 128) - -def tc22(): - return sm_wr_err_test(22, 2, 4, 5, 4, 128) - - - -''' -测试SM4 -''' -def tc23(): - return sm_wr_err_test(23, 4, 1, 2, 1, 32) - -def tc24(): - return sm_wr_err_test(24, 4, 2, 2, 1, 32) - -def tc25(): - return sm_wr_err_test(25, 4, 4, 2, 1, 16) - -def tc26(): - return sm_wr_err_test(26, 4, 0, 5, 1, 16) - -def tc27(): - return sm_wr_err_test(27, 4, 0, 5, 3, 64) - -def tc28(): - return sm_wr_err_test(28, 4, 1, 1, 4, 64) - -def tc29(): - return sm_wr_err_test(29, 4, 0, 5, 0, 128) - -def tc30(): - return sm_wr_err_test(30, 4, 4, 5, 4, 128) - - -''' -测试SM6 -''' -def tc31(): - return sm_wr_err_test(31, 6, 1, 2, 1, 32) - -def tc32(): - return sm_wr_err_test(32, 6, 2, 2, 1, 32) - -def tc33(): - return sm_wr_err_test(33, 6, 4, 2, 1, 16) - -def tc34(): - return sm_wr_err_test(34, 6, 0, 5, 1, 16) - -def tc35(): - return sm_wr_err_test(35, 6, 0, 5, 3, 64) - -def tc36(): - return sm_wr_err_test(36, 6, 1, 1, 4, 64) - -def tc37(): - return sm_wr_err_test(37, 6, 0, 5, 0, 128) - -def tc38(): - return sm_wr_err_test(38, 6, 4, 5, 4, 128) - +from pyutils import * +import time +import random + +def tc1(): + random.seed(int(time.time() * 1000)) + genPkt = GenPkt() + + gen_file_def = "error_pkt_tc01" + sm_idx = 0 + tc_des = "发送错误的数据包,导致设备出问题,出问题的设备在没有恢复的情况下,采取直通状态。\\n" \ + + "清除中断后,错误消失,出问题的设备恢复正常。" + + #------------------------------------------------------------------------- + #>>>>>>错误的数据包1 + genPkt.clean() + + data = [0x57, 0x17, 0xfd, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x40] + for i in range(64): + data.append(random.randint(0, 255)) + data = data + [0, 0, 0x00, 0x0c, 0x00, 0xc0, 0x00, 0x40] + for i in range(64): + data.append(random.randint(0, 255)) + data = data + [0, 0] + + genPkt.setPkt(2, data) + + genPkt.addBeforeExc(genTcStartFrameCode(gen_file_def, tc_des) + +genMessageCode("--清除中断") + +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(0, 0x80, False, 24) + +genIFRwDataCode(0, 0xa0, False, 24) + +genIFRwDataCode(1, 0x80, False, 24) + +genIFRwDataCode(2, 0x80, False, 24) + +genIFRwDataCode(3, 0x80, False, 24) + +genIFRwDataCode(4, 0x80, False, 24) + ) + + genPkt.addAfterExc(genWriteTransLenCode(gen_file_def, sm_idx) + +genWriteTransPktCode(gen_file_def, sm_idx) + +genTrgTransPktCode(gen_file_def, sm_idx) + +genReadAckPktCode(gen_file_def, sm_idx) + + +genMessageCode("--清除中断") + +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + + +genMessageCode("--清除主站错误") + +genIFRwDataCode(0, 0x300 + sm_idx * 4, True, 1, [0x1, ], wlog = False) + + +genMessageCode("--读取统计寄存器") + +genIFRwDataCode(0, 0x80, False, 24) + +genIFRwDataCode(0, 0xa0, False, 24) + +genIFRwDataCode(1, 0x80, False, 24) + +genIFRwDataCode(2, 0x80, False, 24) + +genIFRwDataCode(3, 0x80, False, 24) + +genIFRwDataCode(4, 0x80, False, 24) + + +genMessageCode("--数据包状态寄存器") + +genIFRwDataCode(0, 0x22, False, 2) + +genIFRwDataCode(0, 0x22, True, 2, [0xff, 0xff]) + +genIFRwDataCode(0, 0x22, False, 2) + ) + genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1) + + genPkt.clean() + gen_file_def_ap = gen_file_def + "_rw" + sm_idx = 0 + + data = [0, ] * 32 + genPkt.addSubPkt(0, 0, 0, 0xd, 32, data) + + clear_int = [0xff, 0xff, 0xff, 0xff] + + genPkt.addAfterExc(genWriteTransLenCode(gen_file_def_ap, sm_idx) + +genWriteTransPktCode(gen_file_def_ap, sm_idx) + +genTrgTransPktCode(gen_file_def_ap, sm_idx) + +genReadAckPktCode(gen_file_def_ap, sm_idx) + + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + + +genIFRwDataCode(1, 0x78, True, 4, clear_int) + +genIFRwDataCode(2, 0x78, True, 4, clear_int) + +genIFRwDataCode(3, 0x78, True, 4, clear_int) + +genIFRwDataCode(4, 0x78, True, 4, clear_int) + + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + + +genMessageCode("--读取统计寄存器") + +genIFRwDataCode(0, 0x80, False, 24) + +genIFRwDataCode(0, 0xa0, False, 24) + +genIFRwDataCode(1, 0x80, False, 24) + +genIFRwDataCode(2, 0x80, False, 24) + +genIFRwDataCode(3, 0x80, False, 24) + +genIFRwDataCode(4, 0x80, False, 24) + + +genMessageCode("--数据包状态寄存器") + +genIFRwDataCode(0, 0x22, False, 2) + +genIFRwDataCode(0, 0x22, True, 2, [0xff, 0xff]) + +genIFRwDataCode(0, 0x22, False, 2) + + +genTcEndFrameCode(gen_file_def)) + + genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1, True, gen_file_def_ap) + + return gen_file_def + + +def tc2(): + random.seed(int(time.time() * 1000)) + genPkt = GenPkt() + + gen_file_def = "error_pkt_tc02" + sm_idx = 0 + tc_des = "发送错误的数据包,导致设备出问题,出问题的设备在没有恢复的情况下,采取直通状态。\\n" \ + + "清除中断后,错误消失,出问题的设备恢复正常。" + + #------------------------------------------------------------------------- + #>>>>>>错误的数据包2 + genPkt.clean() + + data = list() + ''' + for i in range(128): + data.append(random.randint(0, 255)) + ''' + + data = data + [0xb2, 0x4e, 0xd3, 0xe2, 0xa8, 0xd3, 0x86, 0x01, 0x44, 0x3f] + for i in range(64): + data.append(random.randint(0, 255)) + data = data + [0, 0, 0x00, 0x0c, 0x00, 0xc0, 0x00, 0x40] + for i in range(64): + data.append(random.randint(0, 255)) + data = data + [0, 0] + + genPkt.setPkt(2, data) + + sm_idx = 0 + genPkt.addBeforeExc(genTcStartFrameCode(gen_file_def, tc_des) + +genMessageCode("--清除中断") + +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + ) + + genPkt.addAfterExc(genWriteTransLenCode(gen_file_def, sm_idx) + +genWriteTransPktCode(gen_file_def, sm_idx) + +genTrgTransPktCode(gen_file_def, sm_idx) + +genReadAckPktCode(gen_file_def, sm_idx) + + +genMessageCode("--清除中断") + +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + + +genMessageCode("--数据包状态寄存器") + +genIFRwDataCode(0, 0x22, False, 2) + +genIFRwDataCode(0, 0x22, True, 2, [0xff, 0xff]) + +genIFRwDataCode(0, 0x22, False, 2) + ) + genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1) + + genPkt.clean() + + gen_file_def_ap = gen_file_def + "_rw" + sm_idx = 0 + + data = [0,] * 32 + genPkt.addSubPkt(0, 0, 0, 0xd, 32, data) + + genPkt.addAfterExc(genWriteTransLenCode(gen_file_def_ap, sm_idx) + +genWriteTransPktCode(gen_file_def_ap, sm_idx) + +genTrgTransPktCode(gen_file_def_ap, sm_idx) + +genReadAckPktCode(gen_file_def_ap, sm_idx) + + +"\n#50000\n" + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + + +genMessageCode("--清除中断") + +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + + +genMessageCode("--清除主站错误") + +genIFRwDataCode(0, 0x300 + sm_idx * 4, True, 1, [0x1, ], wlog = False) + + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + + +genMessageCode("--数据包状态寄存器") + +genIFRwDataCode(0, 0x22, False, 2) + +genIFRwDataCode(0, 0x22, True, 2, [0xff, 0xff]) + +genIFRwDataCode(0, 0x22, False, 2) + + + +genTcEndFrameCode(gen_file_def)) + genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1, True, gen_file_def_ap) + + return gen_file_def + + +def tc3(): + random.seed(int(time.time() * 1000)) + + gen_file_def = "error_pkt_tc03" + sm_idx = 0 + tc_des = "发送错误的数据包,导致设备出问题,出问题的设备在没有恢复的情况下,采取直通状态。\\n" \ + + "清除中断后,错误消失,出问题的设备恢复正常。" + + genPkt = GenPkt() + #------------------------------------------------------------------------- + #>>>>>>错误的数据包3 + genPkt.clean() + + data = list() + for i in range(1024): + data.append(random.randint(0, 255)) + + genPkt.setPkt(2, data) + sm_idx = 0 + + genPkt.addBeforeExc(genTcStartFrameCode(gen_file_def, tc_des) + +genMessageCode("--清除中断") + +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + ) + + genPkt.addAfterExc(genWriteTransLenCode(gen_file_def, sm_idx) + +genWriteTransPktCode(gen_file_def, sm_idx) + +genTrgTransPktCode(gen_file_def, sm_idx) + +genReadAckPktCode(gen_file_def, sm_idx) + + +genMessageCode("--数据包状态寄存器") + +genIFRwDataCode(0, 0x22, False, 2) + +genIFRwDataCode(0, 0x22, True, 2, [0xff, 0xff]) + +genIFRwDataCode(0, 0x22, False, 2) + + +"\n#50000\n" + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + + +genMessageCode("--清除中断") + +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + + +genMessageCode("--清除主站错误") + +genIFRwDataCode(0, 0x300 + sm_idx * 4, True, 1, [0x1, ], wlog = False) + + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + + +genTcEndFrameCode(gen_file_def)) + genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1) + return gen_file_def + + +def tc4(): + genPkt = GenPkt() + #------------------------------------------------------------------------- + #>>>>>>错误的嗅探数据包 + gen_file_def = "error_pkt_tc04" + sm_idx = 0 + tc_des = "发送错误的数据包,导致设备出问题,出问题的设备在没有恢复的情况下,采取直通状态。\\n" \ + + "清除中断后,错误消失,出问题的设备恢复正常。" + + genPkt.clean() + genPkt.setPkt(2, [0, 0, 0, 0]) + + sm_idx = 0 + + genPkt.addBeforeExc(genTcStartFrameCode(gen_file_def, tc_des) + +genMessageCode("--清除中断") + +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + ) + + genPkt.addAfterExc(genWriteTransLenCode(gen_file_def, sm_idx) + +genWriteTransPktCode(gen_file_def, sm_idx) + +genTrgTransPktCode(gen_file_def, sm_idx) + +genReadAckPktCode(gen_file_def, sm_idx) + +genMessageCode("--清除中断") + +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genMessageCode("--清除主站错误") + +genIFRwDataCode(0, 0x300 + sm_idx * 4, True, 1, [0x1, ], wlog = False) + ) + + genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1) + + genPkt.clean() + + gen_file_def_ap = gen_file_def + "_rw" + sm_idx = 0 + + data = [0,] * 32 + genPkt.addSubPkt(0, 0, 0, 0xd, 32, data) + + + genPkt.addAfterExc(genWriteTransLenCode(gen_file_def_ap, sm_idx) + +genWriteTransPktCode(gen_file_def_ap, sm_idx) + +genTrgTransPktCode(gen_file_def_ap, sm_idx) + +genReadAckPktCode(gen_file_def_ap, sm_idx) + + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + + +genMessageCode("--清除中断") + +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + + + +genMessageCode("--数据包状态寄存器") + +genIFRwDataCode(0, 0x22, False, 2) + +genIFRwDataCode(0, 0x22, True, 2, [0xff, 0xff]) + +genIFRwDataCode(0, 0x22, False, 2) + + +genTcEndFrameCode(gen_file_def)) + genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1, True, gen_file_def_ap) + + return gen_file_def + +def tc5(): + random.seed(int(time.time() * 1000)) + genPkt = GenPkt() + + gen_file_def = "error_pkt_tc05" + sm_idx = 0 + tc_des = "发送错误的数据包,导致设备出问题,出问题的设备在没有恢复的情况下,采取直通状态。\\n" \ + + "清除中断后,错误消失,出问题的设备恢复正常。" + + #------------------------------------------------------------------------- + #>>>>>>错误的数据包2 + genPkt.clean() + + data = list() + ''' + for i in range(128): + data.append(random.randint(0, 255)) + ''' + + data = data + [0x1a, 0x40, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0xd0, 0x40] + for i in range(64): + data.append(random.randint(0, 255)) + data = data + [0, 0, 0x00, 0x0c, 0x00, 0xc0, 0x00, 0x50] + for i in range(64): + data.append(random.randint(0, 255)) + data = data + [0, 0] + + genPkt.setPkt(2, data) + + sm_idx = 0 + genPkt.addBeforeExc(genTcStartFrameCode(gen_file_def, tc_des) + +genMessageCode("--清除中断") + +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + + +genMessageCode("--读取统计寄存器") + +genIFRwDataCode(0, 0x80, False, 24) + +genIFRwDataCode(0, 0xa0, False, 24)) + + genPkt.addAfterExc(genWriteTransLenCode(gen_file_def, sm_idx) + +genWriteTransPktCode(gen_file_def, sm_idx) + +genTrgTransPktCode(gen_file_def, sm_idx) + +genReadAckPktCode(gen_file_def, sm_idx) + +genMessageCode("--清除中断") + +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + + +genMessageCode("--清除主站错误") + +genIFRwDataCode(0, 0x300 + sm_idx * 4, True, 1, [0x1, ], wlog = False) + + + +genMessageCode("--数据包状态寄存器") + +genIFRwDataCode(0, 0x22, False, 2) + +genIFRwDataCode(0, 0x22, True, 2, [0xff, 0xff]) + +genIFRwDataCode(0, 0x22, False, 2) + + +genMessageCode("--读取统计寄存器") + +genIFRwDataCode(0, 0x80, False, 24) + +genIFRwDataCode(0, 0xa0, False, 24)) + genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1) + + genPkt.clean() + + gen_file_def_ap = gen_file_def + "_rw01" + sm_idx = 0 + + data = [0,] * 32 + genPkt.addSubPkt(0, 0, 0, 0xd, 32, data) + + genPkt.addAfterExc(genWriteTransLenCode(gen_file_def_ap, sm_idx) + +genWriteTransPktCode(gen_file_def_ap, sm_idx) + +genTrgTransPktCode(gen_file_def_ap, sm_idx) + +genReadAckPktCode(gen_file_def_ap, sm_idx) + + +genMessageCode("--数据包状态寄存器") + +genIFRwDataCode(0, 0x22, False, 2) + +genIFRwDataCode(0, 0x22, True, 2, [0xff, 0xff]) + +genIFRwDataCode(0, 0x22, False, 2) + + +genMessageCode("--读取统计寄存器") + +genIFRwDataCode(0, 0x80, False, 24) + +genIFRwDataCode(0, 0xa0, False, 24) + + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + + +genMessageCode("--清除中断") + +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + ) + genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1, True, gen_file_def_ap) + + genPkt.clean() + gen_file_def_ap = gen_file_def + "_rw02" + sm_idx = 0 + + data = [0,] * 32 + genPkt.addSubPkt(0, 0, 0, 0xd, 32, data) + + genPkt.addAfterExc(genWriteTransLenCode(gen_file_def_ap, sm_idx) + +genWriteTransPktCode(gen_file_def_ap, sm_idx) + +genTrgTransPktCode(gen_file_def_ap, sm_idx) + +genReadAckPktCode(gen_file_def_ap, sm_idx) + + +genMessageCode("--数据包状态寄存器") + +genIFRwDataCode(0, 0x22, False, 2) + +genIFRwDataCode(0, 0x22, True, 2, [0xff, 0xff]) + +genIFRwDataCode(0, 0x22, False, 2) + + +genMessageCode("--读取统计寄存器") + +genIFRwDataCode(0, 0x80, False, 24) + +genIFRwDataCode(0, 0xa0, False, 24) + + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + + +genMessageCode("--清除中断") + +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + + +genIFRwDataCode(0, 0x7c, False, 2) + +genIFRwDataCode(1, 0x7c, False, 2) + +genIFRwDataCode(2, 0x7c, False, 2) + +genIFRwDataCode(3, 0x7c, False, 2) + +genIFRwDataCode(4, 0x7c, False, 2) + + +genTcEndFrameCode(gen_file_def)) + genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1, True, gen_file_def_ap) + + + return gen_file_def + + +def tc6(): + random.seed(int(time.time() * 1000)) + genPkt = GenPkt() + + gen_file_def = "error_pkt_tc06" + sm_idx = 0 + tc_des = ("发送错误的数据包,导致设备出问题。出问题后,恢复错误,其中误操作的寄存器全部恢复正常。\\n" + "清除错误后,数据应该恢复正常。" + ) + + + genPkt.clean() + genPkt.addSubPkt(0x0, 0x0, 0x302, 0xe, 2, [0x20, 0x00]) + + genPkt.addBeforeExc(genTcStartFrameCode(gen_file_def, tc_des) + +genMessageCode("--清除中断") + +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + ) + + + + genPkt.addAfterExc(genWriteTransLenCode(gen_file_def, sm_idx) + +genWriteTransPktCode(gen_file_def, sm_idx) + +genTrgTransPktCode(gen_file_def, sm_idx) + +genReadAckPktCode(gen_file_def, sm_idx) + + + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + + +genMessageCode("--清除中断") + +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + ) + genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1) + + genPkt.clean() + + data = list() + + ''' + 00 04 03 02 20 02 // type: 0 dev: 1 addr:0x0302 cmd:0x2 len: 2 + {{ 20 00 }} + 00 02 + + 00 00 03 0a e0 02 // type: 0 dev: 0 addr:0x030a cmd:0xe len: 2 + {{ 20 00 }} + 00 04 + ''' + + + + data = data + [0x1a, 0x40, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0xd0, 0x40] + for i in range(64): + data.append(random.randint(0, 255)) + data = data + [0x00, 0x00] + + data = data + [0x00, 0x00, 0x03, 0x02, 0xe0, 0x02, 0x40, 0x01, 0x00, 0x00] + + #data = data + [0x00, 0x0c, 0x00, 0xc0, 0x00, 0x80] + for i in range(128): + data.append(random.randint(0, 255)) + data = data + [0, 0] + + genPkt.setPkt(2, data) + + sm_idx = 0 + genPkt.addBeforeExc(genMessageCode("--读取统计寄存器") + +genIFRwDataCode(0, 0x80, False, 24) + +genIFRwDataCode(0, 0xa0, False, 24) + +genIFRwDataCode(1, 0x80, False, 24) + +genIFRwDataCode(1, 0xa0, False, 24) + ) + + gen_file_def_ap = gen_file_def + "_rw01" + genPkt.addAfterExc(genWriteTransLenCode(gen_file_def_ap, sm_idx) + +genWriteTransPktCode(gen_file_def_ap, sm_idx) + +genTrgTransPktCode(gen_file_def_ap, sm_idx) + +genReadAckPktCode(gen_file_def_ap, sm_idx) + + +genMessageCode("--数据包状态寄存器") + +genIFRwDataCode(0, 0x22, False, 2) + +genIFRwDataCode(0, 0x22, True, 2, [0xff, 0xff]) + +genIFRwDataCode(0, 0x22, False, 2) + + +genMessageCode("--读取统计寄存器") + +genIFRwDataCode(0, 0x80, False, 24) + +genIFRwDataCode(0, 0xa0, False, 24) + +genIFRwDataCode(1, 0x80, False, 24) + +genIFRwDataCode(1, 0xa0, False, 24) + + + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + + +genMessageCode("--清除中断") + +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + + +genMessageCode("--清除主站错误") + +genIFRwDataCode(0, 0x300 + sm_idx * 4, True, 1, [0x1, ], wlog = False) + + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + ) + genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1, True, gen_file_def_ap) + + genPkt.clean() + + gen_file_def_ap = gen_file_def + "_rw02" + sm_idx = 0 + + data = [0,] * 32 + genPkt.addSubPkt(1, 0, 0x302, 0x0, 2, data) + genPkt.addSubPkt(2, 0, 0x302, 0x0, 2, data) + genPkt.addSubPkt(3, 0, 0x302, 0x0, 2, data) + genPkt.addSubPkt(4, 0, 0x302, 0x0, 2, data) + + genPkt.addAfterExc(genWriteTransLenCode(gen_file_def_ap, sm_idx) + +genWriteTransPktCode(gen_file_def_ap, sm_idx) + +genTrgTransPktCode(gen_file_def_ap, sm_idx) + +genReadAckPktCode(gen_file_def_ap, sm_idx) + + +genMessageCode("--数据包状态寄存器") + +genIFRwDataCode(0, 0x22, False, 2) + +genIFRwDataCode(0, 0x22, True, 2, [0xff, 0xff]) + +genIFRwDataCode(0, 0x22, False, 2) + + #+genMessageCode("--读取统计寄存器") + #+genIFRwDataCode(0, 0x80, False, 24) + #+genIFRwDataCode(0, 0xa0, False, 24) + + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + + +genMessageCode("--清除中断") + +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + + +genTcEndFrameCode(gen_file_def)) + genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1, True, gen_file_def_ap) + + return gen_file_def + + + +def mk_subpkt(dev, type, addr, cmd, len, dat): + ret_dat = list() + + temp = ((dev & 0x3fff) << 2) | (type & 0x3) + ret_dat = ret_dat + [(temp >> 8) & 0xff, temp & 0xff, (addr >> 8) & 0xff, addr & 0xff] + + temp = ((cmd & 0xf) << 12) | (len & 0xfff) + ret_dat = ret_dat + [(temp >>8) & 0xff, temp & 0xff] + + ret_dat = ret_dat + dat + [0, 0] + + return ret_dat + +def sm_wr_err_test(tc_id, sm_id, pre_g_pkt = 1, good_pkt_in_bad = 1, after_g_pkt = 1, data_size = 0x10, dev = 1, cmd = 0x1): + random.seed(int(time.time() * 1000)) + genPkt = GenPkt() + + gen_file_def = "error_pkt_tc%02d"%(tc_id, ) + sm_idx = 0 + tc_des = (f"测试SM{sm_id},先写入正确的数据包,包含{pre_g_pkt}个操作SM{sm_id}的子包,然后写入错误的数据包,其中包含正确的操作SM{sm_id}的数据子包有{good_pkt_in_bad}个,\\n" + f"然后再发送正确的数据包,其中包含{after_g_pkt}个操作SM{sm_id}的子包。然后检查SM{sm_id}的状态以及数据。\\n" + f"所有数据包的长度都是{data_size}字节,设备{dev}, 命令{cmd}。没有比对数据,需要手动检查。" + ) + + + genPkt.clean() + genPkt.addSubPkt(0x0, 0x0, 0x302 + 4 * sm_id, 0xe, 2, [(data_size & 0xff), ((data_size >> 8)&0xff)]) + for pkt_num in range(pre_g_pkt): + genPkt.addSubPkt(dev, 0x0, 0x800 + 0x800 * sm_id, cmd, data_size, [((i * (pkt_num + 1)) & 0xff) for i in range(data_size)]) + + genPkt.addBeforeExc(genTcStartFrameCode(gen_file_def, tc_des) + +genMessageCode("--清除主中断") + +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + ) + + genPkt.addAfterExc(genWriteTransLenCode(gen_file_def, sm_idx) + +genWriteTransPktCode(gen_file_def, sm_idx) + +genTrgTransPktCode(gen_file_def, sm_idx) + +genReadAckPktCode(gen_file_def, sm_idx) + + + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + + +genMessageCode("--清除中断") + +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + + +genMessageCode("--MB状态寄存器") + +genIFRwDataCode(1, 0x301 + sm_id * 0x4, False, 1) + +genIFRwDataCode(2, 0x301 + sm_id * 0x4, False, 1) + +genIFRwDataCode(3, 0x301 + sm_id * 0x4, False, 1) + +genIFRwDataCode(4, 0x301 + sm_id * 0x4, False, 1) + ) + genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1) + + genPkt.clean() + + temp = ((data_size * 6) & 0xfff) << 4 + data = [(temp >> 8)&0xff, temp & 0xff, 0, 0] + + for i in range(good_pkt_in_bad): + data = data + mk_subpkt(dev, 0, 0x800 + 0x800 * sm_id, cmd, data_size, [((j * (i + 1) + 1) & 0xff) for j in range(data_size)]) + + for i in range(128): + data.append(random.randint(0, 255)) + data = data + [0, 0] + + genPkt.setPkt(2, data) + + sm_idx = 0 + genPkt.addBeforeExc(genMessageCode("--读取统计寄存器") + +genIFRwDataCode(0, 0x80, False, 24) + +genIFRwDataCode(0, 0xa0, False, 24) + +genIFRwDataCode(1, 0x80, False, 24) + +genIFRwDataCode(1, 0xa0, False, 24) + ) + + gen_file_def_ap = gen_file_def + "_rw01" + genPkt.addAfterExc(genWriteTransLenCode(gen_file_def_ap, sm_idx) + +genWriteTransPktCode(gen_file_def_ap, sm_idx) + +genTrgTransPktCode(gen_file_def_ap, sm_idx) + +genReadAckPktCode(gen_file_def_ap, sm_idx) + + +genMessageCode("--数据包状态寄存器") + +genIFRwDataCode(0, 0x22, False, 2) + +genIFRwDataCode(0, 0x22, True, 2, [0xff, 0xff]) + +genIFRwDataCode(0, 0x22, False, 2) + + +genMessageCode("--读取统计寄存器") + +genIFRwDataCode(0, 0x80, False, 24) + +genIFRwDataCode(0, 0xa0, False, 24) + +genIFRwDataCode(1, 0x80, False, 24) + +genIFRwDataCode(1, 0xa0, False, 24) + + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + + +genMessageCode("--清除中断") + +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + + +genMessageCode("--清除主站错误") + +genIFRwDataCode(0, 0x300 + sm_idx * 4, True, 1, [0x1, ], wlog = False) + + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + + +genMessageCode("--MB状态寄存器") + +genIFRwDataCode(1, 0x301 + sm_id * 0x4, False, 1) + +genIFRwDataCode(2, 0x301 + sm_id * 0x4, False, 1) + +genIFRwDataCode(3, 0x301 + sm_id * 0x4, False, 1) + +genIFRwDataCode(4, 0x301 + sm_id * 0x4, False, 1) + ) + genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1, True, gen_file_def_ap) + + genPkt.clean() + + gen_file_def_ap = gen_file_def + "_rw02" + sm_idx = 0 + + genPkt.addSubPkt(0, 0, 0, 0, 8, [0, ] * 8) + + for pkt_num in range(after_g_pkt): + genPkt.addSubPkt(dev, 0x0, 0x800 + 0x800 * sm_id, cmd, data_size, [((i * (pkt_num + 1) - 1) & 0xff) for i in range(data_size)]) + + if sm_id < 4: + code_str = (genIFRwDataCode(dev, 0x800 + sm_id * 0x800, False, data_size) + +genIFRwDataCode(dev, 0x800 + sm_id * 0x800, False, data_size) + +genIFRwDataCode(dev, 0x800 + sm_id * 0x800, False, data_size) + +genIFRwDataCode(dev, 0x800 + sm_id * 0x800, False, data_size)) + else: + code_str = (genIFRwDataCode(dev, 0x800 + sm_id * 0x800, False, data_size) + +genIFRwDataCode(dev, 0x800 + sm_id * 0x800, False, data_size)) + + genPkt.addAfterExc(genWriteTransLenCode(gen_file_def_ap, sm_idx) + +genWriteTransPktCode(gen_file_def_ap, sm_idx) + +genTrgTransPktCode(gen_file_def_ap, sm_idx) + +genReadAckPktCode(gen_file_def_ap, sm_idx) + + +genMessageCode("--数据包状态寄存器") + +genIFRwDataCode(0, 0x22, False, 2) + +genIFRwDataCode(0, 0x22, True, 2, [0xff, 0xff]) + +genIFRwDataCode(0, 0x22, False, 2) + + #+genMessageCode("--读取统计寄存器") + #+genIFRwDataCode(0, 0x80, False, 24) + #+genIFRwDataCode(0, 0xa0, False, 24) + + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + + +genMessageCode("--清除中断") + +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + + +genMessageCode("--MB状态寄存器") + +genIFRwDataCode(1, 0x301 + sm_id * 0x4, False, 1) + +genIFRwDataCode(2, 0x301 + sm_id * 0x4, False, 1) + +genIFRwDataCode(3, 0x301 + sm_id * 0x4, False, 1) + +genIFRwDataCode(4, 0x301 + sm_id * 0x4, False, 1) + + +genMessageCode("--读取MB数据") + +code_str + + #+genMessageCode("--复位MB状态") + #+genIFRwDataCode(1, 0x300 + sm_id * 0x4, True, 1, [0, ]) + #+genIFRwDataCode(2, 0x300 + sm_id * 0x4, True, 1, [0, ]) + #+genIFRwDataCode(3, 0x300 + sm_id * 0x4, True, 1, [0, ]) + #+genIFRwDataCode(4, 0x300 + sm_id * 0x4, True, 1, [0, ]) + + +genTcEndFrameCode(gen_file_def)) + genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1, True, gen_file_def_ap) + + return gen_file_def + +''' +测试SM0 +''' +def tc7(): + return sm_wr_err_test(7, 0, 1, 2, 1, 32) + +def tc8(): + return sm_wr_err_test(8, 0, 2, 2, 1, 32) + +def tc9(): + return sm_wr_err_test(9, 0, 4, 2, 1, 16) + +def tc10(): + return sm_wr_err_test(10, 0, 0, 5, 1, 16) + +def tc11(): + return sm_wr_err_test(11, 0, 0, 5, 3, 64) + +def tc12(): + return sm_wr_err_test(12, 0, 1, 1, 4, 64) + +def tc13(): + return sm_wr_err_test(13, 0, 0, 5, 0, 128) + +def tc14(): + return sm_wr_err_test(14, 0, 4, 5, 4, 128) + + +''' +测试SM2 +''' +def tc15(): + return sm_wr_err_test(15, 2, 1, 2, 1, 32) + +def tc16(): + return sm_wr_err_test(16, 2, 2, 2, 1, 32) + +def tc17(): + return sm_wr_err_test(17, 2, 4, 2, 1, 16) + +def tc18(): + return sm_wr_err_test(18, 2, 0, 5, 1, 16) + +def tc19(): + return sm_wr_err_test(19, 2, 0, 5, 3, 64) + +def tc20(): + return sm_wr_err_test(20, 2, 1, 1, 4, 64) + +def tc21(): + return sm_wr_err_test(21, 2, 0, 5, 0, 128) + +def tc22(): + return sm_wr_err_test(22, 2, 4, 5, 4, 128) + + + +''' +测试SM4 +''' +def tc23(): + return sm_wr_err_test(23, 4, 1, 2, 1, 32) + +def tc24(): + return sm_wr_err_test(24, 4, 2, 2, 1, 32) + +def tc25(): + return sm_wr_err_test(25, 4, 4, 2, 1, 16) + +def tc26(): + return sm_wr_err_test(26, 4, 0, 5, 1, 16) + +def tc27(): + return sm_wr_err_test(27, 4, 0, 5, 3, 64) + +def tc28(): + return sm_wr_err_test(28, 4, 1, 1, 4, 64) + +def tc29(): + return sm_wr_err_test(29, 4, 0, 5, 0, 128) + +def tc30(): + return sm_wr_err_test(30, 4, 4, 5, 4, 128) + + +''' +测试SM6 +''' +def tc31(): + return sm_wr_err_test(31, 6, 1, 2, 1, 32) + +def tc32(): + return sm_wr_err_test(32, 6, 2, 2, 1, 32) + +def tc33(): + return sm_wr_err_test(33, 6, 4, 2, 1, 16) + +def tc34(): + return sm_wr_err_test(34, 6, 0, 5, 1, 16) + +def tc35(): + return sm_wr_err_test(35, 6, 0, 5, 3, 64) + +def tc36(): + return sm_wr_err_test(36, 6, 1, 1, 4, 64) + +def tc37(): + return sm_wr_err_test(37, 6, 0, 5, 0, 128) + +def tc38(): + return sm_wr_err_test(38, 6, 4, 5, 4, 128) + diff --git a/tb/shinTest/testcase/manydev.py b/tb/shinTest/testcase/manydev.py index ec844e1..92459f1 100644 --- a/tb/shinTest/testcase/manydev.py +++ b/tb/shinTest/testcase/manydev.py @@ -1,190 +1,190 @@ -from pyutils import * -from .environment import * - -def tc1(): - genPkt = GenPkt() - - dev = get_slv_dev_num() - print("DEV:", dev) - - gen_file_def = "manydev_tc01" - sm_idx = 0 - tc_des = f"{dev}个设备, 准备一下开发环境,发送一个广播包。\\n" - - - #------------------------------------------------------------------------- - #>>>>>>普通数据包 sm1,2个读 - genPkt.clean() - genPkt.setPktType(1) - - set_if_code = "" - for i in range(dev - 4): - set_if_code = set_if_code + genIFRwDataCode(i + 5, 0x09, True, 1, [0, ], False, iface=1) - - clear_int_code = "" - for i in range(dev + 1): - clear_int_code = clear_int_code + genIFRwDataCode(i, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - - - read_int_code = "" - for i in range(dev + 1): - read_int_code = read_int_code + genIFRwDataCode(i, 0x74, False, 4) - - init_slave_code = "" - for i in range(dev): - init_slave_code = init_slave_code + genIFRwDataCode(1 + i, 0x0, True, 1, [0x2, ]) + genIFRwDataCode(1 + i, 0x7c, True, 2, [0x10, 0x80]) - - read_dev_code = "" - for i in range(dev + 1): - read_dev_code = read_dev_code + genIFRwDataCode(i, 0x0, False, 1) - - - - genPkt.addBeforeExc(genTcStartFrameCode(gen_file_def, tc_des) - +genMessageCode("--清除中断") - +set_if_code - +init_slave_code - +clear_int_code - +read_int_code - +read_dev_code - ) - - - - genPkt.addAfterExc(genWriteTransLenCode(gen_file_def, sm_idx) - +genWriteTransPktCode(gen_file_def, sm_idx) - +genTrgTransPktCode(gen_file_def, sm_idx) - +genReadAckPktCode(gen_file_def, sm_idx) - - +clear_int_code - ) - - genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1) - - genPkt.clean() - genPkt.setPktType(0) - - gen_file_def_ap = gen_file_def + "_step02" - sm_idx = 0 - - data = [0x3f, 0xff] - genPkt.addSubPkt(0x0, 0, 0x0, 0xb, 2, data) - - genPkt.addAfterExc(genMessageCode("--设置顺序地址") - +genWriteTransLenCode(gen_file_def_ap, sm_idx) - +genWriteTransPktCode(gen_file_def_ap, sm_idx) - +genTrgTransPktCode(gen_file_def_ap, sm_idx) - #+ "#10000000" - +genReadAckPktCode(gen_file_def_ap, sm_idx) - - - +genMessageCode("--清除主中断") - +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - ) - - genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1, True, gen_file_def_ap) - - - genPkt.clean() - genPkt.setPktType(1) - gen_file_def_ap = gen_file_def+"_step03" - sm_idx = 0 - - genPkt.addBeforeExc(genMessageCode("--设置环境,进行第二次嗅探")) - - - genPkt.addAfterExc(genWriteTransLenCode(gen_file_def_ap, sm_idx) - +genWriteTransPktCode(gen_file_def_ap, sm_idx) - +genTrgTransPktCode(gen_file_def_ap, sm_idx) - +genReadAckPktCode(gen_file_def_ap, sm_idx) - - +clear_int_code - ) - genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1, True, gen_file_def_ap) - - - - genPkt.clean() - genPkt.setPktType(0) - gen_file_def_ap = gen_file_def+"_step04" - sm_idx = 0 - - for i in range(dev): - genPkt.addSubPkt(i + 1, 0, 0x1000, 0x0, 2, [0, 0]) - - prepare_data_code = "" - for i in range(dev): - prepare_data_code = prepare_data_code + genSlvSMWriteData(i + 1, 1, 2, [i, i + 1]) - - genPkt.addBeforeExc(prepare_data_code) - - genPkt.addAfterExc(genWriteTransLenCode(gen_file_def_ap, sm_idx) - +genWriteTransPktCode(gen_file_def_ap, sm_idx) - +genTrgTransPktCode(gen_file_def_ap, sm_idx) - #+ "#10000000" - +genReadAckPktCode(gen_file_def_ap, sm_idx) - - +clear_int_code - ) - genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1, True, gen_file_def_ap) - - - - genPkt.clean() - genPkt.setPktType(0) - gen_file_def_ap = gen_file_def+"_step05" - sm_idx = 0 - - #for i in range(dev): - # genPkt.addSubPkt(i + 1, 0, 0x1000, 0x0, 2, [0, 0]) - genPkt.addSubPkt(0, 0, 0x302, 0xe, 2, [8, 0]) - genPkt.addSubPkt(0, 0, 0x800, 0xe, 8, list(range(8))) - - read_data_code = "" - for i in range(dev): - read_data_code = read_data_code + genSlvSMReadData(i + 1, 0, 8) - - #genPkt.addBeforeExc(prepare_data_code) - - genPkt.addAfterExc(genWriteTransLenCode(gen_file_def_ap, sm_idx) - +genWriteTransPktCode(gen_file_def_ap, sm_idx) - +genTrgTransPktCode(gen_file_def_ap, sm_idx) - +genReadAckPktCode(gen_file_def_ap, sm_idx) - - +clear_int_code - +read_data_code - ) - genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1, True, gen_file_def_ap) - - - - genPkt.clean() - genPkt.setPktType(0) - gen_file_def_ap = gen_file_def+"_step06" - sm_idx = 0 - - #for i in range(dev): - # genPkt.addSubPkt(i + 1, 0, 0x1000, 0x0, 2, [0, 0]) - genPkt.addSubPkt(0, 0, 0x302, 0xe, 2, [2, 0]) - for i in range(dev): - genPkt.addSubPkt(i + 1, 0, 0x0800, 0x1, 2, [i & 0xff, (i + 1) & 0xff]) - - read_data_code = "" - for i in range(dev): - read_data_code = read_data_code + genSlvSMReadData(i + 1, 0, 2) - - #genPkt.addBeforeExc(prepare_data_code) - - genPkt.addAfterExc(genWriteTransLenCode(gen_file_def_ap, sm_idx) - +genWriteTransPktCode(gen_file_def_ap, sm_idx) - +genTrgTransPktCode(gen_file_def_ap, sm_idx) - +genReadAckPktCode(gen_file_def_ap, sm_idx) - - +clear_int_code - +read_data_code - - +genTcEndFrameCode(gen_file_def) - ) - genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1, True, gen_file_def_ap) - +from pyutils import * +from .environment import * + +def tc1(): + genPkt = GenPkt() + + dev = get_slv_dev_num() + print("DEV:", dev) + + gen_file_def = "manydev_tc01" + sm_idx = 0 + tc_des = f"{dev}个设备, 准备一下开发环境,发送一个广播包。\\n" + + + #------------------------------------------------------------------------- + #>>>>>>普通数据包 sm1,2个读 + genPkt.clean() + genPkt.setPktType(1) + + set_if_code = "" + for i in range(dev - 4): + set_if_code = set_if_code + genIFRwDataCode(i + 5, 0x09, True, 1, [0, ], False, iface=1) + + clear_int_code = "" + for i in range(dev + 1): + clear_int_code = clear_int_code + genIFRwDataCode(i, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + + + read_int_code = "" + for i in range(dev + 1): + read_int_code = read_int_code + genIFRwDataCode(i, 0x74, False, 4) + + init_slave_code = "" + for i in range(dev): + init_slave_code = init_slave_code + genIFRwDataCode(1 + i, 0x0, True, 1, [0x2, ]) + genIFRwDataCode(1 + i, 0x7c, True, 2, [0x10, 0x80]) + + read_dev_code = "" + for i in range(dev + 1): + read_dev_code = read_dev_code + genIFRwDataCode(i, 0x0, False, 1) + + + + genPkt.addBeforeExc(genTcStartFrameCode(gen_file_def, tc_des) + +genMessageCode("--清除中断") + +set_if_code + +init_slave_code + +clear_int_code + +read_int_code + +read_dev_code + ) + + + + genPkt.addAfterExc(genWriteTransLenCode(gen_file_def, sm_idx) + +genWriteTransPktCode(gen_file_def, sm_idx) + +genTrgTransPktCode(gen_file_def, sm_idx) + +genReadAckPktCode(gen_file_def, sm_idx) + + +clear_int_code + ) + + genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1) + + genPkt.clean() + genPkt.setPktType(0) + + gen_file_def_ap = gen_file_def + "_step02" + sm_idx = 0 + + data = [0x3f, 0xff] + genPkt.addSubPkt(0x0, 0, 0x0, 0xb, 2, data) + + genPkt.addAfterExc(genMessageCode("--设置顺序地址") + +genWriteTransLenCode(gen_file_def_ap, sm_idx) + +genWriteTransPktCode(gen_file_def_ap, sm_idx) + +genTrgTransPktCode(gen_file_def_ap, sm_idx) + #+ "#10000000" + +genReadAckPktCode(gen_file_def_ap, sm_idx) + + + +genMessageCode("--清除主中断") + +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + ) + + genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1, True, gen_file_def_ap) + + + genPkt.clean() + genPkt.setPktType(1) + gen_file_def_ap = gen_file_def+"_step03" + sm_idx = 0 + + genPkt.addBeforeExc(genMessageCode("--设置环境,进行第二次嗅探")) + + + genPkt.addAfterExc(genWriteTransLenCode(gen_file_def_ap, sm_idx) + +genWriteTransPktCode(gen_file_def_ap, sm_idx) + +genTrgTransPktCode(gen_file_def_ap, sm_idx) + +genReadAckPktCode(gen_file_def_ap, sm_idx) + + +clear_int_code + ) + genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1, True, gen_file_def_ap) + + + + genPkt.clean() + genPkt.setPktType(0) + gen_file_def_ap = gen_file_def+"_step04" + sm_idx = 0 + + for i in range(dev): + genPkt.addSubPkt(i + 1, 0, 0x1000, 0x0, 2, [0, 0]) + + prepare_data_code = "" + for i in range(dev): + prepare_data_code = prepare_data_code + genSlvSMWriteData(i + 1, 1, 2, [i, i + 1]) + + genPkt.addBeforeExc(prepare_data_code) + + genPkt.addAfterExc(genWriteTransLenCode(gen_file_def_ap, sm_idx) + +genWriteTransPktCode(gen_file_def_ap, sm_idx) + +genTrgTransPktCode(gen_file_def_ap, sm_idx) + #+ "#10000000" + +genReadAckPktCode(gen_file_def_ap, sm_idx) + + +clear_int_code + ) + genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1, True, gen_file_def_ap) + + + + genPkt.clean() + genPkt.setPktType(0) + gen_file_def_ap = gen_file_def+"_step05" + sm_idx = 0 + + #for i in range(dev): + # genPkt.addSubPkt(i + 1, 0, 0x1000, 0x0, 2, [0, 0]) + genPkt.addSubPkt(0, 0, 0x302, 0xe, 2, [8, 0]) + genPkt.addSubPkt(0, 0, 0x800, 0xe, 8, list(range(8))) + + read_data_code = "" + for i in range(dev): + read_data_code = read_data_code + genSlvSMReadData(i + 1, 0, 8) + + #genPkt.addBeforeExc(prepare_data_code) + + genPkt.addAfterExc(genWriteTransLenCode(gen_file_def_ap, sm_idx) + +genWriteTransPktCode(gen_file_def_ap, sm_idx) + +genTrgTransPktCode(gen_file_def_ap, sm_idx) + +genReadAckPktCode(gen_file_def_ap, sm_idx) + + +clear_int_code + +read_data_code + ) + genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1, True, gen_file_def_ap) + + + + genPkt.clean() + genPkt.setPktType(0) + gen_file_def_ap = gen_file_def+"_step06" + sm_idx = 0 + + #for i in range(dev): + # genPkt.addSubPkt(i + 1, 0, 0x1000, 0x0, 2, [0, 0]) + genPkt.addSubPkt(0, 0, 0x302, 0xe, 2, [2, 0]) + for i in range(dev): + genPkt.addSubPkt(i + 1, 0, 0x0800, 0x1, 2, [i & 0xff, (i + 1) & 0xff]) + + read_data_code = "" + for i in range(dev): + read_data_code = read_data_code + genSlvSMReadData(i + 1, 0, 2) + + #genPkt.addBeforeExc(prepare_data_code) + + genPkt.addAfterExc(genWriteTransLenCode(gen_file_def_ap, sm_idx) + +genWriteTransPktCode(gen_file_def_ap, sm_idx) + +genTrgTransPktCode(gen_file_def_ap, sm_idx) + +genReadAckPktCode(gen_file_def_ap, sm_idx) + + +clear_int_code + +read_data_code + + +genTcEndFrameCode(gen_file_def) + ) + genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1, True, gen_file_def_ap) + return gen_file_def \ No newline at end of file diff --git a/tb/shinTest/testcase/rwregs.py b/tb/shinTest/testcase/rwregs.py index 0241c7b..b869645 100644 --- a/tb/shinTest/testcase/rwregs.py +++ b/tb/shinTest/testcase/rwregs.py @@ -1,224 +1,224 @@ -from pyutils import * -from .environment import * - -import time -import random - -def tc1(): - gen_file_def = "regtest_tc01" - sm_idx = 0 - tc_des = "测试寄存器的读写状态,将系统改为8B10B进行通信。特别测试SPI/QSPI读写密码正确和不正确的情况下,对读写的封堵。\\n" - - genPkt = GenPkt() - genPkt.clean() - - dev_num = get_slv_dev_num() - - genPkt.addBeforeExc(genTcStartFrameCode(gen_file_def, tc_des)) - - change_8b10b_code1 = "" - for i in range(dev_num + 1): - change_8b10b_code1 = change_8b10b_code1 + genIFRwDataCode(i, 0x004c, True, 2, [0x0, 0x59])\ - +genIFRwDataCode(i, 0x004c, False, 2) - - change_8b10b_code2 = "" - for i in range(dev_num + 1): - change_8b10b_code2 = change_8b10b_code2 + genIFRwDataCode(i, 0x004c, True, 2, [0x1, 0x59])\ - +genIFRwDataCode(i, 0x004c, False, 2) - - invalid_change_8b10b_code1 = "" - for i in range(dev_num + 1): - invalid_change_8b10b_code1 = invalid_change_8b10b_code1 + genIFRwDataCode(i, 0x004c, True, 2, [0x0, 0x32])\ - +genIFRwDataCode(i, 0x004c, False, 2) - - invalid_change_8b10b_code2 = "" - for i in range(dev_num + 1): - invalid_change_8b10b_code2 = invalid_change_8b10b_code2 + genIFRwDataCode(i, 0x004c, True, 2, [0x1, 0x43])\ - +genIFRwDataCode(i, 0x004c, False, 2) - - invalid_change_8b10b_code3 = "" - for i in range(dev_num + 1): - invalid_change_8b10b_code3 = invalid_change_8b10b_code3 + genIFRwDataCode(i, 0x004c, True, 1, [0x0, ])\ - +genIFRwDataCode(i, 0x004c, False, 2) - - invalid_change_8b10b_code4 = "" - for i in range(dev_num + 1): - invalid_change_8b10b_code4 = invalid_change_8b10b_code4 + genIFRwDataCode(i, 0x004c, True, 1, [0x1, ])\ - +genIFRwDataCode(i, 0x004c, False, 2) - - invalid_change_8b10b_code5 = "" - for i in range(dev_num + 1): - invalid_change_8b10b_code5 = invalid_change_8b10b_code5 + genIFRwDataCode(i, 0x004c, True, 2, [0x30, 0x59])\ - +genIFRwDataCode(i, 0x004c, False, 2) - - invalid_change_8b10b_code6 = "" - for i in range(dev_num + 1): - invalid_change_8b10b_code6 = invalid_change_8b10b_code6 + genIFRwDataCode(i, 0x004c, True, 2, [0x23, 0x59])\ - +genIFRwDataCode(i, 0x004c, False, 2) - - default_trans_code = "" - for i in range(dev_num + 1): - default_trans_code = default_trans_code + using_proper_workmode(i, iface = 4) - - genPkt.addAfterExc(genMessageCode("--正确的key") - +change_8b10b_code1 - +genMessageCode("--错误的key") - +invalid_change_8b10b_code4 - +genMessageCode("--错误的key") - +invalid_change_8b10b_code1 - +genMessageCode("--错误的key") - +invalid_change_8b10b_code2 - +genMessageCode("--正确的key") - +change_8b10b_code2 - +genMessageCode("--错误的key") - +invalid_change_8b10b_code3 - +genMessageCode("--错误的key") - +invalid_change_8b10b_code1 - +genMessageCode("--错误的key") - +invalid_change_8b10b_code2 - +genMessageCode("--正确的key_错误的数据") - +invalid_change_8b10b_code5 - +invalid_change_8b10b_code6 - +genMessageCode("--恢复默认的配置") - +default_trans_code - +genTcEndFrameCode(gen_file_def)) - genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1) - return gen_file_def - - -def tc2(): - gen_file_def = "regtest_tc02" - sm_idx = 0 - tc_des = "测试寄存器的读写状态,交换上下行管脚。特别测试SPI/QSPI读写密码正确和不正确的情况下,对读写的封堵。\\n" - - genPkt = GenPkt() - genPkt.clean() - - dev_num = get_slv_dev_num() - - genPkt.addBeforeExc(genTcStartFrameCode(gen_file_def, tc_des)) - - change_pinsw_code1 = "" - for i in range(dev_num + 1): - change_pinsw_code1 = change_pinsw_code1 + genIFRwDataCode(i, 0x004a, True, 2, [0x0, 0x58])\ - +genIFRwDataCode(i, 0x004a, False, 2) - - change_pinsw_code2 = "" - for i in range(dev_num + 1): - change_pinsw_code2 = change_pinsw_code2 + genIFRwDataCode(i, 0x004a, True, 2, [0x1, 0x58])\ - +genIFRwDataCode(i, 0x004a, False, 2) - - invalid_change_pinsw_code1 = "" - for i in range(dev_num + 1): - invalid_change_pinsw_code1 = invalid_change_pinsw_code1 + genIFRwDataCode(i, 0x004a, True, 2, [0x0, 0x32])\ - +genIFRwDataCode(i, 0x004a, False, 2) - - invalid_change_pinsw_code2 = "" - for i in range(dev_num + 1): - invalid_change_pinsw_code2 = invalid_change_pinsw_code2 + genIFRwDataCode(i, 0x004a, True, 2, [0x1, 0x43])\ - +genIFRwDataCode(i, 0x004a, False, 2) - - invalid_change_pinsw_code3 = "" - for i in range(dev_num + 1): - invalid_change_pinsw_code3 = invalid_change_pinsw_code3 + genIFRwDataCode(i, 0x004a, True, 1, [0x0, ])\ - +genIFRwDataCode(i, 0x004a, False, 2) - - invalid_change_pinsw_code4 = "" - for i in range(dev_num + 1): - invalid_change_pinsw_code4 = invalid_change_pinsw_code4 + genIFRwDataCode(i, 0x004a, True, 1, [0x1, ])\ - +genIFRwDataCode(i, 0x004a, False, 2) - - invalid_change_pinsw_code5 = "" - for i in range(dev_num + 1): - invalid_change_pinsw_code5 = invalid_change_pinsw_code5 + genIFRwDataCode(i, 0x004a, True, 2, [0x30, 0x58])\ - +genIFRwDataCode(i, 0x004a, False, 2) - - invalid_change_pinsw_code6 = "" - for i in range(dev_num + 1): - invalid_change_pinsw_code6 = invalid_change_pinsw_code6 + genIFRwDataCode(i, 0x004a, True, 2, [0x23, 0x58])\ - +genIFRwDataCode(i, 0x004a, False, 2) - - default_pinsw_code = "" - for i in range(dev_num + 1): - default_pinsw_code = default_pinsw_code + genIFRwDataCode(i, 0x004a, True, 2, [0, 0x58]) - - genPkt.addAfterExc(genMessageCode("--正确的key") - +change_pinsw_code1 - +genMessageCode("--错误的key") - +invalid_change_pinsw_code4 - +genMessageCode("--错误的key") - +invalid_change_pinsw_code1 - +genMessageCode("--错误的key") - +invalid_change_pinsw_code2 - +genMessageCode("--正确的key") - +change_pinsw_code2 - +genMessageCode("--错误的key") - +invalid_change_pinsw_code3 - +genMessageCode("--错误的key") - +invalid_change_pinsw_code1 - +genMessageCode("--错误的key") - +invalid_change_pinsw_code2 - +genMessageCode("--正确的key_错误的数据") - +invalid_change_pinsw_code5 - +invalid_change_pinsw_code6 - +genMessageCode("--恢复默认的配置") - +default_pinsw_code - +genTcEndFrameCode(gen_file_def)) - genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1) - return gen_file_def - -def tc3(): - gen_file_def = "regtest_tc03" - sm_idx = 0 - tc_des = "测试SM0~SM7的的长度寄存器的读写,要求在内部有元素的情况下,不能改写其长度。\\n" - - genPkt = GenPkt() - genPkt.clean() - genPkt.setPktType(0) - - dev_num = get_slv_dev_num() - - chang_sm_length = "" - for i in range(dev_num + 1): - chang_sm_length = chang_sm_length + genIFRwDataCode(i, 0x0302, True, 2, [0x20, 0x00]) - - - - genPkt.addBeforeExc(genTcStartFrameCode(gen_file_def, tc_des) - +chang_sm_length - +genMessageCode("--清除主中断") - +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - ) - - genPkt.addSubPkt(0x0, 0x0, 0x0800, 0xe, 0x20, [0, ] * 0x20) - - chang_sm_length = "" - for i in range(dev_num + 1): - chang_sm_length = chang_sm_length + genIFRwDataCode(i, 0x0302, True, 2, [0x40, 0x00]) - - read_sm_status = "" - for i in range(dev_num + 1): - read_sm_status = read_sm_status + genIFRwDataCode(i, 0x0300, False, 4) - - reset_sm = "" - for i in range(dev_num + 1): - reset_sm = reset_sm + genIFRwDataCode(i, 0x0300, True, 1, [0, ]) - - genPkt.addAfterExc(genWriteTransLenCode(gen_file_def, sm_idx) - +genWriteTransPktCode(gen_file_def, sm_idx) - +genTrgTransPktCode(gen_file_def, sm_idx) - +genReadAckPktCode(gen_file_def, sm_idx) - +chang_sm_length - +read_sm_status - +reset_sm - +read_sm_status - +genMessageCode("--清除主中断") - +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genTcEndFrameCode(gen_file_def)) - genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1) - return gen_file_def - +from pyutils import * +from .environment import * + +import time +import random + +def tc1(): + gen_file_def = "regtest_tc01" + sm_idx = 0 + tc_des = "测试寄存器的读写状态,将系统改为8B10B进行通信。特别测试SPI/QSPI读写密码正确和不正确的情况下,对读写的封堵。\\n" + + genPkt = GenPkt() + genPkt.clean() + + dev_num = get_slv_dev_num() + + genPkt.addBeforeExc(genTcStartFrameCode(gen_file_def, tc_des)) + + change_8b10b_code1 = "" + for i in range(dev_num + 1): + change_8b10b_code1 = change_8b10b_code1 + genIFRwDataCode(i, 0x004c, True, 2, [0x0, 0x59])\ + +genIFRwDataCode(i, 0x004c, False, 2) + + change_8b10b_code2 = "" + for i in range(dev_num + 1): + change_8b10b_code2 = change_8b10b_code2 + genIFRwDataCode(i, 0x004c, True, 2, [0x1, 0x59])\ + +genIFRwDataCode(i, 0x004c, False, 2) + + invalid_change_8b10b_code1 = "" + for i in range(dev_num + 1): + invalid_change_8b10b_code1 = invalid_change_8b10b_code1 + genIFRwDataCode(i, 0x004c, True, 2, [0x0, 0x32])\ + +genIFRwDataCode(i, 0x004c, False, 2) + + invalid_change_8b10b_code2 = "" + for i in range(dev_num + 1): + invalid_change_8b10b_code2 = invalid_change_8b10b_code2 + genIFRwDataCode(i, 0x004c, True, 2, [0x1, 0x43])\ + +genIFRwDataCode(i, 0x004c, False, 2) + + invalid_change_8b10b_code3 = "" + for i in range(dev_num + 1): + invalid_change_8b10b_code3 = invalid_change_8b10b_code3 + genIFRwDataCode(i, 0x004c, True, 1, [0x0, ])\ + +genIFRwDataCode(i, 0x004c, False, 2) + + invalid_change_8b10b_code4 = "" + for i in range(dev_num + 1): + invalid_change_8b10b_code4 = invalid_change_8b10b_code4 + genIFRwDataCode(i, 0x004c, True, 1, [0x1, ])\ + +genIFRwDataCode(i, 0x004c, False, 2) + + invalid_change_8b10b_code5 = "" + for i in range(dev_num + 1): + invalid_change_8b10b_code5 = invalid_change_8b10b_code5 + genIFRwDataCode(i, 0x004c, True, 2, [0x30, 0x59])\ + +genIFRwDataCode(i, 0x004c, False, 2) + + invalid_change_8b10b_code6 = "" + for i in range(dev_num + 1): + invalid_change_8b10b_code6 = invalid_change_8b10b_code6 + genIFRwDataCode(i, 0x004c, True, 2, [0x23, 0x59])\ + +genIFRwDataCode(i, 0x004c, False, 2) + + default_trans_code = "" + for i in range(dev_num + 1): + default_trans_code = default_trans_code + using_proper_workmode(i, iface = 4) + + genPkt.addAfterExc(genMessageCode("--正确的key") + +change_8b10b_code1 + +genMessageCode("--错误的key") + +invalid_change_8b10b_code4 + +genMessageCode("--错误的key") + +invalid_change_8b10b_code1 + +genMessageCode("--错误的key") + +invalid_change_8b10b_code2 + +genMessageCode("--正确的key") + +change_8b10b_code2 + +genMessageCode("--错误的key") + +invalid_change_8b10b_code3 + +genMessageCode("--错误的key") + +invalid_change_8b10b_code1 + +genMessageCode("--错误的key") + +invalid_change_8b10b_code2 + +genMessageCode("--正确的key_错误的数据") + +invalid_change_8b10b_code5 + +invalid_change_8b10b_code6 + +genMessageCode("--恢复默认的配置") + +default_trans_code + +genTcEndFrameCode(gen_file_def)) + genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1) + return gen_file_def + + +def tc2(): + gen_file_def = "regtest_tc02" + sm_idx = 0 + tc_des = "测试寄存器的读写状态,交换上下行管脚。特别测试SPI/QSPI读写密码正确和不正确的情况下,对读写的封堵。\\n" + + genPkt = GenPkt() + genPkt.clean() + + dev_num = get_slv_dev_num() + + genPkt.addBeforeExc(genTcStartFrameCode(gen_file_def, tc_des)) + + change_pinsw_code1 = "" + for i in range(dev_num + 1): + change_pinsw_code1 = change_pinsw_code1 + genIFRwDataCode(i, 0x004a, True, 2, [0x0, 0x58])\ + +genIFRwDataCode(i, 0x004a, False, 2) + + change_pinsw_code2 = "" + for i in range(dev_num + 1): + change_pinsw_code2 = change_pinsw_code2 + genIFRwDataCode(i, 0x004a, True, 2, [0x1, 0x58])\ + +genIFRwDataCode(i, 0x004a, False, 2) + + invalid_change_pinsw_code1 = "" + for i in range(dev_num + 1): + invalid_change_pinsw_code1 = invalid_change_pinsw_code1 + genIFRwDataCode(i, 0x004a, True, 2, [0x0, 0x32])\ + +genIFRwDataCode(i, 0x004a, False, 2) + + invalid_change_pinsw_code2 = "" + for i in range(dev_num + 1): + invalid_change_pinsw_code2 = invalid_change_pinsw_code2 + genIFRwDataCode(i, 0x004a, True, 2, [0x1, 0x43])\ + +genIFRwDataCode(i, 0x004a, False, 2) + + invalid_change_pinsw_code3 = "" + for i in range(dev_num + 1): + invalid_change_pinsw_code3 = invalid_change_pinsw_code3 + genIFRwDataCode(i, 0x004a, True, 1, [0x0, ])\ + +genIFRwDataCode(i, 0x004a, False, 2) + + invalid_change_pinsw_code4 = "" + for i in range(dev_num + 1): + invalid_change_pinsw_code4 = invalid_change_pinsw_code4 + genIFRwDataCode(i, 0x004a, True, 1, [0x1, ])\ + +genIFRwDataCode(i, 0x004a, False, 2) + + invalid_change_pinsw_code5 = "" + for i in range(dev_num + 1): + invalid_change_pinsw_code5 = invalid_change_pinsw_code5 + genIFRwDataCode(i, 0x004a, True, 2, [0x30, 0x58])\ + +genIFRwDataCode(i, 0x004a, False, 2) + + invalid_change_pinsw_code6 = "" + for i in range(dev_num + 1): + invalid_change_pinsw_code6 = invalid_change_pinsw_code6 + genIFRwDataCode(i, 0x004a, True, 2, [0x23, 0x58])\ + +genIFRwDataCode(i, 0x004a, False, 2) + + default_pinsw_code = "" + for i in range(dev_num + 1): + default_pinsw_code = default_pinsw_code + genIFRwDataCode(i, 0x004a, True, 2, [0, 0x58]) + + genPkt.addAfterExc(genMessageCode("--正确的key") + +change_pinsw_code1 + +genMessageCode("--错误的key") + +invalid_change_pinsw_code4 + +genMessageCode("--错误的key") + +invalid_change_pinsw_code1 + +genMessageCode("--错误的key") + +invalid_change_pinsw_code2 + +genMessageCode("--正确的key") + +change_pinsw_code2 + +genMessageCode("--错误的key") + +invalid_change_pinsw_code3 + +genMessageCode("--错误的key") + +invalid_change_pinsw_code1 + +genMessageCode("--错误的key") + +invalid_change_pinsw_code2 + +genMessageCode("--正确的key_错误的数据") + +invalid_change_pinsw_code5 + +invalid_change_pinsw_code6 + +genMessageCode("--恢复默认的配置") + +default_pinsw_code + +genTcEndFrameCode(gen_file_def)) + genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1) + return gen_file_def + +def tc3(): + gen_file_def = "regtest_tc03" + sm_idx = 0 + tc_des = "测试SM0~SM7的的长度寄存器的读写,要求在内部有元素的情况下,不能改写其长度。\\n" + + genPkt = GenPkt() + genPkt.clean() + genPkt.setPktType(0) + + dev_num = get_slv_dev_num() + + chang_sm_length = "" + for i in range(dev_num + 1): + chang_sm_length = chang_sm_length + genIFRwDataCode(i, 0x0302, True, 2, [0x20, 0x00]) + + + + genPkt.addBeforeExc(genTcStartFrameCode(gen_file_def, tc_des) + +chang_sm_length + +genMessageCode("--清除主中断") + +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + ) + + genPkt.addSubPkt(0x0, 0x0, 0x0800, 0xe, 0x20, [0, ] * 0x20) + + chang_sm_length = "" + for i in range(dev_num + 1): + chang_sm_length = chang_sm_length + genIFRwDataCode(i, 0x0302, True, 2, [0x40, 0x00]) + + read_sm_status = "" + for i in range(dev_num + 1): + read_sm_status = read_sm_status + genIFRwDataCode(i, 0x0300, False, 4) + + reset_sm = "" + for i in range(dev_num + 1): + reset_sm = reset_sm + genIFRwDataCode(i, 0x0300, True, 1, [0, ]) + + genPkt.addAfterExc(genWriteTransLenCode(gen_file_def, sm_idx) + +genWriteTransPktCode(gen_file_def, sm_idx) + +genTrgTransPktCode(gen_file_def, sm_idx) + +genReadAckPktCode(gen_file_def, sm_idx) + +chang_sm_length + +read_sm_status + +reset_sm + +read_sm_status + +genMessageCode("--清除主中断") + +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genTcEndFrameCode(gen_file_def)) + genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1) + return gen_file_def + diff --git a/tb/shinTest/testcase/sync.py b/tb/shinTest/testcase/sync.py index 6cf8f68..19728ea 100644 --- a/tb/shinTest/testcase/sync.py +++ b/tb/shinTest/testcase/sync.py @@ -1,2133 +1,2133 @@ -from pyutils import * -from .environment import * - -def tc1(): - genPkt = GenPkt() - - gen_file_def = "sync_tc01" - sm_idx = 0 - tc_des = "发送时钟信息,完成后,从站的系统时间与主站时间完全同步。主站发送\\n" \ - + "自己的时钟和系统延迟,从站利用该信息进行校准自己的时钟。需要在波形软件里确认。\\n" \ - + "仅看通讯数据无法确定系统功能正常。" - #------------------------------------------------------------------------- - #>>>>>>广播包 - genPkt.clean() - genPkt.setPktType(0) - - #subPkt参数:索引、索引类型、地址、命令、长度、数据 - genPkt.addSubPkt(0x0, 0, 0x0, 0xd, 2, [0, 0]) - - - genPkt.addBeforeExc(genTcStartFrameCode(gen_file_def, tc_des) - ) - - sm_idx = 0 - - genPkt.addAfterExc(genWriteTransLenCode(gen_file_def, sm_idx) - +genWriteTransPktCode(gen_file_def, sm_idx) - +genTrgTransPktCode(gen_file_def, sm_idx) - +genReadAckPktCode(gen_file_def, sm_idx) - +genCheckInsertTimeCode() - - +genMessageCode("--清除中断") - +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - - ) - - genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1) - - #------------------------------------------------------------------------- - #>>>>>>同步数据包 - genPkt.clean() - genPkt.setPktType(0) - - #subPkt参数:索引、索引类型、地址、命令、长度、数据 - genPkt.addSubPkt(0x0, 0, 0x0, 0xc, 12, b'\0'*12) - - - genPkt.addBeforeExc(genEnableInsertTimeCode(0xa)) - - sm_idx = 0 - gen_file_def_ap = gen_file_def + "_rw01" - - genPkt.addAfterExc(genWriteTransLenCode(gen_file_def_ap, sm_idx) - +genWriteTransPktCode(gen_file_def_ap, sm_idx) - +genTrgTransPktCode(gen_file_def_ap, sm_idx) - +genReadAckPktCode(gen_file_def_ap, sm_idx) - +genCheckInsertTimeCode() - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - - +genMessageCode("--清除中断") - +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - +genTcEndFrameCode(gen_file_def)) #+genDisableInsertTimeCode()) - - - genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1, True, gen_file_def_ap) - return gen_file_def - - -def tc2(): - genPkt = GenPkt() - - gen_file_def = "sync_tc02" - sm_idx = 0 - tc_des = "配置Sync信号为电平触发,设置SYNC的同步周期,SYNC1、SYNC3的偏移。\\n" \ - + "SYNC触发后,需要手动清除SYNC信号。" - - - #------------------------------------------------------------------------- - #>>>>>>广播包 - genPkt.clean() - genPkt.setPktType(0) - - #subPkt参数:索引、索引类型、地址、命令、长度、数据 - genPkt.addSubPkt(0x0, 0, 0x0, 0xd, 2, [0, 0]) - - - genPkt.addBeforeExc(genTcStartFrameCode(gen_file_def, tc_des) - ) - - sm_idx = 0 - - genPkt.addAfterExc(genWriteTransLenCode(gen_file_def, sm_idx) - +genWriteTransPktCode(gen_file_def, sm_idx) - +genTrgTransPktCode(gen_file_def, sm_idx) - +genReadAckPktCode(gen_file_def, sm_idx) - +genCheckInsertTimeCode() - - +genMessageCode("--清除中断") - +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - - ) - - genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1) - - #------------------------------------------------------------------------- - #>>>>>>设置同步信号的数据包,在波形中确认定时的有效性 - genPkt.clean() - genPkt.setPktType(0) - - genPkt.addBeforeExc(genEnableInsertTimeCode(0xa) - + '''spi_trans( (16'h0100), (`SPI_READ), (8), (`IF_IDX(0)));\n''' - #+ '''_temp_time = rxBuf[3] + (rxBuf[4] << 8) + (rxBuf[5] << 16) + (rxBuf[6] << 24) + (rxBuf[7] << 32) + (rxBuf[8] << 40) + (rxBuf[9] << 48) + (rxBuf[10] << 56);\n''' - + '''_temp_time = rxBuf[`ARRAY_IDX_OFF] + (rxBuf[`ARRAY_IDX_OFF+1] << 8) + (rxBuf[`ARRAY_IDX_OFF+2] << 16) + (rxBuf[`ARRAY_IDX_OFF+3] << 24) + (rxBuf[`ARRAY_IDX_OFF+4] << 32) + (rxBuf[`ARRAY_IDX_OFF+5] << 40) + (rxBuf[`ARRAY_IDX_OFF+6] << 48) + (rxBuf[`ARRAY_IDX_OFF+7] << 56);\n''' - + '''_temp_time = _temp_time + 32'h2000;\n\n''') - - genPkt.addSubPkt(0x0, 0, 0x0, 0xc, 12, b'\0'*12) - genPkt.addSubPkt(0, 0, 0x18, 0xe, 2, [0x1, 0x58]) - - #subPkt参数:索引、索引类型、地址、命令、长度、数据 - data = [0,] * 100 #bytearray(b"\0" * 100) - data[0] = 0xff #地址0x120 - data[2] = 0xa - data[4] = 0xa - data[6] = 0xa - data[8] = 0xa - - data[16] = '''(_temp_time & 8'hff)''' #地址0x130, sync同步点 - data[17] = '''(_temp_time >> 8) & 8'hff''' #地址0x131 - data[18] = '''(_temp_time >> 16) & 8'hff''' - data[19] = '''(_temp_time >> 24) & 8'hff''' - - data[24] = 0x00 #地址0x138, sync周期 4B - data[25] = 0x10 #地址0x139 - - #28, 29, 30, 31 - data[28] = 0x81 #sync1偏移 - data[29] = 0x0 - - - #32,33,34,35 #sync2偏移 - - #36,37,38,39 - data[36] = 0x20 #sync3偏移 - data[37] = 0x00 - - genPkt.addSubPkt(0, 0, 0x120, 0xe, 0x28, data) - genPkt.addSubPkt(0, 0, 0x18, 0xe, 2, [0x0, 0x58]) - - sm_idx = 0 - gen_file_def_ap = gen_file_def + "_rw01" - - genPkt.addAfterExc(genWriteTransLenCode(gen_file_def_ap, sm_idx) - +genWriteTransPktCode(gen_file_def_ap, sm_idx) - +genTrgTransPktCode(gen_file_def_ap, sm_idx) - +genReadAckPktCode(gen_file_def_ap, sm_idx) - +"\n#1000000\n" - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - - +genMessageCode("--清除中断") - +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - +genTcEndFrameCode(gen_file_def) - ) - - - genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1, True, gen_file_def_ap) - return gen_file_def - - - -def tc3(): - genPkt = GenPkt() - - gen_file_def = "sync_tc03" - sm_idx = 0 - tc_des = "SYNC信号采用脉冲触发,4个设备,3个周期;先用广播包发送公共周期;然后3,4设备单独指定周期。\\n" \ - + "需要在波形文件里查看。" - - - #------------------------------------------------------------------------- - #>>>>>>广播包 - genPkt.clean() - genPkt.setPktType(0) - - #subPkt参数:索引、索引类型、地址、命令、长度、数据 - genPkt.addSubPkt(0x0, 0, 0x0, 0xd, 2, [0, 0]) - - - genPkt.addBeforeExc(genTcStartFrameCode(gen_file_def, tc_des) - ) - - sm_idx = 0 - - genPkt.addAfterExc(genWriteTransLenCode(gen_file_def, sm_idx) - +genWriteTransPktCode(gen_file_def, sm_idx) - +genTrgTransPktCode(gen_file_def, sm_idx) - +genReadAckPktCode(gen_file_def, sm_idx) - +genCheckInsertTimeCode() - - +genMessageCode("--清除中断") - +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - - ) - - genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1) - - #------------------------------------------------------------------------- - #>>>>>>设置同步信号的数据包 - genPkt.clean() - genPkt.setPktType(0) - - sm_idx = 3 - - genPkt.addBeforeExc(genEnableInsertTimeCode(0xa, 1, 1) - + '''spi_trans( (16'h0100), (`SPI_READ), (8), (`IF_IDX(0)));\n''' - #+ '''_temp_time = rxBuf[3] + (rxBuf[4] << 8) + (rxBuf[5] << 16) + (rxBuf[6] << 24) + (rxBuf[7] << 32) + (rxBuf[8] << 40) + (rxBuf[9] << 48) + (rxBuf[10] << 56);\n''' - + '''_temp_time = rxBuf[`ARRAY_IDX_OFF] + (rxBuf[`ARRAY_IDX_OFF+1] << 8) + (rxBuf[`ARRAY_IDX_OFF+2] << 16) + (rxBuf[`ARRAY_IDX_OFF+3] << 24) + (rxBuf[`ARRAY_IDX_OFF+4] << 32) + (rxBuf[`ARRAY_IDX_OFF+5] << 40) + (rxBuf[`ARRAY_IDX_OFF+6] << 48) + (rxBuf[`ARRAY_IDX_OFF+7] << 56);\n''' - + '''_temp_time = _temp_time + 32'h4000;\n\n''') - - genPkt.addSubPkt(0x0, 0, 0x0, 0xc, 12, b'\0'*12) - genPkt.addSubPkt(0, 0, 0x18, 0xe, 2, [0x1, 0x58]) - #subPkt参数:索引、索引类型、地址、命令、长度、数据 - data = [0,] * 100 #bytearray(b"\0" * 100) - data[0] = 0x0f #地址0x120 - data[2] = 0xa - data[4] = 0xa - data[6] = 0xa - data[8] = 0xa - - data[16] = '''(_temp_time & 8'hff)''' #地址0x130, sync同步点 - data[17] = '''(_temp_time >> 8) & 8'hff''' #地址0x131 - data[18] = '''(_temp_time >> 16) & 8'hff''' - data[19] = '''(_temp_time >> 24) & 8'hff''' - - data[24] = 0x80 #地址0x138, sync周期 4B - data[25] = 0x00 #地址0x139 - - data[28] = 0x0 #sync1偏移 - data[29] = 0x0 - - data[36] = 0x0 #sync3偏移 - data[37] = 0x0 - - genPkt.addSubPkt(0, 0, 0x120, 0xe, 0x28, data) - - data = [0,] * 100 #bytearray(b"\0" * 100) - data[0] = 0x0f #地址0x120 - data[2] = 0xa - data[4] = 0xa - data[6] = 0xa - data[8] = 0xa - - data[16] = '''(_temp_time & 8'hff)''' #地址0x130, sync同步点 - data[17] = '''(_temp_time >> 8) & 8'hff''' #地址0x131 - data[18] = '''(_temp_time >> 16) & 8'hff''' - data[19] = '''(_temp_time >> 24) & 8'hff''' - - data[24] = 0x00 #地址0x138, sync周期 4B - data[25] = 0x01 #地址0x139 - - data[28] = 0x0 #sync1偏移 - data[29] = 0x0 - - data[36] = 0x0 #sync3偏移 - data[37] = 0x0 - - genPkt.addSubPkt(3, 0, 0x120, 0x1, 0x28, data) - - data = [0,] * 100 #bytearray(b"\0" * 100) - data[0] = 0x0f #地址0x120 - data[2] = 0xa - data[4] = 0xa - data[6] = 0xa - data[8] = 0xa - - data[16] = '''(_temp_time & 8'hff)''' #地址0x130, sync同步点 - data[17] = '''(_temp_time >> 8) & 8'hff''' #地址0x131 - data[18] = '''(_temp_time >> 16) & 8'hff''' - data[19] = '''(_temp_time >> 24) & 8'hff''' - - data[24] = 0x00 #地址0x138, sync周期 4B - data[25] = 0x02 #地址0x139 - - data[28] = 0x0 #sync1偏移 - data[29] = 0x0 - - data[36] = 0x0 #sync3偏移 - data[37] = 0x0 - - genPkt.addSubPkt(4, 0, 0x120, 0x1, 0x28, data) - genPkt.addSubPkt(0, 0, 0x18, 0xe, 2, [0x0, 0x58]) - - gen_file_def_ap = gen_file_def + "_rw01" - - genPkt.addAfterExc(genWriteTransLenCode(gen_file_def_ap, sm_idx) - +genWriteTransPktCode(gen_file_def_ap, sm_idx) - +genTrgTransPktCode(gen_file_def_ap, sm_idx) - +genReadAckPktCode(gen_file_def_ap, sm_idx) - +"#2000000\n" - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - - +genMessageCode("--清除中断") - +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - +genTcEndFrameCode(gen_file_def)) - - genPkt.gen("./generated/shin/%s.vh"%(gen_file_def,), 1, True, gen_file_def_ap) - return gen_file_def - - - -def tc4(): - genPkt = GenPkt() - - gen_file_def = "sync_tc04" - sm_idx = 0 - tc_des = ("同步后,SYNC信号采用脉冲触发,4个设备,4个周期;先用广播包发送公共周期;然后3,4,\\n" - "2设备单独指定周期。一段时间后,重新同步,期望不要打断sync信号的输出。需要在波形文件里查看具体的效果。" - ) - - - #------------------------------------------------------------------------- - #>>>>>>广播包 - genPkt.clean() - genPkt.setPktType(0) - - #subPkt参数:索引、索引类型、地址、命令、长度、数据 - genPkt.addSubPkt(0x0, 0, 0x0, 0xd, 2, [0, 0]) - - - genPkt.addBeforeExc(genTcStartFrameCode(gen_file_def, tc_des) - ) - - sm_idx = 0 - - genPkt.addAfterExc(genWriteTransLenCode(gen_file_def, sm_idx) - +genWriteTransPktCode(gen_file_def, sm_idx) - +genTrgTransPktCode(gen_file_def, sm_idx) - +genReadAckPktCode(gen_file_def, sm_idx) - +genCheckInsertTimeCode() - - +genMessageCode("--清除中断") - +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - - ) - - genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1) - - #------------------------------------------------------------------------- - #>>>>>>设置同步信号的数据包 - genPkt.clean() - genPkt.setPktType(0) - sm_idx = 3 - - genPkt.addBeforeExc(genEnableInsertTimeCode(0xa) - + '''spi_trans( (16'h0100), (`SPI_READ), (8), (`IF_IDX(0)));\n''' - #+ '''_temp_time = rxBuf[3] + (rxBuf[4] << 8) + (rxBuf[5] << 16) + (rxBuf[6] << 24) + (rxBuf[7] << 32) + (rxBuf[8] << 40) + (rxBuf[9] << 48) + (rxBuf[10] << 56);\n''' - + '''_temp_time = rxBuf[`ARRAY_IDX_OFF] + (rxBuf[`ARRAY_IDX_OFF+1] << 8) + (rxBuf[`ARRAY_IDX_OFF+2] << 16) + (rxBuf[`ARRAY_IDX_OFF+3] << 24) + (rxBuf[`ARRAY_IDX_OFF+4] << 32) + (rxBuf[`ARRAY_IDX_OFF+5] << 40) + (rxBuf[`ARRAY_IDX_OFF+6] << 48) + (rxBuf[`ARRAY_IDX_OFF+7] << 56);\n''' - + '''_temp_time = _temp_time + 32'h3000;\n\n''') - - genPkt.addSubPkt(0, 0, 0x18, 0xe, 2, [0x1, 0x58]) - genPkt.addSubPkt(0x0, 0, 0x0, 0xc, 12, b'\0'*12) - - #subPkt参数:索引、索引类型、地址、命令、长度、数据 - data = [0,] * 100 #bytearray(b"\0" * 100) - data[0] = 0x0f #地址0x120 - data[2] = 0xa - data[4] = 0xa - data[6] = 0xa - data[8] = 0xa - - data[16] = '''(_temp_time & 8'hff)''' #地址0x130, sync同步点 - data[17] = '''(_temp_time >> 8) & 8'hff''' #地址0x131 - data[18] = '''(_temp_time >> 16) & 8'hff''' - data[19] = '''(_temp_time >> 24) & 8'hff''' - - data[24] = 0x80 #地址0x138, sync周期 4B - data[25] = 0x00 #地址0x139 - - data[28] = 0x0 #sync1偏移 - data[29] = 0x0 - - data[36] = 0x0#sync3偏移 - data[37] = 0x0 - - genPkt.addSubPkt(0, 0, 0x120, 0xe, 0x28, data) - - data = [0,] * 100 #bytearray(b"\0" * 100) - data[0] = 0x0f #地址0x120 - data[2] = 0xa - data[4] = 0xa - data[6] = 0xa - data[8] = 0xa - - data[16] = '''(_temp_time & 8'hff)''' #地址0x130, sync同步点 - data[17] = '''(_temp_time >> 8) & 8'hff''' #地址0x131 - data[18] = '''(_temp_time >> 16) & 8'hff''' - data[19] = '''(_temp_time >> 24) & 8'hff''' - - data[24] = 0x00 #地址0x138, sync周期 4B - data[25] = 0x01 #地址0x139 - - data[28] = 0x0 #sync1偏移 - data[29] = 0x0 - - data[36] = 0x0 #sync3偏移 - data[37] = 0x0 - - genPkt.addSubPkt(3, 0, 0x120, 0x1, 0x28, data) - - data = [0,] * 100 #bytearray(b"\0" * 100) - data[0] = 0x0f #地址0x120 - data[2] = 0xa - data[4] = 0xa - data[6] = 0xa - data[8] = 0xa - - data[16] = '''(_temp_time & 8'hff)''' #地址0x130, sync同步点 - data[17] = '''(_temp_time >> 8) & 8'hff''' #地址0x131 - data[18] = '''(_temp_time >> 16) & 8'hff''' - data[19] = '''(_temp_time >> 24) & 8'hff''' - - data[24] = 0x00 #地址0x138, sync周期 4B - data[25] = 0x02 #地址0x139 - - data[28] = 0x0 #sync1偏移 - data[29] = 0x0 - - data[36] = 0x0 #sync3偏移 - data[37] = 0x0 - - genPkt.addSubPkt(4, 0, 0x120, 0x1, 0x28, data) - - data = [0,] * 100 #bytearray(b"\0" * 100) - data[0] = 0x0f #地址0x120 - data[2] = 0xa - data[4] = 0xa - data[6] = 0xa - data[8] = 0xa - - data[16] = '''(_temp_time & 8'hff)''' #地址0x130, sync同步点 - data[17] = '''(_temp_time >> 8) & 8'hff''' #地址0x131 - data[18] = '''(_temp_time >> 16) & 8'hff''' - data[19] = '''(_temp_time >> 24) & 8'hff''' - - data[24] = 0x00 #地址0x138, sync周期 4B - data[25] = 0x04 #地址0x139genPkt.addBeforeExc( - - data[28] = 0x0 #sync1偏移 - data[29] = 0x0 - - data[36] = 0x0 #sync3偏移 - data[37] = 0x0 - - genPkt.addSubPkt(2, 0, 0x120, 0x1, 0x28, data) - genPkt.addSubPkt(0, 0, 0x18, 0xe, 2, [0x0, 0x58]) - - gen_file_def_ap = gen_file_def + "_rw01" - genPkt.addAfterExc(genWriteTransLenCode(gen_file_def_ap, sm_idx) - +genWriteTransPktCode(gen_file_def_ap, sm_idx) - +genTrgTransPktCode(gen_file_def_ap, sm_idx) - +genReadAckPktCode(gen_file_def_ap, sm_idx) - - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - - +genMessageCode("--清除中断") - +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - ) - - genPkt.gen("./generated/shin/%s.vh"%(gen_file_def,), 1, True, gen_file_def_ap) - - #>>>>>>同步数据包 - genPkt.clean() - genPkt.setPktType(0) - - #subPkt参数:索引、索引类型、地址、命令、长度、数据 - genPkt.addSubPkt(0x0, 0, 0x0, 0xc, 12, [0, ] * 12) - genPkt.addSubPkt(0x0, 0, 0x0, 0xd, 10, [0, ] * 10) - genPkt.addSubPkt(0x0, 0, 0x0, 0xd, 10, [0, ] * 10) - - - - - genPkt.addBeforeExc(genEnableInsertTimeCode(0xa))# + 18 + 18)) - - sm_idx = 0 - - gen_file_def_ap = gen_file_def + "_rw02" - - genPkt.addAfterExc(genWriteTransLenCode(gen_file_def_ap, sm_idx) - +genWriteTransPktCode(gen_file_def_ap, sm_idx) - +genTrgTransPktCode(gen_file_def_ap, sm_idx) - +genReadAckPktCode(gen_file_def_ap, sm_idx) - +genCheckInsertTimeCode() - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - - +genMessageCode("--清除中断") - +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - +genTcEndFrameCode(gen_file_def)) #+genDisableInsertTimeCode()) - - - genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1, True, gen_file_def_ap) - return gen_file_def - - -def tc5(): - genPkt = GenPkt() - - gen_file_def = "sync_tc05" - sm_idx = 0 - tc_des = "先同步,输出sync信号;然后RESET,仅复位4号设备,链路和网络被破坏;发送广播包只能到1/2/3, 4收不到。\\n" \ - + "然后检查同步信号是否能正常工作。然后对设备4进行必要的恢复工作。通过嗅探包、设置顺序地址命令等重新建立网络。" - - - #------------------------------------------------------------------------- - #>>>>>>广播包 - genPkt.clean() - genPkt.setPktType(0) - - #subPkt参数:索引、索引类型、地址、命令、长度、数据 - genPkt.addSubPkt(0x0, 0, 0x0, 0xd, 2, [0, 0]) - - - genPkt.addBeforeExc(genTcStartFrameCode(gen_file_def, tc_des) - ) - - sm_idx = 0 - - genPkt.addAfterExc(genWriteTransLenCode(gen_file_def, sm_idx) - +genWriteTransPktCode(gen_file_def, sm_idx) - +genTrgTransPktCode(gen_file_def, sm_idx) - +genReadAckPktCode(gen_file_def, sm_idx) - +genCheckInsertTimeCode() - - +genMessageCode("--清除中断") - +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - - ) - - genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1) - - #------------------------------------------------------------------------- - #>>>>>>设置同步信号的数据包 - genPkt.clean() - genPkt.setPktType(0) - sm_idx = 3 - - genPkt.addBeforeExc(genEnableInsertTimeCode(0xa) - + '''spi_trans( (16'h0100), (`SPI_READ), (8), (`IF_IDX(0)));\n''' - #+ '''_temp_time = rxBuf[3] + (rxBuf[4] << 8) + (rxBuf[5] << 16) + (rxBuf[6] << 24) + (rxBuf[7] << 32) + (rxBuf[8] << 40) + (rxBuf[9] << 48) + (rxBuf[10] << 56);\n''' - + '''_temp_time = rxBuf[`ARRAY_IDX_OFF] + (rxBuf[`ARRAY_IDX_OFF+1] << 8) + (rxBuf[`ARRAY_IDX_OFF+2] << 16) + (rxBuf[`ARRAY_IDX_OFF+3] << 24) + (rxBuf[`ARRAY_IDX_OFF+4] << 32) + (rxBuf[`ARRAY_IDX_OFF+5] << 40) + (rxBuf[`ARRAY_IDX_OFF+6] << 48) + (rxBuf[`ARRAY_IDX_OFF+7] << 56);\n''' - + '''_temp_time = _temp_time + 32'h3000;\n\n''') - - genPkt.addSubPkt(0, 0, 0x18, 0xe, 2, [0x1, 0x58]) - genPkt.addSubPkt(0x0, 0, 0x0, 0xc, 12, b'\0'*12) - - #subPkt参数:索引、索引类型、地址、命令、长度、数据 - data = [0,] * 100 #bytearray(b"\0" * 100) - data[0] = 0x0f #地址0x120 - data[2] = 0xa - data[4] = 0xa - data[6] = 0xa - data[8] = 0xa - - data[16] = '''(_temp_time & 8'hff)''' #地址0x130, sync同步点 - data[17] = '''(_temp_time >> 8) & 8'hff''' #地址0x131 - data[18] = '''(_temp_time >> 16) & 8'hff''' - data[19] = '''(_temp_time >> 24) & 8'hff''' - - data[24] = 0x80 #地址0x138, sync周期 4B - data[25] = 0x00 #地址0x139 - - data[28] = 0x0 #sync1偏移 - data[29] = 0x0 - - data[36] = 0x0#sync3偏移 - data[37] = 0x0 - - genPkt.addSubPkt(0, 0, 0x120, 0xe, 0x28, data) - - data = [0,] * 100 #bytearray(b"\0" * 100) - data[0] = 0x0f #地址0x120 - data[2] = 0xa - data[4] = 0xa - data[6] = 0xa - data[8] = 0xa - - data[16] = '''(_temp_time & 8'hff)''' #地址0x130, sync同步点 - data[17] = '''(_temp_time >> 8) & 8'hff''' #地址0x131 - data[18] = '''(_temp_time >> 16) & 8'hff''' - data[19] = '''(_temp_time >> 24) & 8'hff''' - - data[24] = 0x00 #地址0x138, sync周期 4B - data[25] = 0x01 #地址0x139 - - data[28] = 0x0 #sync1偏移 - data[29] = 0x0 - - data[36] = 0x0 #sync3偏移 - data[37] = 0x0 - - genPkt.addSubPkt(3, 0, 0x120, 0x1, 0x28, data) - - data = [0,] * 100 #bytearray(b"\0" * 100) - data[0] = 0x0f #地址0x120 - data[2] = 0xa - data[4] = 0xa - data[6] = 0xa - data[8] = 0xa - - data[16] = '''(_temp_time & 8'hff)''' #地址0x130, sync同步点 - data[17] = '''(_temp_time >> 8) & 8'hff''' #地址0x131 - data[18] = '''(_temp_time >> 16) & 8'hff''' - data[19] = '''(_temp_time >> 24) & 8'hff''' - - data[24] = 0x00 #地址0x138, sync周期 4B - data[25] = 0x02 #地址0x139 - - data[28] = 0x0 #sync1偏移 - data[29] = 0x0 - - data[36] = 0x0 #sync3偏移 - data[37] = 0x0 - - genPkt.addSubPkt(4, 0, 0x120, 0x1, 0x28, data) - - data = [0,] * 100 #bytearray(b"\0" * 100) - data[0] = 0x0f #地址0x120 - data[2] = 0xa - data[4] = 0xa - data[6] = 0xa - data[8] = 0xa - - data[16] = '''(_temp_time & 8'hff)''' #地址0x130, sync同步点 - data[17] = '''(_temp_time >> 8) & 8'hff''' #地址0x131 - data[18] = '''(_temp_time >> 16) & 8'hff''' - data[19] = '''(_temp_time >> 24) & 8'hff''' - - data[24] = 0x00 #地址0x138, sync周期 4B - data[25] = 0x04 #地址0x139genPkt.addBeforeExc( - - data[28] = 0x0 #sync1偏移 - data[29] = 0x0 - - data[36] = 0x0 #sync3偏移 - data[37] = 0x0 - - genPkt.addSubPkt(2, 0, 0x120, 0x1, 0x28, data) - genPkt.addSubPkt(0, 0, 0x18, 0xe, 2, [0x0, 0x58]) - - - gen_file_def_ap = gen_file_def + "_rw00" - - genPkt.addAfterExc(genWriteTransLenCode(gen_file_def_ap, sm_idx) - +genWriteTransPktCode(gen_file_def_ap, sm_idx) - +genTrgTransPktCode(gen_file_def_ap, sm_idx) - +genReadAckPktCode(gen_file_def_ap, sm_idx) - - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - - +genMessageCode("--清除中断") - +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - ) - - genPkt.gen("./generated/shin/%s.vh"%(gen_file_def,), 1, True, gen_file_def_ap) - - - #>>>>>>设置顺序地址 - genPkt.clean() - genPkt.setPktType(0) - - - - reset_data = [0x01, 0x00, 0x66, 0x79] - - genPkt.addBeforeExc("#50000\n" - +genIFRwDataCode(0, 0x78, False, 4) - +genIFRwDataCode(4, 0x40, True, 4, reset_data) - +"\n#5000\n" - #+genIFRwDataCode(0, 0x09, True, 1, [0, ], False, iface=1) - #+genIFRwDataCode(2, 0x09, True, 1, [0, ], False, iface=1) - #+genIFRwDataCode(0, 0x74, False, 4) - #+genIFRwDataCode(2, 0x74, False, 4) - #+genIFRwDataCode(0, 0x40, False, 4) - #+genIFRwDataCode(2, 0x40, False, 4) - #+genIFRwDataCode(0, 0x00, True, 1, [0x01, ]) - #+genIFRwDataCode(2, 0x00, True, 1, [0x02, ]) - ) - - - data = [0,] * 128 - - - #subPkt参数:索引、索引类型、地址、命令、长度、数据 - genPkt.addSubPkt(0x0, 0, 0x0, 0xd, 128, data) - - - sm_idx = 0 - gen_file_def_ap = gen_file_def + "_rw01" - - genPkt.addAfterExc(genWriteTransLenCode(gen_file_def_ap, sm_idx) - +genWriteTransPktCode(gen_file_def_ap, sm_idx) - +genTrgTransPktCode(gen_file_def_ap, sm_idx) - +genReadAckPktCode(gen_file_def_ap, sm_idx) - - +genMessageCode("--清除中断") - +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - ) - genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1, True, gen_file_def_ap) - - #------------------------------------------------------------------------------ - genPkt.clean() - genPkt.setPktType(1) - - genPkt.addBeforeExc(genIFRwDataCode(1, 0xc0, False, 4) - +genIFRwDataCode(2, 0xc0, False, 4) - +genIFRwDataCode(3, 0xc0, False, 4) - - #+genIFRwDataCode(4, 0x09, True, 1, [0, ], False, iface=1) - +using_proper_workmode(4) - +genIFRwDataCode(4, 0x00, True, 1, [0x2, ]) - +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - - +genIFRwDataCode(4, 0xc0, False, 4) - ) - - gen_file_def_ap = gen_file_def + "_rw02" - sm_idx = 0 - - genPkt.addAfterExc(genWriteTransLenCode(gen_file_def_ap, sm_idx) - +genWriteTransPktCode(gen_file_def_ap, sm_idx) - +genTrgTransPktCode(gen_file_def_ap, sm_idx) - +genReadAckPktCode(gen_file_def_ap, sm_idx) - #+genTcEndFrameCode(gen_file_def) - +genIFRwDataCode(1, 0xc0, False, 4) - +genIFRwDataCode(2, 0xc0, False, 4) - +genIFRwDataCode(3, 0xc0, False, 4) - +genIFRwDataCode(4, 0xc0, False, 4) - ) - - genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1, True, gen_file_def_ap) - - #------------------------------------------------------------------------------ - genPkt.clean() - genPkt.setPktType(0) - - gen_file_def_ap = gen_file_def + "_rw03" - sm_idx = 0 - - data = [0x3f, 0xff] - genPkt.addSubPkt(0x0, 0, 0x0, 0xb, 2, data) - - genPkt.addAfterExc(genWriteTransLenCode(gen_file_def_ap, sm_idx) - +genWriteTransPktCode(gen_file_def_ap, sm_idx) - +genTrgTransPktCode(gen_file_def_ap, sm_idx) - +genReadAckPktCode(gen_file_def_ap, sm_idx) - #+genTcEndFrameCode(gen_file_def) - +genIFRwDataCode(1, 0xc0, False, 4) - +genIFRwDataCode(2, 0xc0, False, 4) - +genIFRwDataCode(3, 0xc0, False, 4) - +genIFRwDataCode(4, 0xc0, False, 4) - ) - - genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1, True, gen_file_def_ap) - - - #------------------------------------------------------------------------------ - genPkt.clean() - genPkt.setPktType(1) - - genPkt.addBeforeExc(genIFRwDataCode(1, 0xc0, False, 4) - +genIFRwDataCode(2, 0xc0, False, 4) - +genIFRwDataCode(3, 0xc0, False, 4) - +genIFRwDataCode(4, 0xc0, False, 4) - ) - - gen_file_def_ap = gen_file_def + "_rw04" - sm_idx = 0 - - genPkt.addAfterExc(genWriteTransLenCode(gen_file_def_ap, sm_idx) - +genWriteTransPktCode(gen_file_def_ap, sm_idx) - +genTrgTransPktCode(gen_file_def_ap, sm_idx) - +genReadAckPktCode(gen_file_def_ap, sm_idx) - +genIFRwDataCode(1, 0xc0, False, 4) - +genIFRwDataCode(2, 0xc0, False, 4) - +genIFRwDataCode(3, 0xc0, False, 4) - +genIFRwDataCode(4, 0xc0, False, 4) - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - +genMessageCode("--清除中断") - +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genTcEndFrameCode(gen_file_def) - ) - - genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1, True, gen_file_def_ap) - - - return gen_file_def - - -def tc6(): - genPkt = GenPkt() - - gen_file_def = "sync_tc06" - sm_idx = 0 - tc_des = ("同步后,SYNC信号采用脉冲触发,4个设备,4个周期;先用广播包发送公共周期;然后3,4,\\n" - "2设备单独指定周期。该同步数据之前没有补广播包。如果紧跟嗅探包而不是普通包之后,可能会影响同步。\\n" - "期望是无论前面发送得是什么包,都不会影响同步的效果。一段时间后,重新同步,期望不要打断sync\\n" - "信号的输出。需要在波形文件里查看具体的效果。" - ) - - - #------------------------------------------------------------------------- - #>>>>>>设置同步信号的数据包 - genPkt.clean() - genPkt.setPktType(0) - sm_idx = 3 - - genPkt.addBeforeExc(genTcStartFrameCode(gen_file_def, tc_des) - +genEnableInsertTimeCode(0xa) - + '''spi_trans( (16'h0100), (`SPI_READ), (8), (`IF_IDX(0)));\n''' - #+ '''_temp_time = rxBuf[3] + (rxBuf[4] << 8) + (rxBuf[5] << 16) + (rxBuf[6] << 24) + (rxBuf[7] << 32) + (rxBuf[8] << 40) + (rxBuf[9] << 48) + (rxBuf[10] << 56);\n''' - + '''_temp_time = rxBuf[`ARRAY_IDX_OFF] + (rxBuf[`ARRAY_IDX_OFF+1] << 8) + (rxBuf[`ARRAY_IDX_OFF+2] << 16) + (rxBuf[`ARRAY_IDX_OFF+3] << 24) + (rxBuf[`ARRAY_IDX_OFF+4] << 32) + (rxBuf[`ARRAY_IDX_OFF+5] << 40) + (rxBuf[`ARRAY_IDX_OFF+6] << 48) + (rxBuf[`ARRAY_IDX_OFF+7] << 56);\n''' - + '''_temp_time = _temp_time + 32'h3000;\n\n''') - - genPkt.addSubPkt(0x0, 0, 0x0, 0xc, 12, b'\0'*12) - - genPkt.addSubPkt(0, 0, 0x18, 0xe, 2, [0x1, 0x58]) - #subPkt参数:索引、索引类型、地址、命令、长度、数据 - data = [0,] * 100 #bytearray(b"\0" * 100) - data[0] = 0x0f #地址0x120 - data[2] = 0xa - data[4] = 0xa - data[6] = 0xa - data[8] = 0xa - - data[16] = '''(_temp_time & 8'hff)''' #地址0x130, sync同步点 - data[17] = '''(_temp_time >> 8) & 8'hff''' #地址0x131 - data[18] = '''(_temp_time >> 16) & 8'hff''' - data[19] = '''(_temp_time >> 24) & 8'hff''' - - data[24] = 0x80 #地址0x138, sync周期 4B - data[25] = 0x00 #地址0x139 - - data[28] = 0x0 #sync1偏移 - data[29] = 0x0 - - data[36] = 0x0#sync3偏移 - data[37] = 0x0 - - genPkt.addSubPkt(0, 0, 0x120, 0xe, 0x28, data) - - data = [0,] * 100 #bytearray(b"\0" * 100) - data[0] = 0x0f #地址0x120 - data[2] = 0xa - data[4] = 0xa - data[6] = 0xa - data[8] = 0xa - - data[16] = '''(_temp_time & 8'hff)''' #地址0x130, sync同步点 - data[17] = '''(_temp_time >> 8) & 8'hff''' #地址0x131 - data[18] = '''(_temp_time >> 16) & 8'hff''' - data[19] = '''(_temp_time >> 24) & 8'hff''' - - data[24] = 0x00 #地址0x138, sync周期 4B - data[25] = 0x01 #地址0x139 - - data[28] = 0x0 #sync1偏移 - data[29] = 0x0 - - data[36] = 0x0 #sync3偏移 - data[37] = 0x0 - - genPkt.addSubPkt(3, 0, 0x120, 0x1, 0x28, data) - - data = [0,] * 100 #bytearray(b"\0" * 100) - data[0] = 0x0f #地址0x120 - data[2] = 0xa - data[4] = 0xa - data[6] = 0xa - data[8] = 0xa - - data[16] = '''(_temp_time & 8'hff)''' #地址0x130, sync同步点 - data[17] = '''(_temp_time >> 8) & 8'hff''' #地址0x131 - data[18] = '''(_temp_time >> 16) & 8'hff''' - data[19] = '''(_temp_time >> 24) & 8'hff''' - - data[24] = 0x00 #地址0x138, sync周期 4B - data[25] = 0x02 #地址0x139 - - data[28] = 0x0 #sync1偏移 - data[29] = 0x0 - - data[36] = 0x0 #sync3偏移 - data[37] = 0x0 - - genPkt.addSubPkt(4, 0, 0x120, 0x1, 0x28, data) - - data = [0,] * 100 #bytearray(b"\0" * 100) - data[0] = 0x0f #地址0x120 - data[2] = 0xa - data[4] = 0xa - data[6] = 0xa - data[8] = 0xa - - data[16] = '''(_temp_time & 8'hff)''' #地址0x130, sync同步点 - data[17] = '''(_temp_time >> 8) & 8'hff''' #地址0x131 - data[18] = '''(_temp_time >> 16) & 8'hff''' - data[19] = '''(_temp_time >> 24) & 8'hff''' - - data[24] = 0x00 #地址0x138, sync周期 4B - data[25] = 0x04 #地址0x139genPkt.addBeforeExc( - - data[28] = 0x0 #sync1偏移 - data[29] = 0x0 - - data[36] = 0x0 #sync3偏移 - data[37] = 0x0 - - genPkt.addSubPkt(2, 0, 0x120, 0x1, 0x28, data) - genPkt.addSubPkt(0, 0, 0x18, 0xe, 2, [0x0, 0x58]) - - #gen_file_def_ap = gen_file_def + "_rw01" - genPkt.addAfterExc(genWriteTransLenCode(gen_file_def, sm_idx) - +genWriteTransPktCode(gen_file_def, sm_idx) - +genTrgTransPktCode(gen_file_def, sm_idx) - +genReadAckPktCode(gen_file_def, sm_idx) - - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - - +genMessageCode("--清除中断") - +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - ) - - genPkt.gen("./generated/shin/%s.vh"%(gen_file_def,), 1) - - #>>>>>>同步数据包 - genPkt.clean() - genPkt.setPktType(0) - - #subPkt参数:索引、索引类型、地址、命令、长度、数据 - genPkt.addSubPkt(0x0, 0, 0x0, 0xc, 12, [0, ] * 12) - genPkt.addSubPkt(0x0, 0, 0x0, 0xd, 10, [0, ] * 10) - genPkt.addSubPkt(0x0, 0, 0x0, 0xd, 10, [0, ] * 10) - - - - - genPkt.addBeforeExc(genEnableInsertTimeCode(0xa))# + 18 + 18)) - - sm_idx = 0 - - gen_file_def_ap = gen_file_def + "_rw02" - - genPkt.addAfterExc(genWriteTransLenCode(gen_file_def_ap, sm_idx) - +genWriteTransPktCode(gen_file_def_ap, sm_idx) - +genTrgTransPktCode(gen_file_def_ap, sm_idx) - +genReadAckPktCode(gen_file_def_ap, sm_idx) - +genCheckInsertTimeCode() - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - - +genMessageCode("--清除中断") - +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - - #+"#5000000" - #+genIFRwDataCode(0, 0x40, True, 4, [0x01, 0x00, 0x66, 0x79]) - +genTcEndFrameCode(gen_file_def)) #+genDisableInsertTimeCode()) - - - genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1, True, gen_file_def_ap) - return gen_file_def - - -def tc7(): - genPkt = GenPkt() - - gen_file_def = "sync_tc07" - sm_idx = 0 - tc_des = ("同步后,SYNC信号采用脉冲触发,4个设备,4个周期;先用广播包发送公共周期;然后3,4,\\n" - "2设备单独指定周期。该同步数据之前没有补广播包。如果紧跟嗅探包而不是普通包之后,可能会影响同步。\\n" - "期望是无论前面发送得是什么包,都不会影响同步的效果。一段时间后,重新同步,期望不要打断sync\\n" - "信号的输出。需要在波形文件里查看具体的效果。" - ) - - - #------------------------------------------------------------------------- - #>>>>>>设置同步信号的数据包 - genPkt.clean() - genPkt.setPktType(0) - sm_idx = 3 - - genPkt.addBeforeExc(genTcStartFrameCode(gen_file_def, tc_des) - +genEnableInsertTimeCode(0xa) - + '''spi_trans( (16'h0100), (`SPI_READ), (8), (`IF_IDX(0)));\n''' - #+ '''_temp_time = rxBuf[3] + (rxBuf[4] << 8) + (rxBuf[5] << 16) + (rxBuf[6] << 24) + (rxBuf[7] << 32) + (rxBuf[8] << 40) + (rxBuf[9] << 48) + (rxBuf[10] << 56);\n''' - + '''_temp_time = rxBuf[`ARRAY_IDX_OFF] + (rxBuf[`ARRAY_IDX_OFF+1] << 8) + (rxBuf[`ARRAY_IDX_OFF+2] << 16) + (rxBuf[`ARRAY_IDX_OFF+3] << 24) + (rxBuf[`ARRAY_IDX_OFF+4] << 32) + (rxBuf[`ARRAY_IDX_OFF+5] << 40) + (rxBuf[`ARRAY_IDX_OFF+6] << 48) + (rxBuf[`ARRAY_IDX_OFF+7] << 56);\n''' - + '''_temp_time = _temp_time + 32'h3000;\n\n''') - - genPkt.addSubPkt(0x0, 0, 0x0, 0xc, 12, b'\0'*12) - genPkt.addSubPkt(0, 0, 0x18, 0xe, 2, [0x1, 0x58]) - - #subPkt参数:索引、索引类型、地址、命令、长度、数据 - data = [0,] * 100 #bytearray(b"\0" * 100) - data[0] = 0x0f #地址0x120 - data[2] = 0xa - data[4] = 0xa - data[6] = 0xa - data[8] = 0xa - - data[16] = '''(_temp_time & 8'hff)''' #地址0x130, sync同步点 - data[17] = '''(_temp_time >> 8) & 8'hff''' #地址0x131 - data[18] = '''(_temp_time >> 16) & 8'hff''' - data[19] = '''(_temp_time >> 24) & 8'hff''' - - data[24] = 0x80 #地址0x138, sync周期 4B - data[25] = 0x00 #地址0x139 - - data[28] = 0x0 #sync1偏移 - data[29] = 0x0 - - data[36] = 0x0#sync3偏移 - data[37] = 0x0 - - genPkt.addSubPkt(0, 0, 0x120, 0xe, 0x28, data) - - data = [0,] * 100 #bytearray(b"\0" * 100) - data[0] = 0x0f #地址0x120 - data[2] = 0xa - data[4] = 0xa - data[6] = 0xa - data[8] = 0xa - - data[16] = '''(_temp_time & 8'hff)''' #地址0x130, sync同步点 - data[17] = '''(_temp_time >> 8) & 8'hff''' #地址0x131 - data[18] = '''(_temp_time >> 16) & 8'hff''' - data[19] = '''(_temp_time >> 24) & 8'hff''' - - data[24] = 0x00 #地址0x138, sync周期 4B - data[25] = 0x01 #地址0x139 - - data[28] = 0x0 #sync1偏移 - data[29] = 0x0 - - data[36] = 0x0 #sync3偏移 - data[37] = 0x0 - - genPkt.addSubPkt(3, 0, 0x120, 0x1, 0x28, data) - - data = [0,] * 100 #bytearray(b"\0" * 100) - data[0] = 0x0f #地址0x120 - data[2] = 0xa - data[4] = 0xa - data[6] = 0xa - data[8] = 0xa - - data[16] = '''(_temp_time & 8'hff)''' #地址0x130, sync同步点 - data[17] = '''(_temp_time >> 8) & 8'hff''' #地址0x131 - data[18] = '''(_temp_time >> 16) & 8'hff''' - data[19] = '''(_temp_time >> 24) & 8'hff''' - - data[24] = 0x00 #地址0x138, sync周期 4B - data[25] = 0x02 #地址0x139 - - data[28] = 0x0 #sync1偏移 - data[29] = 0x0 - - data[36] = 0x0 #sync3偏移 - data[37] = 0x0 - - genPkt.addSubPkt(4, 0, 0x120, 0x1, 0x28, data) - - data = [0,] * 100 #bytearray(b"\0" * 100) - data[0] = 0x0f #地址0x120 - data[2] = 0xa - data[4] = 0xa - data[6] = 0xa - data[8] = 0xa - - data[16] = '''(_temp_time & 8'hff)''' #地址0x130, sync同步点 - data[17] = '''(_temp_time >> 8) & 8'hff''' #地址0x131 - data[18] = '''(_temp_time >> 16) & 8'hff''' - data[19] = '''(_temp_time >> 24) & 8'hff''' - - data[24] = 0x00 #地址0x138, sync周期 4B - data[25] = 0x04 #地址0x139genPkt.addBeforeExc( - - data[28] = 0x0 #sync1偏移 - data[29] = 0x0 - - data[36] = 0x0 #sync3偏移 - data[37] = 0x0 - - genPkt.addSubPkt(2, 0, 0x120, 0x1, 0x28, data) - genPkt.addSubPkt(0, 0, 0x18, 0xe, 2, [0x0, 0x58]) - - #gen_file_def_ap = gen_file_def + "_rw01" - genPkt.addAfterExc(genWriteTransLenCode(gen_file_def, sm_idx) - +genWriteTransPktCode(gen_file_def, sm_idx) - +genTrgTransPktCode(gen_file_def, sm_idx) - +genReadAckPktCode(gen_file_def, sm_idx) - - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - - +genMessageCode("--清除中断") - +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - ) - - genPkt.gen("./generated/shin/%s.vh"%(gen_file_def,), 1) - - #>>>>>>同步数据包 - genPkt.clean() - genPkt.setPktType(0) - - #subPkt参数:索引、索引类型、地址、命令、长度、数据 - genPkt.addSubPkt(0x0, 0, 0x0, 0xc, 12, [0, ] * 12) - genPkt.addSubPkt(0x0, 0, 0x0, 0xd, 10, [0, ] * 10) - genPkt.addSubPkt(0x0, 0, 0x0, 0xd, 10, [0, ] * 10) - - - - - genPkt.addBeforeExc(genEnableInsertTimeCode(0xa))# + 18 + 18)) - - sm_idx = 0 - - gen_file_def_ap = gen_file_def + "_rw02" - - genPkt.addAfterExc(genWriteTransLenCode(gen_file_def_ap, sm_idx) - +genWriteTransPktCode(gen_file_def_ap, sm_idx) - +genTrgTransPktCode(gen_file_def_ap, sm_idx) - +genReadAckPktCode(gen_file_def_ap, sm_idx) - +genCheckInsertTimeCode() - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - - +genMessageCode("--清除中断") - +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - - +"#5000000" - +genIFRwDataCode(0, 0x40, True, 4, [0x01, 0x00, 0x66, 0x79]) - ) #+genDisableInsertTimeCode()) - - - genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1, True, gen_file_def_ap) - - - genPkt.clean() - genPkt.setPktType(0) - sm_idx = 1 - - genPkt.addBeforeExc("\n#5000\n" - #+genIFRwDataCode(0, 0x09, True, 1, [0, ], False, iface=1) - +using_proper_workmode(0) - - +genIFRwDataCode(0, 0x74, False, 4) - #+genIFRwDataCode(0, 0x40, False, 4) - +genIFRwDataCode(0, 0x00, True, 1, [0x1, ]) - ) - - genPkt.addSubPkt(0x0, 0, 0x180, 0xd, 10, b'\0'*10) - - gen_file_def_ap = gen_file_def + "_rw03" - genPkt.addAfterExc(genWriteTransLenCode(gen_file_def_ap, sm_idx) - +genWriteTransPktCode(gen_file_def_ap, sm_idx) - +genTrgTransPktCode(gen_file_def_ap, sm_idx) - +genReadAckPktCode(gen_file_def_ap, sm_idx) - - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - - +genMessageCode("--清除中断") - +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - ) - - genPkt.gen("./generated/shin/%s.vh"%(gen_file_def,), 1, True, gen_file_def_ap) - - - genPkt.clean() - genPkt.setPktType(0) - sm_idx = 1 - - - genPkt.addBeforeExc(genEnableInsertTimeCode(0xa) - + '''spi_trans( (16'h0100), (`SPI_READ), (8), (`IF_IDX(0)));\n''' - #+ '''_temp_time = rxBuf[3] + (rxBuf[4] << 8) + (rxBuf[5] << 16) + (rxBuf[6] << 24) + (rxBuf[7] << 32) + (rxBuf[8] << 40) + (rxBuf[9] << 48) + (rxBuf[10] << 56);\n''' - + '''_temp_time = rxBuf[`ARRAY_IDX_OFF] + (rxBuf[`ARRAY_IDX_OFF+1] << 8) + (rxBuf[`ARRAY_IDX_OFF+2] << 16) + (rxBuf[`ARRAY_IDX_OFF+3] << 24) + (rxBuf[`ARRAY_IDX_OFF+4] << 32) + (rxBuf[`ARRAY_IDX_OFF+5] << 40) + (rxBuf[`ARRAY_IDX_OFF+6] << 48) + (rxBuf[`ARRAY_IDX_OFF+7] << 56);\n''' - + '''_temp_time = _temp_time + 32'h3000;\n\n''' - + '''txBuf[`ARRAY_IDX_OFF] = 8'h0f;\n''' - + '''txBuf[`ARRAY_IDX_OFF+1] = 8'h00;\n''' - + '''txBuf[`ARRAY_IDX_OFF+2] = 8'h0a;\n''' - + '''txBuf[`ARRAY_IDX_OFF+3] = 8'h00;\n''' - + '''txBuf[`ARRAY_IDX_OFF+4] = 8'h0a;\n''' - + '''txBuf[`ARRAY_IDX_OFF+5] = 8'h00;\n''' - + '''txBuf[`ARRAY_IDX_OFF+6] = 8'h0a;\n''' - + '''txBuf[`ARRAY_IDX_OFF+7] = 8'h00;\n''' - + '''txBuf[`ARRAY_IDX_OFF+8] = 8'h01;\n''' - + '''txBuf[`ARRAY_IDX_OFF+9] = 8'h00;\n''' - + '''txBuf[`ARRAY_IDX_OFF+16] = (_temp_time & 8'hff);\n''' - + '''txBuf[`ARRAY_IDX_OFF+17] = ( (_temp_time >> 8) & 8'hff);\n''' - + '''txBuf[`ARRAY_IDX_OFF+18] = ((_temp_time >> 16) & 8'hff);\n''' - + '''txBuf[`ARRAY_IDX_OFF+19] = ((_temp_time >> 24) & 8'hff);\n''' - + '''txBuf[`ARRAY_IDX_OFF+20] = ((_temp_time >> 32) & 8'hff);\n''' - + '''txBuf[`ARRAY_IDX_OFF+21] = 0;\n''' - + '''txBuf[`ARRAY_IDX_OFF+22] = 0;\n''' - + '''txBuf[`ARRAY_IDX_OFF+23] = 0;\n''' - + '''txBuf[`ARRAY_IDX_OFF+24] = 8'h80;\n''' - + '''txBuf[`ARRAY_IDX_OFF+25] = 8'h00;\n''' - + '''txBuf[`ARRAY_IDX_OFF+26] = 8'h00;\n''' - + '''txBuf[`ARRAY_IDX_OFF+27] = 8'h00;\n''' - + '''txBuf[`ARRAY_IDX_OFF+28] = 8'h00;\n''' - + '''txBuf[`ARRAY_IDX_OFF+29] = 8'h00;\n''' - + '''txBuf[`ARRAY_IDX_OFF+30] = 8'h00;\n''' - + '''txBuf[`ARRAY_IDX_OFF+31] = 8'h00;\n''' - + '''txBuf[`ARRAY_IDX_OFF+32] = 8'h00;\n''' - + '''txBuf[`ARRAY_IDX_OFF+33] = 8'h00;\n''' - + '''txBuf[`ARRAY_IDX_OFF+34] = 8'h00;\n''' - + '''txBuf[`ARRAY_IDX_OFF+35] = 8'h00;\n''' - + '''txBuf[`ARRAY_IDX_OFF+36] = 8'h00;\n''' - + '''txBuf[`ARRAY_IDX_OFF+37] = 8'h00;\n''' - + '''txBuf[`ARRAY_IDX_OFF+38] = 8'h00;\n''' - + '''txBuf[`ARRAY_IDX_OFF+39] = 8'h00;\n''' - + '''spi_trans( (16'h0120), (`SPI_WRITE), (40), (`IF_IDX(0)));\n''' - ) - - genPkt.addSubPkt(0x0, 0, 0x0, 0xc, 12, b'\0'*12) - genPkt.addSubPkt(0, 0, 0x18, 0xe, 2, [0x1, 0x58]) - #subPkt参数:索引、索引类型、地址、命令、长度、数据 - data = [0,] * 100 #bytearray(b"\0" * 100) - data[0] = 0x0f #地址0x120 - data[1] = 0x0 - data[2] = 0xa - data[3] = 0x0 - data[4] = 0xa - data[5] = 0x0 - data[6] = 0xa - data[8] = 0xa - - data[16] = '''(_temp_time & 8'hff)''' #地址0x130, sync同步点 - data[17] = '''(_temp_time >> 8) & 8'hff''' #地址0x131 - data[18] = '''(_temp_time >> 16) & 8'hff''' - data[19] = '''(_temp_time >> 24) & 8'hff''' - - data[24] = 0x80 #地址0x138, sync周期 4B - data[25] = 0x00 #地址0x139 - - data[28] = 0x0 #sync1偏移 - data[29] = 0x0 - - data[36] = 0x0#sync3偏移 - data[37] = 0x0 - - genPkt.addSubPkt(0, 0, 0x120, 0xe, 0x28, data) - - data = [0,] * 100 #bytearray(b"\0" * 100) - data[0] = 0x0f #地址0x120 - data[2] = 0xa - data[4] = 0xa - data[6] = 0xa - data[8] = 0xa - - data[16] = '''(_temp_time & 8'hff)''' #地址0x130, sync同步点 - data[17] = '''(_temp_time >> 8) & 8'hff''' #地址0x131 - data[18] = '''(_temp_time >> 16) & 8'hff''' - data[19] = '''(_temp_time >> 24) & 8'hff''' - - data[24] = 0x00 #地址0x138, sync周期 4B - data[25] = 0x01 #地址0x139 - - data[28] = 0x0 #sync1偏移 - data[29] = 0x0 - - data[36] = 0x0 #sync3偏移 - data[37] = 0x0 - - genPkt.addSubPkt(3, 0, 0x120, 0x1, 0x28, data) - - data = [0,] * 100 #bytearray(b"\0" * 100) - data[0] = 0x0f #地址0x120 - data[2] = 0xa - data[4] = 0xa - data[6] = 0xa - data[8] = 0xa - - data[16] = '''(_temp_time & 8'hff)''' #地址0x130, sync同步点 - data[17] = '''(_temp_time >> 8) & 8'hff''' #地址0x131 - data[18] = '''(_temp_time >> 16) & 8'hff''' - data[19] = '''(_temp_time >> 24) & 8'hff''' - - data[24] = 0x00 #地址0x138, sync周期 4B - data[25] = 0x02 #地址0x139 - - data[28] = 0x0 #sync1偏移 - data[29] = 0x0 - - data[36] = 0x0 #sync3偏移 - data[37] = 0x0 - - genPkt.addSubPkt(4, 0, 0x120, 0x1, 0x28, data) - - data = [0,] * 100 #bytearray(b"\0" * 100) - data[0] = 0x0f #地址0x120 - data[2] = 0xa - data[4] = 0xa - data[6] = 0xa - data[8] = 0xa - - data[16] = '''(_temp_time & 8'hff)''' #地址0x130, sync同步点 - data[17] = '''(_temp_time >> 8) & 8'hff''' #地址0x131 - data[18] = '''(_temp_time >> 16) & 8'hff''' - data[19] = '''(_temp_time >> 24) & 8'hff''' - - data[24] = 0x00 #地址0x138, sync周期 4B - data[25] = 0x04 #地址0x139genPkt.addBeforeExc( - - data[28] = 0x0 #sync1偏移 - data[29] = 0x0 - - data[36] = 0x0 #sync3偏移 - data[37] = 0x0 - - genPkt.addSubPkt(2, 0, 0x120, 0x1, 0x28, data) - genPkt.addSubPkt(0, 0, 0x18, 0xe, 2, [0x0, 0x58]) - - gen_file_def_ap = gen_file_def + "_rw04" - genPkt.addAfterExc(genWriteTransLenCode(gen_file_def_ap, sm_idx) - +genWriteTransPktCode(gen_file_def_ap, sm_idx) - +genTrgTransPktCode(gen_file_def_ap, sm_idx) - +genReadAckPktCode(gen_file_def_ap, sm_idx) - - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - - +genMessageCode("--清除中断") - +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - +genTcEndFrameCode(gen_file_def) - ) - - genPkt.gen("./generated/shin/%s.vh"%(gen_file_def,), 1, True, gen_file_def_ap) - - - return gen_file_def - - -def tc8(): - genPkt = GenPkt() - - gen_file_def = "sync_tc08" - sm_idx = 0 - tc_des = ("同步后,SYNC信号采用脉冲触发,4个设备,4个周期;先用广播包发送公共周期;然后3,4,\\n" - "2设备单独指定周期。该同步数据之前没有补广播包。如果紧跟嗅探包而不是普通包之后,可能会影响同步。\\n" - "期望是无论前面发送得是什么包,都不会影响同步的效果。一段时间后,重新同步,期望不要打断sync\\n" - "信号的输出。需要在波形文件里查看具体的效果。\\n" - "同时,后面同步采用的是0xa,微调同步包,没办法大尺度地同步。整个系统工作一段时间后,\\n" - "先复位主、再复位从1,从1的时钟慢于主;从2、3、4的时钟快于主,从同步后的结果看,0xa命令同步后,\\n" - "从1的时钟往前最多调整10个周期;从2的时钟最多往后调整10个周期。需要在波形文件里确认。" - ) - - - #------------------------------------------------------------------------- - #>>>>>>设置同步信号的数据包 - genPkt.clean() - genPkt.setPktType(0) - sm_idx = 3 - - genPkt.addBeforeExc(genTcStartFrameCode(gen_file_def, tc_des) - +genEnableInsertTimeCode(0xa) - + '''spi_trans( (16'h0100), (`SPI_READ), (8), (`IF_IDX(0)));\n''' - #+ '''_temp_time = rxBuf[3] + (rxBuf[4] << 8) + (rxBuf[5] << 16) + (rxBuf[6] << 24) + (rxBuf[7] << 32) + (rxBuf[8] << 40) + (rxBuf[9] << 48) + (rxBuf[10] << 56);\n''' - + '''_temp_time = rxBuf[`ARRAY_IDX_OFF] + (rxBuf[`ARRAY_IDX_OFF+1] << 8) + (rxBuf[`ARRAY_IDX_OFF+2] << 16) + (rxBuf[`ARRAY_IDX_OFF+3] << 24) + (rxBuf[`ARRAY_IDX_OFF+4] << 32) + (rxBuf[`ARRAY_IDX_OFF+5] << 40) + (rxBuf[`ARRAY_IDX_OFF+6] << 48) + (rxBuf[`ARRAY_IDX_OFF+7] << 56);\n''' - + '''_temp_time = _temp_time + 32'h3000;\n\n''') - - genPkt.addSubPkt(0x0, 0, 0x0, 0xc, 12, b'\0'*12) - genPkt.addSubPkt(0, 0, 0x18, 0xe, 2, [0x1, 0x58]) - - #subPkt参数:索引、索引类型、地址、命令、长度、数据 - data = [0,] * 100 #bytearray(b"\0" * 100) - data[0] = 0x0f #地址0x120 - data[2] = 0xa - data[4] = 0xa - data[6] = 0xa - data[8] = 0xa - - data[16] = '''(_temp_time & 8'hff)''' #地址0x130, sync同步点 - data[17] = '''(_temp_time >> 8) & 8'hff''' #地址0x131 - data[18] = '''(_temp_time >> 16) & 8'hff''' - data[19] = '''(_temp_time >> 24) & 8'hff''' - - data[24] = 0x80 #地址0x138, sync周期 4B - data[25] = 0x00 #地址0x139 - - data[28] = 0x0 #sync1偏移 - data[29] = 0x0 - - data[36] = 0x0#sync3偏移 - data[37] = 0x0 - - genPkt.addSubPkt(0, 0, 0x120, 0xe, 0x28, data) - - data = [0,] * 100 #bytearray(b"\0" * 100) - data[0] = 0x0f #地址0x120 - data[2] = 0xa - data[4] = 0xa - data[6] = 0xa - data[8] = 0xa - - data[16] = '''(_temp_time & 8'hff)''' #地址0x130, sync同步点 - data[17] = '''(_temp_time >> 8) & 8'hff''' #地址0x131 - data[18] = '''(_temp_time >> 16) & 8'hff''' - data[19] = '''(_temp_time >> 24) & 8'hff''' - - data[24] = 0x00 #地址0x138, sync周期 4B - data[25] = 0x01 #地址0x139 - - data[28] = 0x0 #sync1偏移 - data[29] = 0x0 - - data[36] = 0x0 #sync3偏移 - data[37] = 0x0 - - genPkt.addSubPkt(3, 0, 0x120, 0x1, 0x28, data) - - data = [0,] * 100 #bytearray(b"\0" * 100) - data[0] = 0x0f #地址0x120 - data[2] = 0xa - data[4] = 0xa - data[6] = 0xa - data[8] = 0xa - - data[16] = '''(_temp_time & 8'hff)''' #地址0x130, sync同步点 - data[17] = '''(_temp_time >> 8) & 8'hff''' #地址0x131 - data[18] = '''(_temp_time >> 16) & 8'hff''' - data[19] = '''(_temp_time >> 24) & 8'hff''' - - data[24] = 0x00 #地址0x138, sync周期 4B - data[25] = 0x02 #地址0x139 - - data[28] = 0x0 #sync1偏移 - data[29] = 0x0 - - data[36] = 0x0 #sync3偏移 - data[37] = 0x0 - - genPkt.addSubPkt(4, 0, 0x120, 0x1, 0x28, data) - - data = [0,] * 100 #bytearray(b"\0" * 100) - data[0] = 0x0f #地址0x120 - data[2] = 0xa - data[4] = 0xa - data[6] = 0xa - data[8] = 0xa - - data[16] = '''(_temp_time & 8'hff)''' #地址0x130, sync同步点 - data[17] = '''(_temp_time >> 8) & 8'hff''' #地址0x131 - data[18] = '''(_temp_time >> 16) & 8'hff''' - data[19] = '''(_temp_time >> 24) & 8'hff''' - - data[24] = 0x00 #地址0x138, sync周期 4B - data[25] = 0x04 #地址0x139genPkt.addBeforeExc( - - data[28] = 0x0 #sync1偏移 - data[29] = 0x0 - - data[36] = 0x0 #sync3偏移 - data[37] = 0x0 - - genPkt.addSubPkt(2, 0, 0x120, 0x1, 0x28, data) - genPkt.addSubPkt(0, 0, 0x18, 0xe, 2, [0x0, 0x58]) - - #gen_file_def_ap = gen_file_def + "_rw01" - genPkt.addAfterExc(genWriteTransLenCode(gen_file_def, sm_idx) - +genWriteTransPktCode(gen_file_def, sm_idx) - +genTrgTransPktCode(gen_file_def, sm_idx) - +genReadAckPktCode(gen_file_def, sm_idx) - - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - - +genMessageCode("--清除中断") - +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - ) - - genPkt.gen("./generated/shin/%s.vh"%(gen_file_def,), 1) - - #>>>>>>同步数据包 - genPkt.clean() - genPkt.setPktType(0) - - #subPkt参数:索引、索引类型、地址、命令、长度、数据 - genPkt.addSubPkt(0x0, 0, 0x0, 0xa, 12, [0, ] * 12) - genPkt.addSubPkt(0x0, 0, 0x0, 0xd, 10, [0, ] * 10) - genPkt.addSubPkt(0x0, 0, 0x0, 0xd, 10, [0, ] * 10) - - genPkt.addBeforeExc(genEnableInsertTimeCode(0xa))# + 18 + 18)) - - sm_idx = 0 - - gen_file_def_ap = gen_file_def + "_rw02" - - genPkt.addAfterExc(genWriteTransLenCode(gen_file_def_ap, sm_idx) - +genWriteTransPktCode(gen_file_def_ap, sm_idx) - +genTrgTransPktCode(gen_file_def_ap, sm_idx) - +genReadAckPktCode(gen_file_def_ap, sm_idx) - +genCheckInsertTimeCode() - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - - +genMessageCode("--清除中断") - +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - - +"#50000" - +genIFRwDataCode(0, 0x40, True, 4, [0x01, 0x00, 0x66, 0x79]) - - +"#50000" - +genIFRwDataCode(1, 0x40, True, 4, [0x01, 0x00, 0x66, 0x79]) - ) #+genDisableInsertTimeCode()) - - - genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1, True, gen_file_def_ap) - - genPkt.clean() - genPkt.setPktType(1) - sm_idx = 1 - - genPkt.addBeforeExc("\n#5000\n" - #+genIFRwDataCode(0, 0x09, True, 1, [0, ], False, iface=1) - +using_proper_workmode(0) - - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(0, 0x00, True, 1, [0x1, ]) - +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - - #+genIFRwDataCode(1, 0x09, True, 1, [0, ], False, iface=1) - +using_proper_workmode(1) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(1, 0x00, True, 1, [0x2, ]) - - +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - ) - - gen_file_def_ap = gen_file_def + "_rw03" - genPkt.addAfterExc(genWriteTransLenCode(gen_file_def_ap, sm_idx) - +genWriteTransPktCode(gen_file_def_ap, sm_idx) - +genTrgTransPktCode(gen_file_def_ap, sm_idx) - +genReadAckPktCode(gen_file_def_ap, sm_idx) - - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - - +genMessageCode("--清除中断") - +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - ) - - genPkt.gen("./generated/shin/%s.vh"%(gen_file_def,), 1, True, gen_file_def_ap) - - - genPkt.clean() - genPkt.setPktType(0) - sm_idx = 1 - - genPkt.addSubPkt(0x0, 0, 0, 0xb, 2, [0x3f, 0xff]) - - - gen_file_def_ap = gen_file_def + "_rw04" - - genPkt.addAfterExc(genWriteTransLenCode(gen_file_def_ap, sm_idx) - +genWriteTransPktCode(gen_file_def_ap, sm_idx) - +genTrgTransPktCode(gen_file_def_ap, sm_idx) - +genReadAckPktCode(gen_file_def_ap, sm_idx) - - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - - +genMessageCode("--清除中断") - +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - ) - - genPkt.gen("./generated/shin/%s.vh"%(gen_file_def,), 1, True, gen_file_def_ap) - - - - - genPkt.clean() - genPkt.setPktType(0) - sm_idx = 1 - - genPkt.addBeforeExc("\n#5000\n" - #+genIFRwDataCode(0, 0x09, True, 1, [0, ], False, iface=1) - +using_proper_workmode(0) - - +genIFRwDataCode(0, 0x74, False, 4) - #+genIFRwDataCode(0, 0x40, False, 4) - +genIFRwDataCode(0, 0x00, True, 1, [0x1, ]) - ) - - genPkt.addSubPkt(0x0, 0, 0x180, 0xd, 10, b'\0'*10) - - gen_file_def_ap = gen_file_def + "_rw05" - genPkt.addAfterExc(genWriteTransLenCode(gen_file_def_ap, sm_idx) - +genWriteTransPktCode(gen_file_def_ap, sm_idx) - +genTrgTransPktCode(gen_file_def_ap, sm_idx) - +genReadAckPktCode(gen_file_def_ap, sm_idx) - - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - - +genMessageCode("--清除中断") - +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - ) - - genPkt.gen("./generated/shin/%s.vh"%(gen_file_def,), 1, True, gen_file_def_ap) - - - genPkt.clean() - genPkt.setPktType(0) - sm_idx = 1 - - - genPkt.addBeforeExc(genEnableInsertTimeCode(0xa) - + '''spi_trans( (16'h0100), (`SPI_READ), (8), (`IF_IDX(0)));\n''' - #+ '''_temp_time = rxBuf[3] + (rxBuf[4] << 8) + (rxBuf[5] << 16) + (rxBuf[6] << 24) + (rxBuf[7] << 32) + (rxBuf[8] << 40) + (rxBuf[9] << 48) + (rxBuf[10] << 56);\n''' - + '''_temp_time = rxBuf[`ARRAY_IDX_OFF] + (rxBuf[`ARRAY_IDX_OFF+1] << 8) + (rxBuf[`ARRAY_IDX_OFF+2] << 16) + (rxBuf[`ARRAY_IDX_OFF+3] << 24) + (rxBuf[`ARRAY_IDX_OFF+4] << 32) + (rxBuf[`ARRAY_IDX_OFF+5] << 40) + (rxBuf[`ARRAY_IDX_OFF+6] << 48) + (rxBuf[`ARRAY_IDX_OFF+7] << 56);\n''' - + '''_temp_time = _temp_time + 32'h3000;\n\n''' - + '''txBuf[`ARRAY_IDX_OFF] = 8'h0f;\n''' - + '''txBuf[`ARRAY_IDX_OFF+1] = 8'h00;\n''' - + '''txBuf[`ARRAY_IDX_OFF+2] = 8'h0a;\n''' - + '''txBuf[`ARRAY_IDX_OFF+3] = 8'h00;\n''' - + '''txBuf[`ARRAY_IDX_OFF+4] = 8'h0a;\n''' - + '''txBuf[`ARRAY_IDX_OFF+5] = 8'h00;\n''' - + '''txBuf[`ARRAY_IDX_OFF+6] = 8'h0a;\n''' - + '''txBuf[`ARRAY_IDX_OFF+7] = 8'h00;\n''' - + '''txBuf[`ARRAY_IDX_OFF+8] = 8'h01;\n''' - + '''txBuf[`ARRAY_IDX_OFF+9] = 8'h00;\n''' - + '''txBuf[`ARRAY_IDX_OFF+16] = (_temp_time & 8'hff);\n''' - + '''txBuf[`ARRAY_IDX_OFF+17] = ( (_temp_time >> 8) & 8'hff);\n''' - + '''txBuf[`ARRAY_IDX_OFF+18] = ((_temp_time >> 16) & 8'hff);\n''' - + '''txBuf[`ARRAY_IDX_OFF+19] = ((_temp_time >> 24) & 8'hff);\n''' - + '''txBuf[`ARRAY_IDX_OFF+20] = ((_temp_time >> 32) & 8'hff);\n''' - + '''txBuf[`ARRAY_IDX_OFF+21] = 0;\n''' - + '''txBuf[`ARRAY_IDX_OFF+22] = 0;\n''' - + '''txBuf[`ARRAY_IDX_OFF+23] = 0;\n''' - + '''txBuf[`ARRAY_IDX_OFF+24] = 8'h80;\n''' - + '''txBuf[`ARRAY_IDX_OFF+25] = 8'h00;\n''' - + '''txBuf[`ARRAY_IDX_OFF+26] = 8'h00;\n''' - + '''txBuf[`ARRAY_IDX_OFF+27] = 8'h00;\n''' - + '''txBuf[`ARRAY_IDX_OFF+28] = 8'h00;\n''' - + '''txBuf[`ARRAY_IDX_OFF+29] = 8'h00;\n''' - + '''txBuf[`ARRAY_IDX_OFF+30] = 8'h00;\n''' - + '''txBuf[`ARRAY_IDX_OFF+31] = 8'h00;\n''' - + '''txBuf[`ARRAY_IDX_OFF+32] = 8'h00;\n''' - + '''txBuf[`ARRAY_IDX_OFF+33] = 8'h00;\n''' - + '''txBuf[`ARRAY_IDX_OFF+34] = 8'h00;\n''' - + '''txBuf[`ARRAY_IDX_OFF+35] = 8'h00;\n''' - + '''txBuf[`ARRAY_IDX_OFF+36] = 8'h00;\n''' - + '''txBuf[`ARRAY_IDX_OFF+37] = 8'h00;\n''' - + '''txBuf[`ARRAY_IDX_OFF+38] = 8'h00;\n''' - + '''txBuf[`ARRAY_IDX_OFF+39] = 8'h00;\n''' - + '''spi_trans( (16'h0120), (`SPI_WRITE), (40), (`IF_IDX(0)));\n''' - ) - - genPkt.addSubPkt(0x0, 0, 0x0, 0xa, 12, b'\0'*12) - genPkt.addSubPkt(0, 0, 0x18, 0xe, 2, [0x1, 0x58]) - #subPkt参数:索引、索引类型、地址、命令、长度、数据 - data = [0,] * 100 #bytearray(b"\0" * 100) - data[0] = 0x0f #地址0x120 - data[1] = 0x0 - data[2] = 0xa - data[3] = 0x0 - data[4] = 0xa - data[5] = 0x0 - data[6] = 0xa - data[8] = 0xa - - data[16] = '''(_temp_time & 8'hff)''' #地址0x130, sync同步点 - data[17] = '''(_temp_time >> 8) & 8'hff''' #地址0x131 - data[18] = '''(_temp_time >> 16) & 8'hff''' - data[19] = '''(_temp_time >> 24) & 8'hff''' - - data[24] = 0x80 #地址0x138, sync周期 4B - data[25] = 0x00 #地址0x139 - - data[28] = 0x0 #sync1偏移 - data[29] = 0x0 - - data[36] = 0x0#sync3偏移 - data[37] = 0x0 - - genPkt.addSubPkt(0, 0, 0x120, 0xe, 0x28, data) - - data = [0,] * 100 #bytearray(b"\0" * 100) - data[0] = 0x0f #地址0x120 - data[2] = 0xa - data[4] = 0xa - data[6] = 0xa - data[8] = 0xa - - data[16] = '''(_temp_time & 8'hff)''' #地址0x130, sync同步点 - data[17] = '''(_temp_time >> 8) & 8'hff''' #地址0x131 - data[18] = '''(_temp_time >> 16) & 8'hff''' - data[19] = '''(_temp_time >> 24) & 8'hff''' - - data[24] = 0x00 #地址0x138, sync周期 4B - data[25] = 0x01 #地址0x139 - - data[28] = 0x0 #sync1偏移 - data[29] = 0x0 - - data[36] = 0x0 #sync3偏移 - data[37] = 0x0 - - genPkt.addSubPkt(3, 0, 0x120, 0x1, 0x28, data) - - data = [0,] * 100 #bytearray(b"\0" * 100) - data[0] = 0x0f #地址0x120 - data[2] = 0xa - data[4] = 0xa - data[6] = 0xa - data[8] = 0xa - - data[16] = '''(_temp_time & 8'hff)''' #地址0x130, sync同步点 - data[17] = '''(_temp_time >> 8) & 8'hff''' #地址0x131 - data[18] = '''(_temp_time >> 16) & 8'hff''' - data[19] = '''(_temp_time >> 24) & 8'hff''' - - data[24] = 0x00 #地址0x138, sync周期 4B - data[25] = 0x02 #地址0x139 - - data[28] = 0x0 #sync1偏移 - data[29] = 0x0 - - data[36] = 0x0 #sync3偏移 - data[37] = 0x0 - - genPkt.addSubPkt(4, 0, 0x120, 0x1, 0x28, data) - - data = [0,] * 100 #bytearray(b"\0" * 100) - data[0] = 0x0f #地址0x120 - data[2] = 0xa - data[4] = 0xa - data[6] = 0xa - data[8] = 0xa - - data[16] = '''(_temp_time & 8'hff)''' #地址0x130, sync同步点 - data[17] = '''(_temp_time >> 8) & 8'hff''' #地址0x131 - data[18] = '''(_temp_time >> 16) & 8'hff''' - data[19] = '''(_temp_time >> 24) & 8'hff''' - - data[24] = 0x00 #地址0x138, sync周期 4B - data[25] = 0x04 #地址0x139genPkt.addBeforeExc( - - data[28] = 0x0 #sync1偏移 - data[29] = 0x0 - - data[36] = 0x0 #sync3偏移 - data[37] = 0x0 - - genPkt.addSubPkt(2, 0, 0x120, 0x1, 0x28, data) - genPkt.addSubPkt(0, 0, 0x18, 0xe, 2, [0x0, 0x58]) - - gen_file_def_ap = gen_file_def + "_rw06" - genPkt.addAfterExc(genWriteTransLenCode(gen_file_def_ap, sm_idx) - +genWriteTransPktCode(gen_file_def_ap, sm_idx) - +genTrgTransPktCode(gen_file_def_ap, sm_idx) - +genReadAckPktCode(gen_file_def_ap, sm_idx) - - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - - +genMessageCode("--清除中断") - +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - - ) - - genPkt.gen("./generated/shin/%s.vh"%(gen_file_def,), 1, True, gen_file_def_ap) - - #>>>>>>同步数据包 - genPkt.clean() - genPkt.setPktType(0) - - #subPkt参数:索引、索引类型、地址、命令、长度、数据 - genPkt.addSubPkt(0x0, 0, 0x0, 0xa, 12, [0, ] * 12) - #genPkt.addSubPkt(0x0, 0, 0x0, 0xd, 10, [0, ] * 10) - #genPkt.addSubPkt(0x0, 0, 0x0, 0xd, 10, [0, ] * 10) - - - - - genPkt.addBeforeExc(genEnableInsertTimeCode(0xa))# + 18 + 18)) - - sm_idx = 0 - - gen_file_def_ap = gen_file_def + "_rw07" - - genPkt.addAfterExc(genWriteTransLenCode(gen_file_def_ap, sm_idx) - +genWriteTransPktCode(gen_file_def_ap, sm_idx) - +genTrgTransPktCode(gen_file_def_ap, sm_idx) - +genReadAckPktCode(gen_file_def_ap, sm_idx) - +genCheckInsertTimeCode() - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - - +genMessageCode("--清除中断") - +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) - - +genMessageCode("--读取中断") - +genIFRwDataCode(0, 0x74, False, 4) - +genIFRwDataCode(1, 0x74, False, 4) - +genIFRwDataCode(2, 0x74, False, 4) - +genIFRwDataCode(3, 0x74, False, 4) - +genIFRwDataCode(4, 0x74, False, 4) - - +genTcEndFrameCode(gen_file_def) - ) #+genDisableInsertTimeCode()) - - - genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1, True, gen_file_def_ap) - - return gen_file_def +from pyutils import * +from .environment import * + +def tc1(): + genPkt = GenPkt() + + gen_file_def = "sync_tc01" + sm_idx = 0 + tc_des = "发送时钟信息,完成后,从站的系统时间与主站时间完全同步。主站发送\\n" \ + + "自己的时钟和系统延迟,从站利用该信息进行校准自己的时钟。需要在波形软件里确认。\\n" \ + + "仅看通讯数据无法确定系统功能正常。" + #------------------------------------------------------------------------- + #>>>>>>广播包 + genPkt.clean() + genPkt.setPktType(0) + + #subPkt参数:索引、索引类型、地址、命令、长度、数据 + genPkt.addSubPkt(0x0, 0, 0x0, 0xd, 2, [0, 0]) + + + genPkt.addBeforeExc(genTcStartFrameCode(gen_file_def, tc_des) + ) + + sm_idx = 0 + + genPkt.addAfterExc(genWriteTransLenCode(gen_file_def, sm_idx) + +genWriteTransPktCode(gen_file_def, sm_idx) + +genTrgTransPktCode(gen_file_def, sm_idx) + +genReadAckPktCode(gen_file_def, sm_idx) + +genCheckInsertTimeCode() + + +genMessageCode("--清除中断") + +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + + ) + + genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1) + + #------------------------------------------------------------------------- + #>>>>>>同步数据包 + genPkt.clean() + genPkt.setPktType(0) + + #subPkt参数:索引、索引类型、地址、命令、长度、数据 + genPkt.addSubPkt(0x0, 0, 0x0, 0xc, 12, b'\0'*12) + + + genPkt.addBeforeExc(genEnableInsertTimeCode(0xa)) + + sm_idx = 0 + gen_file_def_ap = gen_file_def + "_rw01" + + genPkt.addAfterExc(genWriteTransLenCode(gen_file_def_ap, sm_idx) + +genWriteTransPktCode(gen_file_def_ap, sm_idx) + +genTrgTransPktCode(gen_file_def_ap, sm_idx) + +genReadAckPktCode(gen_file_def_ap, sm_idx) + +genCheckInsertTimeCode() + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + + +genMessageCode("--清除中断") + +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + +genTcEndFrameCode(gen_file_def)) #+genDisableInsertTimeCode()) + + + genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1, True, gen_file_def_ap) + return gen_file_def + + +def tc2(): + genPkt = GenPkt() + + gen_file_def = "sync_tc02" + sm_idx = 0 + tc_des = "配置Sync信号为电平触发,设置SYNC的同步周期,SYNC1、SYNC3的偏移。\\n" \ + + "SYNC触发后,需要手动清除SYNC信号。" + + + #------------------------------------------------------------------------- + #>>>>>>广播包 + genPkt.clean() + genPkt.setPktType(0) + + #subPkt参数:索引、索引类型、地址、命令、长度、数据 + genPkt.addSubPkt(0x0, 0, 0x0, 0xd, 2, [0, 0]) + + + genPkt.addBeforeExc(genTcStartFrameCode(gen_file_def, tc_des) + ) + + sm_idx = 0 + + genPkt.addAfterExc(genWriteTransLenCode(gen_file_def, sm_idx) + +genWriteTransPktCode(gen_file_def, sm_idx) + +genTrgTransPktCode(gen_file_def, sm_idx) + +genReadAckPktCode(gen_file_def, sm_idx) + +genCheckInsertTimeCode() + + +genMessageCode("--清除中断") + +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + + ) + + genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1) + + #------------------------------------------------------------------------- + #>>>>>>设置同步信号的数据包,在波形中确认定时的有效性 + genPkt.clean() + genPkt.setPktType(0) + + genPkt.addBeforeExc(genEnableInsertTimeCode(0xa) + + '''spi_trans( (16'h0100), (`SPI_READ), (8), (`IF_IDX(0)));\n''' + #+ '''_temp_time = rxBuf[3] + (rxBuf[4] << 8) + (rxBuf[5] << 16) + (rxBuf[6] << 24) + (rxBuf[7] << 32) + (rxBuf[8] << 40) + (rxBuf[9] << 48) + (rxBuf[10] << 56);\n''' + + '''_temp_time = rxBuf[`ARRAY_IDX_OFF] + (rxBuf[`ARRAY_IDX_OFF+1] << 8) + (rxBuf[`ARRAY_IDX_OFF+2] << 16) + (rxBuf[`ARRAY_IDX_OFF+3] << 24) + (rxBuf[`ARRAY_IDX_OFF+4] << 32) + (rxBuf[`ARRAY_IDX_OFF+5] << 40) + (rxBuf[`ARRAY_IDX_OFF+6] << 48) + (rxBuf[`ARRAY_IDX_OFF+7] << 56);\n''' + + '''_temp_time = _temp_time + 32'h2000;\n\n''') + + genPkt.addSubPkt(0x0, 0, 0x0, 0xc, 12, b'\0'*12) + genPkt.addSubPkt(0, 0, 0x18, 0xe, 2, [0x1, 0x58]) + + #subPkt参数:索引、索引类型、地址、命令、长度、数据 + data = [0,] * 100 #bytearray(b"\0" * 100) + data[0] = 0xff #地址0x120 + data[2] = 0xa + data[4] = 0xa + data[6] = 0xa + data[8] = 0xa + + data[16] = '''(_temp_time & 8'hff)''' #地址0x130, sync同步点 + data[17] = '''(_temp_time >> 8) & 8'hff''' #地址0x131 + data[18] = '''(_temp_time >> 16) & 8'hff''' + data[19] = '''(_temp_time >> 24) & 8'hff''' + + data[24] = 0x00 #地址0x138, sync周期 4B + data[25] = 0x10 #地址0x139 + + #28, 29, 30, 31 + data[28] = 0x81 #sync1偏移 + data[29] = 0x0 + + + #32,33,34,35 #sync2偏移 + + #36,37,38,39 + data[36] = 0x20 #sync3偏移 + data[37] = 0x00 + + genPkt.addSubPkt(0, 0, 0x120, 0xe, 0x28, data) + genPkt.addSubPkt(0, 0, 0x18, 0xe, 2, [0x0, 0x58]) + + sm_idx = 0 + gen_file_def_ap = gen_file_def + "_rw01" + + genPkt.addAfterExc(genWriteTransLenCode(gen_file_def_ap, sm_idx) + +genWriteTransPktCode(gen_file_def_ap, sm_idx) + +genTrgTransPktCode(gen_file_def_ap, sm_idx) + +genReadAckPktCode(gen_file_def_ap, sm_idx) + +"\n#1000000\n" + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + + +genMessageCode("--清除中断") + +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + +genTcEndFrameCode(gen_file_def) + ) + + + genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1, True, gen_file_def_ap) + return gen_file_def + + + +def tc3(): + genPkt = GenPkt() + + gen_file_def = "sync_tc03" + sm_idx = 0 + tc_des = "SYNC信号采用脉冲触发,4个设备,3个周期;先用广播包发送公共周期;然后3,4设备单独指定周期。\\n" \ + + "需要在波形文件里查看。" + + + #------------------------------------------------------------------------- + #>>>>>>广播包 + genPkt.clean() + genPkt.setPktType(0) + + #subPkt参数:索引、索引类型、地址、命令、长度、数据 + genPkt.addSubPkt(0x0, 0, 0x0, 0xd, 2, [0, 0]) + + + genPkt.addBeforeExc(genTcStartFrameCode(gen_file_def, tc_des) + ) + + sm_idx = 0 + + genPkt.addAfterExc(genWriteTransLenCode(gen_file_def, sm_idx) + +genWriteTransPktCode(gen_file_def, sm_idx) + +genTrgTransPktCode(gen_file_def, sm_idx) + +genReadAckPktCode(gen_file_def, sm_idx) + +genCheckInsertTimeCode() + + +genMessageCode("--清除中断") + +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + + ) + + genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1) + + #------------------------------------------------------------------------- + #>>>>>>设置同步信号的数据包 + genPkt.clean() + genPkt.setPktType(0) + + sm_idx = 3 + + genPkt.addBeforeExc(genEnableInsertTimeCode(0xa, 1, 1) + + '''spi_trans( (16'h0100), (`SPI_READ), (8), (`IF_IDX(0)));\n''' + #+ '''_temp_time = rxBuf[3] + (rxBuf[4] << 8) + (rxBuf[5] << 16) + (rxBuf[6] << 24) + (rxBuf[7] << 32) + (rxBuf[8] << 40) + (rxBuf[9] << 48) + (rxBuf[10] << 56);\n''' + + '''_temp_time = rxBuf[`ARRAY_IDX_OFF] + (rxBuf[`ARRAY_IDX_OFF+1] << 8) + (rxBuf[`ARRAY_IDX_OFF+2] << 16) + (rxBuf[`ARRAY_IDX_OFF+3] << 24) + (rxBuf[`ARRAY_IDX_OFF+4] << 32) + (rxBuf[`ARRAY_IDX_OFF+5] << 40) + (rxBuf[`ARRAY_IDX_OFF+6] << 48) + (rxBuf[`ARRAY_IDX_OFF+7] << 56);\n''' + + '''_temp_time = _temp_time + 32'h4000;\n\n''') + + genPkt.addSubPkt(0x0, 0, 0x0, 0xc, 12, b'\0'*12) + genPkt.addSubPkt(0, 0, 0x18, 0xe, 2, [0x1, 0x58]) + #subPkt参数:索引、索引类型、地址、命令、长度、数据 + data = [0,] * 100 #bytearray(b"\0" * 100) + data[0] = 0x0f #地址0x120 + data[2] = 0xa + data[4] = 0xa + data[6] = 0xa + data[8] = 0xa + + data[16] = '''(_temp_time & 8'hff)''' #地址0x130, sync同步点 + data[17] = '''(_temp_time >> 8) & 8'hff''' #地址0x131 + data[18] = '''(_temp_time >> 16) & 8'hff''' + data[19] = '''(_temp_time >> 24) & 8'hff''' + + data[24] = 0x80 #地址0x138, sync周期 4B + data[25] = 0x00 #地址0x139 + + data[28] = 0x0 #sync1偏移 + data[29] = 0x0 + + data[36] = 0x0 #sync3偏移 + data[37] = 0x0 + + genPkt.addSubPkt(0, 0, 0x120, 0xe, 0x28, data) + + data = [0,] * 100 #bytearray(b"\0" * 100) + data[0] = 0x0f #地址0x120 + data[2] = 0xa + data[4] = 0xa + data[6] = 0xa + data[8] = 0xa + + data[16] = '''(_temp_time & 8'hff)''' #地址0x130, sync同步点 + data[17] = '''(_temp_time >> 8) & 8'hff''' #地址0x131 + data[18] = '''(_temp_time >> 16) & 8'hff''' + data[19] = '''(_temp_time >> 24) & 8'hff''' + + data[24] = 0x00 #地址0x138, sync周期 4B + data[25] = 0x01 #地址0x139 + + data[28] = 0x0 #sync1偏移 + data[29] = 0x0 + + data[36] = 0x0 #sync3偏移 + data[37] = 0x0 + + genPkt.addSubPkt(3, 0, 0x120, 0x1, 0x28, data) + + data = [0,] * 100 #bytearray(b"\0" * 100) + data[0] = 0x0f #地址0x120 + data[2] = 0xa + data[4] = 0xa + data[6] = 0xa + data[8] = 0xa + + data[16] = '''(_temp_time & 8'hff)''' #地址0x130, sync同步点 + data[17] = '''(_temp_time >> 8) & 8'hff''' #地址0x131 + data[18] = '''(_temp_time >> 16) & 8'hff''' + data[19] = '''(_temp_time >> 24) & 8'hff''' + + data[24] = 0x00 #地址0x138, sync周期 4B + data[25] = 0x02 #地址0x139 + + data[28] = 0x0 #sync1偏移 + data[29] = 0x0 + + data[36] = 0x0 #sync3偏移 + data[37] = 0x0 + + genPkt.addSubPkt(4, 0, 0x120, 0x1, 0x28, data) + genPkt.addSubPkt(0, 0, 0x18, 0xe, 2, [0x0, 0x58]) + + gen_file_def_ap = gen_file_def + "_rw01" + + genPkt.addAfterExc(genWriteTransLenCode(gen_file_def_ap, sm_idx) + +genWriteTransPktCode(gen_file_def_ap, sm_idx) + +genTrgTransPktCode(gen_file_def_ap, sm_idx) + +genReadAckPktCode(gen_file_def_ap, sm_idx) + +"#2000000\n" + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + + +genMessageCode("--清除中断") + +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + +genTcEndFrameCode(gen_file_def)) + + genPkt.gen("./generated/shin/%s.vh"%(gen_file_def,), 1, True, gen_file_def_ap) + return gen_file_def + + + +def tc4(): + genPkt = GenPkt() + + gen_file_def = "sync_tc04" + sm_idx = 0 + tc_des = ("同步后,SYNC信号采用脉冲触发,4个设备,4个周期;先用广播包发送公共周期;然后3,4,\\n" + "2设备单独指定周期。一段时间后,重新同步,期望不要打断sync信号的输出。需要在波形文件里查看具体的效果。" + ) + + + #------------------------------------------------------------------------- + #>>>>>>广播包 + genPkt.clean() + genPkt.setPktType(0) + + #subPkt参数:索引、索引类型、地址、命令、长度、数据 + genPkt.addSubPkt(0x0, 0, 0x0, 0xd, 2, [0, 0]) + + + genPkt.addBeforeExc(genTcStartFrameCode(gen_file_def, tc_des) + ) + + sm_idx = 0 + + genPkt.addAfterExc(genWriteTransLenCode(gen_file_def, sm_idx) + +genWriteTransPktCode(gen_file_def, sm_idx) + +genTrgTransPktCode(gen_file_def, sm_idx) + +genReadAckPktCode(gen_file_def, sm_idx) + +genCheckInsertTimeCode() + + +genMessageCode("--清除中断") + +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + + ) + + genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1) + + #------------------------------------------------------------------------- + #>>>>>>设置同步信号的数据包 + genPkt.clean() + genPkt.setPktType(0) + sm_idx = 3 + + genPkt.addBeforeExc(genEnableInsertTimeCode(0xa) + + '''spi_trans( (16'h0100), (`SPI_READ), (8), (`IF_IDX(0)));\n''' + #+ '''_temp_time = rxBuf[3] + (rxBuf[4] << 8) + (rxBuf[5] << 16) + (rxBuf[6] << 24) + (rxBuf[7] << 32) + (rxBuf[8] << 40) + (rxBuf[9] << 48) + (rxBuf[10] << 56);\n''' + + '''_temp_time = rxBuf[`ARRAY_IDX_OFF] + (rxBuf[`ARRAY_IDX_OFF+1] << 8) + (rxBuf[`ARRAY_IDX_OFF+2] << 16) + (rxBuf[`ARRAY_IDX_OFF+3] << 24) + (rxBuf[`ARRAY_IDX_OFF+4] << 32) + (rxBuf[`ARRAY_IDX_OFF+5] << 40) + (rxBuf[`ARRAY_IDX_OFF+6] << 48) + (rxBuf[`ARRAY_IDX_OFF+7] << 56);\n''' + + '''_temp_time = _temp_time + 32'h3000;\n\n''') + + genPkt.addSubPkt(0, 0, 0x18, 0xe, 2, [0x1, 0x58]) + genPkt.addSubPkt(0x0, 0, 0x0, 0xc, 12, b'\0'*12) + + #subPkt参数:索引、索引类型、地址、命令、长度、数据 + data = [0,] * 100 #bytearray(b"\0" * 100) + data[0] = 0x0f #地址0x120 + data[2] = 0xa + data[4] = 0xa + data[6] = 0xa + data[8] = 0xa + + data[16] = '''(_temp_time & 8'hff)''' #地址0x130, sync同步点 + data[17] = '''(_temp_time >> 8) & 8'hff''' #地址0x131 + data[18] = '''(_temp_time >> 16) & 8'hff''' + data[19] = '''(_temp_time >> 24) & 8'hff''' + + data[24] = 0x80 #地址0x138, sync周期 4B + data[25] = 0x00 #地址0x139 + + data[28] = 0x0 #sync1偏移 + data[29] = 0x0 + + data[36] = 0x0#sync3偏移 + data[37] = 0x0 + + genPkt.addSubPkt(0, 0, 0x120, 0xe, 0x28, data) + + data = [0,] * 100 #bytearray(b"\0" * 100) + data[0] = 0x0f #地址0x120 + data[2] = 0xa + data[4] = 0xa + data[6] = 0xa + data[8] = 0xa + + data[16] = '''(_temp_time & 8'hff)''' #地址0x130, sync同步点 + data[17] = '''(_temp_time >> 8) & 8'hff''' #地址0x131 + data[18] = '''(_temp_time >> 16) & 8'hff''' + data[19] = '''(_temp_time >> 24) & 8'hff''' + + data[24] = 0x00 #地址0x138, sync周期 4B + data[25] = 0x01 #地址0x139 + + data[28] = 0x0 #sync1偏移 + data[29] = 0x0 + + data[36] = 0x0 #sync3偏移 + data[37] = 0x0 + + genPkt.addSubPkt(3, 0, 0x120, 0x1, 0x28, data) + + data = [0,] * 100 #bytearray(b"\0" * 100) + data[0] = 0x0f #地址0x120 + data[2] = 0xa + data[4] = 0xa + data[6] = 0xa + data[8] = 0xa + + data[16] = '''(_temp_time & 8'hff)''' #地址0x130, sync同步点 + data[17] = '''(_temp_time >> 8) & 8'hff''' #地址0x131 + data[18] = '''(_temp_time >> 16) & 8'hff''' + data[19] = '''(_temp_time >> 24) & 8'hff''' + + data[24] = 0x00 #地址0x138, sync周期 4B + data[25] = 0x02 #地址0x139 + + data[28] = 0x0 #sync1偏移 + data[29] = 0x0 + + data[36] = 0x0 #sync3偏移 + data[37] = 0x0 + + genPkt.addSubPkt(4, 0, 0x120, 0x1, 0x28, data) + + data = [0,] * 100 #bytearray(b"\0" * 100) + data[0] = 0x0f #地址0x120 + data[2] = 0xa + data[4] = 0xa + data[6] = 0xa + data[8] = 0xa + + data[16] = '''(_temp_time & 8'hff)''' #地址0x130, sync同步点 + data[17] = '''(_temp_time >> 8) & 8'hff''' #地址0x131 + data[18] = '''(_temp_time >> 16) & 8'hff''' + data[19] = '''(_temp_time >> 24) & 8'hff''' + + data[24] = 0x00 #地址0x138, sync周期 4B + data[25] = 0x04 #地址0x139genPkt.addBeforeExc( + + data[28] = 0x0 #sync1偏移 + data[29] = 0x0 + + data[36] = 0x0 #sync3偏移 + data[37] = 0x0 + + genPkt.addSubPkt(2, 0, 0x120, 0x1, 0x28, data) + genPkt.addSubPkt(0, 0, 0x18, 0xe, 2, [0x0, 0x58]) + + gen_file_def_ap = gen_file_def + "_rw01" + genPkt.addAfterExc(genWriteTransLenCode(gen_file_def_ap, sm_idx) + +genWriteTransPktCode(gen_file_def_ap, sm_idx) + +genTrgTransPktCode(gen_file_def_ap, sm_idx) + +genReadAckPktCode(gen_file_def_ap, sm_idx) + + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + + +genMessageCode("--清除中断") + +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + ) + + genPkt.gen("./generated/shin/%s.vh"%(gen_file_def,), 1, True, gen_file_def_ap) + + #>>>>>>同步数据包 + genPkt.clean() + genPkt.setPktType(0) + + #subPkt参数:索引、索引类型、地址、命令、长度、数据 + genPkt.addSubPkt(0x0, 0, 0x0, 0xc, 12, [0, ] * 12) + genPkt.addSubPkt(0x0, 0, 0x0, 0xd, 10, [0, ] * 10) + genPkt.addSubPkt(0x0, 0, 0x0, 0xd, 10, [0, ] * 10) + + + + + genPkt.addBeforeExc(genEnableInsertTimeCode(0xa))# + 18 + 18)) + + sm_idx = 0 + + gen_file_def_ap = gen_file_def + "_rw02" + + genPkt.addAfterExc(genWriteTransLenCode(gen_file_def_ap, sm_idx) + +genWriteTransPktCode(gen_file_def_ap, sm_idx) + +genTrgTransPktCode(gen_file_def_ap, sm_idx) + +genReadAckPktCode(gen_file_def_ap, sm_idx) + +genCheckInsertTimeCode() + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + + +genMessageCode("--清除中断") + +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + +genTcEndFrameCode(gen_file_def)) #+genDisableInsertTimeCode()) + + + genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1, True, gen_file_def_ap) + return gen_file_def + + +def tc5(): + genPkt = GenPkt() + + gen_file_def = "sync_tc05" + sm_idx = 0 + tc_des = "先同步,输出sync信号;然后RESET,仅复位4号设备,链路和网络被破坏;发送广播包只能到1/2/3, 4收不到。\\n" \ + + "然后检查同步信号是否能正常工作。然后对设备4进行必要的恢复工作。通过嗅探包、设置顺序地址命令等重新建立网络。" + + + #------------------------------------------------------------------------- + #>>>>>>广播包 + genPkt.clean() + genPkt.setPktType(0) + + #subPkt参数:索引、索引类型、地址、命令、长度、数据 + genPkt.addSubPkt(0x0, 0, 0x0, 0xd, 2, [0, 0]) + + + genPkt.addBeforeExc(genTcStartFrameCode(gen_file_def, tc_des) + ) + + sm_idx = 0 + + genPkt.addAfterExc(genWriteTransLenCode(gen_file_def, sm_idx) + +genWriteTransPktCode(gen_file_def, sm_idx) + +genTrgTransPktCode(gen_file_def, sm_idx) + +genReadAckPktCode(gen_file_def, sm_idx) + +genCheckInsertTimeCode() + + +genMessageCode("--清除中断") + +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + + ) + + genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1) + + #------------------------------------------------------------------------- + #>>>>>>设置同步信号的数据包 + genPkt.clean() + genPkt.setPktType(0) + sm_idx = 3 + + genPkt.addBeforeExc(genEnableInsertTimeCode(0xa) + + '''spi_trans( (16'h0100), (`SPI_READ), (8), (`IF_IDX(0)));\n''' + #+ '''_temp_time = rxBuf[3] + (rxBuf[4] << 8) + (rxBuf[5] << 16) + (rxBuf[6] << 24) + (rxBuf[7] << 32) + (rxBuf[8] << 40) + (rxBuf[9] << 48) + (rxBuf[10] << 56);\n''' + + '''_temp_time = rxBuf[`ARRAY_IDX_OFF] + (rxBuf[`ARRAY_IDX_OFF+1] << 8) + (rxBuf[`ARRAY_IDX_OFF+2] << 16) + (rxBuf[`ARRAY_IDX_OFF+3] << 24) + (rxBuf[`ARRAY_IDX_OFF+4] << 32) + (rxBuf[`ARRAY_IDX_OFF+5] << 40) + (rxBuf[`ARRAY_IDX_OFF+6] << 48) + (rxBuf[`ARRAY_IDX_OFF+7] << 56);\n''' + + '''_temp_time = _temp_time + 32'h3000;\n\n''') + + genPkt.addSubPkt(0, 0, 0x18, 0xe, 2, [0x1, 0x58]) + genPkt.addSubPkt(0x0, 0, 0x0, 0xc, 12, b'\0'*12) + + #subPkt参数:索引、索引类型、地址、命令、长度、数据 + data = [0,] * 100 #bytearray(b"\0" * 100) + data[0] = 0x0f #地址0x120 + data[2] = 0xa + data[4] = 0xa + data[6] = 0xa + data[8] = 0xa + + data[16] = '''(_temp_time & 8'hff)''' #地址0x130, sync同步点 + data[17] = '''(_temp_time >> 8) & 8'hff''' #地址0x131 + data[18] = '''(_temp_time >> 16) & 8'hff''' + data[19] = '''(_temp_time >> 24) & 8'hff''' + + data[24] = 0x80 #地址0x138, sync周期 4B + data[25] = 0x00 #地址0x139 + + data[28] = 0x0 #sync1偏移 + data[29] = 0x0 + + data[36] = 0x0#sync3偏移 + data[37] = 0x0 + + genPkt.addSubPkt(0, 0, 0x120, 0xe, 0x28, data) + + data = [0,] * 100 #bytearray(b"\0" * 100) + data[0] = 0x0f #地址0x120 + data[2] = 0xa + data[4] = 0xa + data[6] = 0xa + data[8] = 0xa + + data[16] = '''(_temp_time & 8'hff)''' #地址0x130, sync同步点 + data[17] = '''(_temp_time >> 8) & 8'hff''' #地址0x131 + data[18] = '''(_temp_time >> 16) & 8'hff''' + data[19] = '''(_temp_time >> 24) & 8'hff''' + + data[24] = 0x00 #地址0x138, sync周期 4B + data[25] = 0x01 #地址0x139 + + data[28] = 0x0 #sync1偏移 + data[29] = 0x0 + + data[36] = 0x0 #sync3偏移 + data[37] = 0x0 + + genPkt.addSubPkt(3, 0, 0x120, 0x1, 0x28, data) + + data = [0,] * 100 #bytearray(b"\0" * 100) + data[0] = 0x0f #地址0x120 + data[2] = 0xa + data[4] = 0xa + data[6] = 0xa + data[8] = 0xa + + data[16] = '''(_temp_time & 8'hff)''' #地址0x130, sync同步点 + data[17] = '''(_temp_time >> 8) & 8'hff''' #地址0x131 + data[18] = '''(_temp_time >> 16) & 8'hff''' + data[19] = '''(_temp_time >> 24) & 8'hff''' + + data[24] = 0x00 #地址0x138, sync周期 4B + data[25] = 0x02 #地址0x139 + + data[28] = 0x0 #sync1偏移 + data[29] = 0x0 + + data[36] = 0x0 #sync3偏移 + data[37] = 0x0 + + genPkt.addSubPkt(4, 0, 0x120, 0x1, 0x28, data) + + data = [0,] * 100 #bytearray(b"\0" * 100) + data[0] = 0x0f #地址0x120 + data[2] = 0xa + data[4] = 0xa + data[6] = 0xa + data[8] = 0xa + + data[16] = '''(_temp_time & 8'hff)''' #地址0x130, sync同步点 + data[17] = '''(_temp_time >> 8) & 8'hff''' #地址0x131 + data[18] = '''(_temp_time >> 16) & 8'hff''' + data[19] = '''(_temp_time >> 24) & 8'hff''' + + data[24] = 0x00 #地址0x138, sync周期 4B + data[25] = 0x04 #地址0x139genPkt.addBeforeExc( + + data[28] = 0x0 #sync1偏移 + data[29] = 0x0 + + data[36] = 0x0 #sync3偏移 + data[37] = 0x0 + + genPkt.addSubPkt(2, 0, 0x120, 0x1, 0x28, data) + genPkt.addSubPkt(0, 0, 0x18, 0xe, 2, [0x0, 0x58]) + + + gen_file_def_ap = gen_file_def + "_rw00" + + genPkt.addAfterExc(genWriteTransLenCode(gen_file_def_ap, sm_idx) + +genWriteTransPktCode(gen_file_def_ap, sm_idx) + +genTrgTransPktCode(gen_file_def_ap, sm_idx) + +genReadAckPktCode(gen_file_def_ap, sm_idx) + + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + + +genMessageCode("--清除中断") + +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + ) + + genPkt.gen("./generated/shin/%s.vh"%(gen_file_def,), 1, True, gen_file_def_ap) + + + #>>>>>>设置顺序地址 + genPkt.clean() + genPkt.setPktType(0) + + + + reset_data = [0x01, 0x00, 0x66, 0x79] + + genPkt.addBeforeExc("#50000\n" + +genIFRwDataCode(0, 0x78, False, 4) + +genIFRwDataCode(4, 0x40, True, 4, reset_data) + +"\n#5000\n" + #+genIFRwDataCode(0, 0x09, True, 1, [0, ], False, iface=1) + #+genIFRwDataCode(2, 0x09, True, 1, [0, ], False, iface=1) + #+genIFRwDataCode(0, 0x74, False, 4) + #+genIFRwDataCode(2, 0x74, False, 4) + #+genIFRwDataCode(0, 0x40, False, 4) + #+genIFRwDataCode(2, 0x40, False, 4) + #+genIFRwDataCode(0, 0x00, True, 1, [0x01, ]) + #+genIFRwDataCode(2, 0x00, True, 1, [0x02, ]) + ) + + + data = [0,] * 128 + + + #subPkt参数:索引、索引类型、地址、命令、长度、数据 + genPkt.addSubPkt(0x0, 0, 0x0, 0xd, 128, data) + + + sm_idx = 0 + gen_file_def_ap = gen_file_def + "_rw01" + + genPkt.addAfterExc(genWriteTransLenCode(gen_file_def_ap, sm_idx) + +genWriteTransPktCode(gen_file_def_ap, sm_idx) + +genTrgTransPktCode(gen_file_def_ap, sm_idx) + +genReadAckPktCode(gen_file_def_ap, sm_idx) + + +genMessageCode("--清除中断") + +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + ) + genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1, True, gen_file_def_ap) + + #------------------------------------------------------------------------------ + genPkt.clean() + genPkt.setPktType(1) + + genPkt.addBeforeExc(genIFRwDataCode(1, 0xc0, False, 4) + +genIFRwDataCode(2, 0xc0, False, 4) + +genIFRwDataCode(3, 0xc0, False, 4) + + #+genIFRwDataCode(4, 0x09, True, 1, [0, ], False, iface=1) + +using_proper_workmode(4) + +genIFRwDataCode(4, 0x00, True, 1, [0x2, ]) + +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + + +genIFRwDataCode(4, 0xc0, False, 4) + ) + + gen_file_def_ap = gen_file_def + "_rw02" + sm_idx = 0 + + genPkt.addAfterExc(genWriteTransLenCode(gen_file_def_ap, sm_idx) + +genWriteTransPktCode(gen_file_def_ap, sm_idx) + +genTrgTransPktCode(gen_file_def_ap, sm_idx) + +genReadAckPktCode(gen_file_def_ap, sm_idx) + #+genTcEndFrameCode(gen_file_def) + +genIFRwDataCode(1, 0xc0, False, 4) + +genIFRwDataCode(2, 0xc0, False, 4) + +genIFRwDataCode(3, 0xc0, False, 4) + +genIFRwDataCode(4, 0xc0, False, 4) + ) + + genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1, True, gen_file_def_ap) + + #------------------------------------------------------------------------------ + genPkt.clean() + genPkt.setPktType(0) + + gen_file_def_ap = gen_file_def + "_rw03" + sm_idx = 0 + + data = [0x3f, 0xff] + genPkt.addSubPkt(0x0, 0, 0x0, 0xb, 2, data) + + genPkt.addAfterExc(genWriteTransLenCode(gen_file_def_ap, sm_idx) + +genWriteTransPktCode(gen_file_def_ap, sm_idx) + +genTrgTransPktCode(gen_file_def_ap, sm_idx) + +genReadAckPktCode(gen_file_def_ap, sm_idx) + #+genTcEndFrameCode(gen_file_def) + +genIFRwDataCode(1, 0xc0, False, 4) + +genIFRwDataCode(2, 0xc0, False, 4) + +genIFRwDataCode(3, 0xc0, False, 4) + +genIFRwDataCode(4, 0xc0, False, 4) + ) + + genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1, True, gen_file_def_ap) + + + #------------------------------------------------------------------------------ + genPkt.clean() + genPkt.setPktType(1) + + genPkt.addBeforeExc(genIFRwDataCode(1, 0xc0, False, 4) + +genIFRwDataCode(2, 0xc0, False, 4) + +genIFRwDataCode(3, 0xc0, False, 4) + +genIFRwDataCode(4, 0xc0, False, 4) + ) + + gen_file_def_ap = gen_file_def + "_rw04" + sm_idx = 0 + + genPkt.addAfterExc(genWriteTransLenCode(gen_file_def_ap, sm_idx) + +genWriteTransPktCode(gen_file_def_ap, sm_idx) + +genTrgTransPktCode(gen_file_def_ap, sm_idx) + +genReadAckPktCode(gen_file_def_ap, sm_idx) + +genIFRwDataCode(1, 0xc0, False, 4) + +genIFRwDataCode(2, 0xc0, False, 4) + +genIFRwDataCode(3, 0xc0, False, 4) + +genIFRwDataCode(4, 0xc0, False, 4) + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + +genMessageCode("--清除中断") + +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genTcEndFrameCode(gen_file_def) + ) + + genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1, True, gen_file_def_ap) + + + return gen_file_def + + +def tc6(): + genPkt = GenPkt() + + gen_file_def = "sync_tc06" + sm_idx = 0 + tc_des = ("同步后,SYNC信号采用脉冲触发,4个设备,4个周期;先用广播包发送公共周期;然后3,4,\\n" + "2设备单独指定周期。该同步数据之前没有补广播包。如果紧跟嗅探包而不是普通包之后,可能会影响同步。\\n" + "期望是无论前面发送得是什么包,都不会影响同步的效果。一段时间后,重新同步,期望不要打断sync\\n" + "信号的输出。需要在波形文件里查看具体的效果。" + ) + + + #------------------------------------------------------------------------- + #>>>>>>设置同步信号的数据包 + genPkt.clean() + genPkt.setPktType(0) + sm_idx = 3 + + genPkt.addBeforeExc(genTcStartFrameCode(gen_file_def, tc_des) + +genEnableInsertTimeCode(0xa) + + '''spi_trans( (16'h0100), (`SPI_READ), (8), (`IF_IDX(0)));\n''' + #+ '''_temp_time = rxBuf[3] + (rxBuf[4] << 8) + (rxBuf[5] << 16) + (rxBuf[6] << 24) + (rxBuf[7] << 32) + (rxBuf[8] << 40) + (rxBuf[9] << 48) + (rxBuf[10] << 56);\n''' + + '''_temp_time = rxBuf[`ARRAY_IDX_OFF] + (rxBuf[`ARRAY_IDX_OFF+1] << 8) + (rxBuf[`ARRAY_IDX_OFF+2] << 16) + (rxBuf[`ARRAY_IDX_OFF+3] << 24) + (rxBuf[`ARRAY_IDX_OFF+4] << 32) + (rxBuf[`ARRAY_IDX_OFF+5] << 40) + (rxBuf[`ARRAY_IDX_OFF+6] << 48) + (rxBuf[`ARRAY_IDX_OFF+7] << 56);\n''' + + '''_temp_time = _temp_time + 32'h3000;\n\n''') + + genPkt.addSubPkt(0x0, 0, 0x0, 0xc, 12, b'\0'*12) + + genPkt.addSubPkt(0, 0, 0x18, 0xe, 2, [0x1, 0x58]) + #subPkt参数:索引、索引类型、地址、命令、长度、数据 + data = [0,] * 100 #bytearray(b"\0" * 100) + data[0] = 0x0f #地址0x120 + data[2] = 0xa + data[4] = 0xa + data[6] = 0xa + data[8] = 0xa + + data[16] = '''(_temp_time & 8'hff)''' #地址0x130, sync同步点 + data[17] = '''(_temp_time >> 8) & 8'hff''' #地址0x131 + data[18] = '''(_temp_time >> 16) & 8'hff''' + data[19] = '''(_temp_time >> 24) & 8'hff''' + + data[24] = 0x80 #地址0x138, sync周期 4B + data[25] = 0x00 #地址0x139 + + data[28] = 0x0 #sync1偏移 + data[29] = 0x0 + + data[36] = 0x0#sync3偏移 + data[37] = 0x0 + + genPkt.addSubPkt(0, 0, 0x120, 0xe, 0x28, data) + + data = [0,] * 100 #bytearray(b"\0" * 100) + data[0] = 0x0f #地址0x120 + data[2] = 0xa + data[4] = 0xa + data[6] = 0xa + data[8] = 0xa + + data[16] = '''(_temp_time & 8'hff)''' #地址0x130, sync同步点 + data[17] = '''(_temp_time >> 8) & 8'hff''' #地址0x131 + data[18] = '''(_temp_time >> 16) & 8'hff''' + data[19] = '''(_temp_time >> 24) & 8'hff''' + + data[24] = 0x00 #地址0x138, sync周期 4B + data[25] = 0x01 #地址0x139 + + data[28] = 0x0 #sync1偏移 + data[29] = 0x0 + + data[36] = 0x0 #sync3偏移 + data[37] = 0x0 + + genPkt.addSubPkt(3, 0, 0x120, 0x1, 0x28, data) + + data = [0,] * 100 #bytearray(b"\0" * 100) + data[0] = 0x0f #地址0x120 + data[2] = 0xa + data[4] = 0xa + data[6] = 0xa + data[8] = 0xa + + data[16] = '''(_temp_time & 8'hff)''' #地址0x130, sync同步点 + data[17] = '''(_temp_time >> 8) & 8'hff''' #地址0x131 + data[18] = '''(_temp_time >> 16) & 8'hff''' + data[19] = '''(_temp_time >> 24) & 8'hff''' + + data[24] = 0x00 #地址0x138, sync周期 4B + data[25] = 0x02 #地址0x139 + + data[28] = 0x0 #sync1偏移 + data[29] = 0x0 + + data[36] = 0x0 #sync3偏移 + data[37] = 0x0 + + genPkt.addSubPkt(4, 0, 0x120, 0x1, 0x28, data) + + data = [0,] * 100 #bytearray(b"\0" * 100) + data[0] = 0x0f #地址0x120 + data[2] = 0xa + data[4] = 0xa + data[6] = 0xa + data[8] = 0xa + + data[16] = '''(_temp_time & 8'hff)''' #地址0x130, sync同步点 + data[17] = '''(_temp_time >> 8) & 8'hff''' #地址0x131 + data[18] = '''(_temp_time >> 16) & 8'hff''' + data[19] = '''(_temp_time >> 24) & 8'hff''' + + data[24] = 0x00 #地址0x138, sync周期 4B + data[25] = 0x04 #地址0x139genPkt.addBeforeExc( + + data[28] = 0x0 #sync1偏移 + data[29] = 0x0 + + data[36] = 0x0 #sync3偏移 + data[37] = 0x0 + + genPkt.addSubPkt(2, 0, 0x120, 0x1, 0x28, data) + genPkt.addSubPkt(0, 0, 0x18, 0xe, 2, [0x0, 0x58]) + + #gen_file_def_ap = gen_file_def + "_rw01" + genPkt.addAfterExc(genWriteTransLenCode(gen_file_def, sm_idx) + +genWriteTransPktCode(gen_file_def, sm_idx) + +genTrgTransPktCode(gen_file_def, sm_idx) + +genReadAckPktCode(gen_file_def, sm_idx) + + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + + +genMessageCode("--清除中断") + +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + ) + + genPkt.gen("./generated/shin/%s.vh"%(gen_file_def,), 1) + + #>>>>>>同步数据包 + genPkt.clean() + genPkt.setPktType(0) + + #subPkt参数:索引、索引类型、地址、命令、长度、数据 + genPkt.addSubPkt(0x0, 0, 0x0, 0xc, 12, [0, ] * 12) + genPkt.addSubPkt(0x0, 0, 0x0, 0xd, 10, [0, ] * 10) + genPkt.addSubPkt(0x0, 0, 0x0, 0xd, 10, [0, ] * 10) + + + + + genPkt.addBeforeExc(genEnableInsertTimeCode(0xa))# + 18 + 18)) + + sm_idx = 0 + + gen_file_def_ap = gen_file_def + "_rw02" + + genPkt.addAfterExc(genWriteTransLenCode(gen_file_def_ap, sm_idx) + +genWriteTransPktCode(gen_file_def_ap, sm_idx) + +genTrgTransPktCode(gen_file_def_ap, sm_idx) + +genReadAckPktCode(gen_file_def_ap, sm_idx) + +genCheckInsertTimeCode() + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + + +genMessageCode("--清除中断") + +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + + #+"#5000000" + #+genIFRwDataCode(0, 0x40, True, 4, [0x01, 0x00, 0x66, 0x79]) + +genTcEndFrameCode(gen_file_def)) #+genDisableInsertTimeCode()) + + + genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1, True, gen_file_def_ap) + return gen_file_def + + +def tc7(): + genPkt = GenPkt() + + gen_file_def = "sync_tc07" + sm_idx = 0 + tc_des = ("同步后,SYNC信号采用脉冲触发,4个设备,4个周期;先用广播包发送公共周期;然后3,4,\\n" + "2设备单独指定周期。该同步数据之前没有补广播包。如果紧跟嗅探包而不是普通包之后,可能会影响同步。\\n" + "期望是无论前面发送得是什么包,都不会影响同步的效果。一段时间后,重新同步,期望不要打断sync\\n" + "信号的输出。需要在波形文件里查看具体的效果。" + ) + + + #------------------------------------------------------------------------- + #>>>>>>设置同步信号的数据包 + genPkt.clean() + genPkt.setPktType(0) + sm_idx = 3 + + genPkt.addBeforeExc(genTcStartFrameCode(gen_file_def, tc_des) + +genEnableInsertTimeCode(0xa) + + '''spi_trans( (16'h0100), (`SPI_READ), (8), (`IF_IDX(0)));\n''' + #+ '''_temp_time = rxBuf[3] + (rxBuf[4] << 8) + (rxBuf[5] << 16) + (rxBuf[6] << 24) + (rxBuf[7] << 32) + (rxBuf[8] << 40) + (rxBuf[9] << 48) + (rxBuf[10] << 56);\n''' + + '''_temp_time = rxBuf[`ARRAY_IDX_OFF] + (rxBuf[`ARRAY_IDX_OFF+1] << 8) + (rxBuf[`ARRAY_IDX_OFF+2] << 16) + (rxBuf[`ARRAY_IDX_OFF+3] << 24) + (rxBuf[`ARRAY_IDX_OFF+4] << 32) + (rxBuf[`ARRAY_IDX_OFF+5] << 40) + (rxBuf[`ARRAY_IDX_OFF+6] << 48) + (rxBuf[`ARRAY_IDX_OFF+7] << 56);\n''' + + '''_temp_time = _temp_time + 32'h3000;\n\n''') + + genPkt.addSubPkt(0x0, 0, 0x0, 0xc, 12, b'\0'*12) + genPkt.addSubPkt(0, 0, 0x18, 0xe, 2, [0x1, 0x58]) + + #subPkt参数:索引、索引类型、地址、命令、长度、数据 + data = [0,] * 100 #bytearray(b"\0" * 100) + data[0] = 0x0f #地址0x120 + data[2] = 0xa + data[4] = 0xa + data[6] = 0xa + data[8] = 0xa + + data[16] = '''(_temp_time & 8'hff)''' #地址0x130, sync同步点 + data[17] = '''(_temp_time >> 8) & 8'hff''' #地址0x131 + data[18] = '''(_temp_time >> 16) & 8'hff''' + data[19] = '''(_temp_time >> 24) & 8'hff''' + + data[24] = 0x80 #地址0x138, sync周期 4B + data[25] = 0x00 #地址0x139 + + data[28] = 0x0 #sync1偏移 + data[29] = 0x0 + + data[36] = 0x0#sync3偏移 + data[37] = 0x0 + + genPkt.addSubPkt(0, 0, 0x120, 0xe, 0x28, data) + + data = [0,] * 100 #bytearray(b"\0" * 100) + data[0] = 0x0f #地址0x120 + data[2] = 0xa + data[4] = 0xa + data[6] = 0xa + data[8] = 0xa + + data[16] = '''(_temp_time & 8'hff)''' #地址0x130, sync同步点 + data[17] = '''(_temp_time >> 8) & 8'hff''' #地址0x131 + data[18] = '''(_temp_time >> 16) & 8'hff''' + data[19] = '''(_temp_time >> 24) & 8'hff''' + + data[24] = 0x00 #地址0x138, sync周期 4B + data[25] = 0x01 #地址0x139 + + data[28] = 0x0 #sync1偏移 + data[29] = 0x0 + + data[36] = 0x0 #sync3偏移 + data[37] = 0x0 + + genPkt.addSubPkt(3, 0, 0x120, 0x1, 0x28, data) + + data = [0,] * 100 #bytearray(b"\0" * 100) + data[0] = 0x0f #地址0x120 + data[2] = 0xa + data[4] = 0xa + data[6] = 0xa + data[8] = 0xa + + data[16] = '''(_temp_time & 8'hff)''' #地址0x130, sync同步点 + data[17] = '''(_temp_time >> 8) & 8'hff''' #地址0x131 + data[18] = '''(_temp_time >> 16) & 8'hff''' + data[19] = '''(_temp_time >> 24) & 8'hff''' + + data[24] = 0x00 #地址0x138, sync周期 4B + data[25] = 0x02 #地址0x139 + + data[28] = 0x0 #sync1偏移 + data[29] = 0x0 + + data[36] = 0x0 #sync3偏移 + data[37] = 0x0 + + genPkt.addSubPkt(4, 0, 0x120, 0x1, 0x28, data) + + data = [0,] * 100 #bytearray(b"\0" * 100) + data[0] = 0x0f #地址0x120 + data[2] = 0xa + data[4] = 0xa + data[6] = 0xa + data[8] = 0xa + + data[16] = '''(_temp_time & 8'hff)''' #地址0x130, sync同步点 + data[17] = '''(_temp_time >> 8) & 8'hff''' #地址0x131 + data[18] = '''(_temp_time >> 16) & 8'hff''' + data[19] = '''(_temp_time >> 24) & 8'hff''' + + data[24] = 0x00 #地址0x138, sync周期 4B + data[25] = 0x04 #地址0x139genPkt.addBeforeExc( + + data[28] = 0x0 #sync1偏移 + data[29] = 0x0 + + data[36] = 0x0 #sync3偏移 + data[37] = 0x0 + + genPkt.addSubPkt(2, 0, 0x120, 0x1, 0x28, data) + genPkt.addSubPkt(0, 0, 0x18, 0xe, 2, [0x0, 0x58]) + + #gen_file_def_ap = gen_file_def + "_rw01" + genPkt.addAfterExc(genWriteTransLenCode(gen_file_def, sm_idx) + +genWriteTransPktCode(gen_file_def, sm_idx) + +genTrgTransPktCode(gen_file_def, sm_idx) + +genReadAckPktCode(gen_file_def, sm_idx) + + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + + +genMessageCode("--清除中断") + +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + ) + + genPkt.gen("./generated/shin/%s.vh"%(gen_file_def,), 1) + + #>>>>>>同步数据包 + genPkt.clean() + genPkt.setPktType(0) + + #subPkt参数:索引、索引类型、地址、命令、长度、数据 + genPkt.addSubPkt(0x0, 0, 0x0, 0xc, 12, [0, ] * 12) + genPkt.addSubPkt(0x0, 0, 0x0, 0xd, 10, [0, ] * 10) + genPkt.addSubPkt(0x0, 0, 0x0, 0xd, 10, [0, ] * 10) + + + + + genPkt.addBeforeExc(genEnableInsertTimeCode(0xa))# + 18 + 18)) + + sm_idx = 0 + + gen_file_def_ap = gen_file_def + "_rw02" + + genPkt.addAfterExc(genWriteTransLenCode(gen_file_def_ap, sm_idx) + +genWriteTransPktCode(gen_file_def_ap, sm_idx) + +genTrgTransPktCode(gen_file_def_ap, sm_idx) + +genReadAckPktCode(gen_file_def_ap, sm_idx) + +genCheckInsertTimeCode() + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + + +genMessageCode("--清除中断") + +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + + +"#5000000" + +genIFRwDataCode(0, 0x40, True, 4, [0x01, 0x00, 0x66, 0x79]) + ) #+genDisableInsertTimeCode()) + + + genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1, True, gen_file_def_ap) + + + genPkt.clean() + genPkt.setPktType(0) + sm_idx = 1 + + genPkt.addBeforeExc("\n#5000\n" + #+genIFRwDataCode(0, 0x09, True, 1, [0, ], False, iface=1) + +using_proper_workmode(0) + + +genIFRwDataCode(0, 0x74, False, 4) + #+genIFRwDataCode(0, 0x40, False, 4) + +genIFRwDataCode(0, 0x00, True, 1, [0x1, ]) + ) + + genPkt.addSubPkt(0x0, 0, 0x180, 0xd, 10, b'\0'*10) + + gen_file_def_ap = gen_file_def + "_rw03" + genPkt.addAfterExc(genWriteTransLenCode(gen_file_def_ap, sm_idx) + +genWriteTransPktCode(gen_file_def_ap, sm_idx) + +genTrgTransPktCode(gen_file_def_ap, sm_idx) + +genReadAckPktCode(gen_file_def_ap, sm_idx) + + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + + +genMessageCode("--清除中断") + +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + ) + + genPkt.gen("./generated/shin/%s.vh"%(gen_file_def,), 1, True, gen_file_def_ap) + + + genPkt.clean() + genPkt.setPktType(0) + sm_idx = 1 + + + genPkt.addBeforeExc(genEnableInsertTimeCode(0xa) + + '''spi_trans( (16'h0100), (`SPI_READ), (8), (`IF_IDX(0)));\n''' + #+ '''_temp_time = rxBuf[3] + (rxBuf[4] << 8) + (rxBuf[5] << 16) + (rxBuf[6] << 24) + (rxBuf[7] << 32) + (rxBuf[8] << 40) + (rxBuf[9] << 48) + (rxBuf[10] << 56);\n''' + + '''_temp_time = rxBuf[`ARRAY_IDX_OFF] + (rxBuf[`ARRAY_IDX_OFF+1] << 8) + (rxBuf[`ARRAY_IDX_OFF+2] << 16) + (rxBuf[`ARRAY_IDX_OFF+3] << 24) + (rxBuf[`ARRAY_IDX_OFF+4] << 32) + (rxBuf[`ARRAY_IDX_OFF+5] << 40) + (rxBuf[`ARRAY_IDX_OFF+6] << 48) + (rxBuf[`ARRAY_IDX_OFF+7] << 56);\n''' + + '''_temp_time = _temp_time + 32'h3000;\n\n''' + + '''txBuf[`ARRAY_IDX_OFF] = 8'h0f;\n''' + + '''txBuf[`ARRAY_IDX_OFF+1] = 8'h00;\n''' + + '''txBuf[`ARRAY_IDX_OFF+2] = 8'h0a;\n''' + + '''txBuf[`ARRAY_IDX_OFF+3] = 8'h00;\n''' + + '''txBuf[`ARRAY_IDX_OFF+4] = 8'h0a;\n''' + + '''txBuf[`ARRAY_IDX_OFF+5] = 8'h00;\n''' + + '''txBuf[`ARRAY_IDX_OFF+6] = 8'h0a;\n''' + + '''txBuf[`ARRAY_IDX_OFF+7] = 8'h00;\n''' + + '''txBuf[`ARRAY_IDX_OFF+8] = 8'h01;\n''' + + '''txBuf[`ARRAY_IDX_OFF+9] = 8'h00;\n''' + + '''txBuf[`ARRAY_IDX_OFF+16] = (_temp_time & 8'hff);\n''' + + '''txBuf[`ARRAY_IDX_OFF+17] = ( (_temp_time >> 8) & 8'hff);\n''' + + '''txBuf[`ARRAY_IDX_OFF+18] = ((_temp_time >> 16) & 8'hff);\n''' + + '''txBuf[`ARRAY_IDX_OFF+19] = ((_temp_time >> 24) & 8'hff);\n''' + + '''txBuf[`ARRAY_IDX_OFF+20] = ((_temp_time >> 32) & 8'hff);\n''' + + '''txBuf[`ARRAY_IDX_OFF+21] = 0;\n''' + + '''txBuf[`ARRAY_IDX_OFF+22] = 0;\n''' + + '''txBuf[`ARRAY_IDX_OFF+23] = 0;\n''' + + '''txBuf[`ARRAY_IDX_OFF+24] = 8'h80;\n''' + + '''txBuf[`ARRAY_IDX_OFF+25] = 8'h00;\n''' + + '''txBuf[`ARRAY_IDX_OFF+26] = 8'h00;\n''' + + '''txBuf[`ARRAY_IDX_OFF+27] = 8'h00;\n''' + + '''txBuf[`ARRAY_IDX_OFF+28] = 8'h00;\n''' + + '''txBuf[`ARRAY_IDX_OFF+29] = 8'h00;\n''' + + '''txBuf[`ARRAY_IDX_OFF+30] = 8'h00;\n''' + + '''txBuf[`ARRAY_IDX_OFF+31] = 8'h00;\n''' + + '''txBuf[`ARRAY_IDX_OFF+32] = 8'h00;\n''' + + '''txBuf[`ARRAY_IDX_OFF+33] = 8'h00;\n''' + + '''txBuf[`ARRAY_IDX_OFF+34] = 8'h00;\n''' + + '''txBuf[`ARRAY_IDX_OFF+35] = 8'h00;\n''' + + '''txBuf[`ARRAY_IDX_OFF+36] = 8'h00;\n''' + + '''txBuf[`ARRAY_IDX_OFF+37] = 8'h00;\n''' + + '''txBuf[`ARRAY_IDX_OFF+38] = 8'h00;\n''' + + '''txBuf[`ARRAY_IDX_OFF+39] = 8'h00;\n''' + + '''spi_trans( (16'h0120), (`SPI_WRITE), (40), (`IF_IDX(0)));\n''' + ) + + genPkt.addSubPkt(0x0, 0, 0x0, 0xc, 12, b'\0'*12) + genPkt.addSubPkt(0, 0, 0x18, 0xe, 2, [0x1, 0x58]) + #subPkt参数:索引、索引类型、地址、命令、长度、数据 + data = [0,] * 100 #bytearray(b"\0" * 100) + data[0] = 0x0f #地址0x120 + data[1] = 0x0 + data[2] = 0xa + data[3] = 0x0 + data[4] = 0xa + data[5] = 0x0 + data[6] = 0xa + data[8] = 0xa + + data[16] = '''(_temp_time & 8'hff)''' #地址0x130, sync同步点 + data[17] = '''(_temp_time >> 8) & 8'hff''' #地址0x131 + data[18] = '''(_temp_time >> 16) & 8'hff''' + data[19] = '''(_temp_time >> 24) & 8'hff''' + + data[24] = 0x80 #地址0x138, sync周期 4B + data[25] = 0x00 #地址0x139 + + data[28] = 0x0 #sync1偏移 + data[29] = 0x0 + + data[36] = 0x0#sync3偏移 + data[37] = 0x0 + + genPkt.addSubPkt(0, 0, 0x120, 0xe, 0x28, data) + + data = [0,] * 100 #bytearray(b"\0" * 100) + data[0] = 0x0f #地址0x120 + data[2] = 0xa + data[4] = 0xa + data[6] = 0xa + data[8] = 0xa + + data[16] = '''(_temp_time & 8'hff)''' #地址0x130, sync同步点 + data[17] = '''(_temp_time >> 8) & 8'hff''' #地址0x131 + data[18] = '''(_temp_time >> 16) & 8'hff''' + data[19] = '''(_temp_time >> 24) & 8'hff''' + + data[24] = 0x00 #地址0x138, sync周期 4B + data[25] = 0x01 #地址0x139 + + data[28] = 0x0 #sync1偏移 + data[29] = 0x0 + + data[36] = 0x0 #sync3偏移 + data[37] = 0x0 + + genPkt.addSubPkt(3, 0, 0x120, 0x1, 0x28, data) + + data = [0,] * 100 #bytearray(b"\0" * 100) + data[0] = 0x0f #地址0x120 + data[2] = 0xa + data[4] = 0xa + data[6] = 0xa + data[8] = 0xa + + data[16] = '''(_temp_time & 8'hff)''' #地址0x130, sync同步点 + data[17] = '''(_temp_time >> 8) & 8'hff''' #地址0x131 + data[18] = '''(_temp_time >> 16) & 8'hff''' + data[19] = '''(_temp_time >> 24) & 8'hff''' + + data[24] = 0x00 #地址0x138, sync周期 4B + data[25] = 0x02 #地址0x139 + + data[28] = 0x0 #sync1偏移 + data[29] = 0x0 + + data[36] = 0x0 #sync3偏移 + data[37] = 0x0 + + genPkt.addSubPkt(4, 0, 0x120, 0x1, 0x28, data) + + data = [0,] * 100 #bytearray(b"\0" * 100) + data[0] = 0x0f #地址0x120 + data[2] = 0xa + data[4] = 0xa + data[6] = 0xa + data[8] = 0xa + + data[16] = '''(_temp_time & 8'hff)''' #地址0x130, sync同步点 + data[17] = '''(_temp_time >> 8) & 8'hff''' #地址0x131 + data[18] = '''(_temp_time >> 16) & 8'hff''' + data[19] = '''(_temp_time >> 24) & 8'hff''' + + data[24] = 0x00 #地址0x138, sync周期 4B + data[25] = 0x04 #地址0x139genPkt.addBeforeExc( + + data[28] = 0x0 #sync1偏移 + data[29] = 0x0 + + data[36] = 0x0 #sync3偏移 + data[37] = 0x0 + + genPkt.addSubPkt(2, 0, 0x120, 0x1, 0x28, data) + genPkt.addSubPkt(0, 0, 0x18, 0xe, 2, [0x0, 0x58]) + + gen_file_def_ap = gen_file_def + "_rw04" + genPkt.addAfterExc(genWriteTransLenCode(gen_file_def_ap, sm_idx) + +genWriteTransPktCode(gen_file_def_ap, sm_idx) + +genTrgTransPktCode(gen_file_def_ap, sm_idx) + +genReadAckPktCode(gen_file_def_ap, sm_idx) + + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + + +genMessageCode("--清除中断") + +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + +genTcEndFrameCode(gen_file_def) + ) + + genPkt.gen("./generated/shin/%s.vh"%(gen_file_def,), 1, True, gen_file_def_ap) + + + return gen_file_def + + +def tc8(): + genPkt = GenPkt() + + gen_file_def = "sync_tc08" + sm_idx = 0 + tc_des = ("同步后,SYNC信号采用脉冲触发,4个设备,4个周期;先用广播包发送公共周期;然后3,4,\\n" + "2设备单独指定周期。该同步数据之前没有补广播包。如果紧跟嗅探包而不是普通包之后,可能会影响同步。\\n" + "期望是无论前面发送得是什么包,都不会影响同步的效果。一段时间后,重新同步,期望不要打断sync\\n" + "信号的输出。需要在波形文件里查看具体的效果。\\n" + "同时,后面同步采用的是0xa,微调同步包,没办法大尺度地同步。整个系统工作一段时间后,\\n" + "先复位主、再复位从1,从1的时钟慢于主;从2、3、4的时钟快于主,从同步后的结果看,0xa命令同步后,\\n" + "从1的时钟往前最多调整10个周期;从2的时钟最多往后调整10个周期。需要在波形文件里确认。" + ) + + + #------------------------------------------------------------------------- + #>>>>>>设置同步信号的数据包 + genPkt.clean() + genPkt.setPktType(0) + sm_idx = 3 + + genPkt.addBeforeExc(genTcStartFrameCode(gen_file_def, tc_des) + +genEnableInsertTimeCode(0xa) + + '''spi_trans( (16'h0100), (`SPI_READ), (8), (`IF_IDX(0)));\n''' + #+ '''_temp_time = rxBuf[3] + (rxBuf[4] << 8) + (rxBuf[5] << 16) + (rxBuf[6] << 24) + (rxBuf[7] << 32) + (rxBuf[8] << 40) + (rxBuf[9] << 48) + (rxBuf[10] << 56);\n''' + + '''_temp_time = rxBuf[`ARRAY_IDX_OFF] + (rxBuf[`ARRAY_IDX_OFF+1] << 8) + (rxBuf[`ARRAY_IDX_OFF+2] << 16) + (rxBuf[`ARRAY_IDX_OFF+3] << 24) + (rxBuf[`ARRAY_IDX_OFF+4] << 32) + (rxBuf[`ARRAY_IDX_OFF+5] << 40) + (rxBuf[`ARRAY_IDX_OFF+6] << 48) + (rxBuf[`ARRAY_IDX_OFF+7] << 56);\n''' + + '''_temp_time = _temp_time + 32'h3000;\n\n''') + + genPkt.addSubPkt(0x0, 0, 0x0, 0xc, 12, b'\0'*12) + genPkt.addSubPkt(0, 0, 0x18, 0xe, 2, [0x1, 0x58]) + + #subPkt参数:索引、索引类型、地址、命令、长度、数据 + data = [0,] * 100 #bytearray(b"\0" * 100) + data[0] = 0x0f #地址0x120 + data[2] = 0xa + data[4] = 0xa + data[6] = 0xa + data[8] = 0xa + + data[16] = '''(_temp_time & 8'hff)''' #地址0x130, sync同步点 + data[17] = '''(_temp_time >> 8) & 8'hff''' #地址0x131 + data[18] = '''(_temp_time >> 16) & 8'hff''' + data[19] = '''(_temp_time >> 24) & 8'hff''' + + data[24] = 0x80 #地址0x138, sync周期 4B + data[25] = 0x00 #地址0x139 + + data[28] = 0x0 #sync1偏移 + data[29] = 0x0 + + data[36] = 0x0#sync3偏移 + data[37] = 0x0 + + genPkt.addSubPkt(0, 0, 0x120, 0xe, 0x28, data) + + data = [0,] * 100 #bytearray(b"\0" * 100) + data[0] = 0x0f #地址0x120 + data[2] = 0xa + data[4] = 0xa + data[6] = 0xa + data[8] = 0xa + + data[16] = '''(_temp_time & 8'hff)''' #地址0x130, sync同步点 + data[17] = '''(_temp_time >> 8) & 8'hff''' #地址0x131 + data[18] = '''(_temp_time >> 16) & 8'hff''' + data[19] = '''(_temp_time >> 24) & 8'hff''' + + data[24] = 0x00 #地址0x138, sync周期 4B + data[25] = 0x01 #地址0x139 + + data[28] = 0x0 #sync1偏移 + data[29] = 0x0 + + data[36] = 0x0 #sync3偏移 + data[37] = 0x0 + + genPkt.addSubPkt(3, 0, 0x120, 0x1, 0x28, data) + + data = [0,] * 100 #bytearray(b"\0" * 100) + data[0] = 0x0f #地址0x120 + data[2] = 0xa + data[4] = 0xa + data[6] = 0xa + data[8] = 0xa + + data[16] = '''(_temp_time & 8'hff)''' #地址0x130, sync同步点 + data[17] = '''(_temp_time >> 8) & 8'hff''' #地址0x131 + data[18] = '''(_temp_time >> 16) & 8'hff''' + data[19] = '''(_temp_time >> 24) & 8'hff''' + + data[24] = 0x00 #地址0x138, sync周期 4B + data[25] = 0x02 #地址0x139 + + data[28] = 0x0 #sync1偏移 + data[29] = 0x0 + + data[36] = 0x0 #sync3偏移 + data[37] = 0x0 + + genPkt.addSubPkt(4, 0, 0x120, 0x1, 0x28, data) + + data = [0,] * 100 #bytearray(b"\0" * 100) + data[0] = 0x0f #地址0x120 + data[2] = 0xa + data[4] = 0xa + data[6] = 0xa + data[8] = 0xa + + data[16] = '''(_temp_time & 8'hff)''' #地址0x130, sync同步点 + data[17] = '''(_temp_time >> 8) & 8'hff''' #地址0x131 + data[18] = '''(_temp_time >> 16) & 8'hff''' + data[19] = '''(_temp_time >> 24) & 8'hff''' + + data[24] = 0x00 #地址0x138, sync周期 4B + data[25] = 0x04 #地址0x139genPkt.addBeforeExc( + + data[28] = 0x0 #sync1偏移 + data[29] = 0x0 + + data[36] = 0x0 #sync3偏移 + data[37] = 0x0 + + genPkt.addSubPkt(2, 0, 0x120, 0x1, 0x28, data) + genPkt.addSubPkt(0, 0, 0x18, 0xe, 2, [0x0, 0x58]) + + #gen_file_def_ap = gen_file_def + "_rw01" + genPkt.addAfterExc(genWriteTransLenCode(gen_file_def, sm_idx) + +genWriteTransPktCode(gen_file_def, sm_idx) + +genTrgTransPktCode(gen_file_def, sm_idx) + +genReadAckPktCode(gen_file_def, sm_idx) + + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + + +genMessageCode("--清除中断") + +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + ) + + genPkt.gen("./generated/shin/%s.vh"%(gen_file_def,), 1) + + #>>>>>>同步数据包 + genPkt.clean() + genPkt.setPktType(0) + + #subPkt参数:索引、索引类型、地址、命令、长度、数据 + genPkt.addSubPkt(0x0, 0, 0x0, 0xa, 12, [0, ] * 12) + genPkt.addSubPkt(0x0, 0, 0x0, 0xd, 10, [0, ] * 10) + genPkt.addSubPkt(0x0, 0, 0x0, 0xd, 10, [0, ] * 10) + + genPkt.addBeforeExc(genEnableInsertTimeCode(0xa))# + 18 + 18)) + + sm_idx = 0 + + gen_file_def_ap = gen_file_def + "_rw02" + + genPkt.addAfterExc(genWriteTransLenCode(gen_file_def_ap, sm_idx) + +genWriteTransPktCode(gen_file_def_ap, sm_idx) + +genTrgTransPktCode(gen_file_def_ap, sm_idx) + +genReadAckPktCode(gen_file_def_ap, sm_idx) + +genCheckInsertTimeCode() + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + + +genMessageCode("--清除中断") + +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + + +"#50000" + +genIFRwDataCode(0, 0x40, True, 4, [0x01, 0x00, 0x66, 0x79]) + + +"#50000" + +genIFRwDataCode(1, 0x40, True, 4, [0x01, 0x00, 0x66, 0x79]) + ) #+genDisableInsertTimeCode()) + + + genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1, True, gen_file_def_ap) + + genPkt.clean() + genPkt.setPktType(1) + sm_idx = 1 + + genPkt.addBeforeExc("\n#5000\n" + #+genIFRwDataCode(0, 0x09, True, 1, [0, ], False, iface=1) + +using_proper_workmode(0) + + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(0, 0x00, True, 1, [0x1, ]) + +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + + #+genIFRwDataCode(1, 0x09, True, 1, [0, ], False, iface=1) + +using_proper_workmode(1) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(1, 0x00, True, 1, [0x2, ]) + + +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + ) + + gen_file_def_ap = gen_file_def + "_rw03" + genPkt.addAfterExc(genWriteTransLenCode(gen_file_def_ap, sm_idx) + +genWriteTransPktCode(gen_file_def_ap, sm_idx) + +genTrgTransPktCode(gen_file_def_ap, sm_idx) + +genReadAckPktCode(gen_file_def_ap, sm_idx) + + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + + +genMessageCode("--清除中断") + +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + ) + + genPkt.gen("./generated/shin/%s.vh"%(gen_file_def,), 1, True, gen_file_def_ap) + + + genPkt.clean() + genPkt.setPktType(0) + sm_idx = 1 + + genPkt.addSubPkt(0x0, 0, 0, 0xb, 2, [0x3f, 0xff]) + + + gen_file_def_ap = gen_file_def + "_rw04" + + genPkt.addAfterExc(genWriteTransLenCode(gen_file_def_ap, sm_idx) + +genWriteTransPktCode(gen_file_def_ap, sm_idx) + +genTrgTransPktCode(gen_file_def_ap, sm_idx) + +genReadAckPktCode(gen_file_def_ap, sm_idx) + + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + + +genMessageCode("--清除中断") + +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + ) + + genPkt.gen("./generated/shin/%s.vh"%(gen_file_def,), 1, True, gen_file_def_ap) + + + + + genPkt.clean() + genPkt.setPktType(0) + sm_idx = 1 + + genPkt.addBeforeExc("\n#5000\n" + #+genIFRwDataCode(0, 0x09, True, 1, [0, ], False, iface=1) + +using_proper_workmode(0) + + +genIFRwDataCode(0, 0x74, False, 4) + #+genIFRwDataCode(0, 0x40, False, 4) + +genIFRwDataCode(0, 0x00, True, 1, [0x1, ]) + ) + + genPkt.addSubPkt(0x0, 0, 0x180, 0xd, 10, b'\0'*10) + + gen_file_def_ap = gen_file_def + "_rw05" + genPkt.addAfterExc(genWriteTransLenCode(gen_file_def_ap, sm_idx) + +genWriteTransPktCode(gen_file_def_ap, sm_idx) + +genTrgTransPktCode(gen_file_def_ap, sm_idx) + +genReadAckPktCode(gen_file_def_ap, sm_idx) + + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + + +genMessageCode("--清除中断") + +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + ) + + genPkt.gen("./generated/shin/%s.vh"%(gen_file_def,), 1, True, gen_file_def_ap) + + + genPkt.clean() + genPkt.setPktType(0) + sm_idx = 1 + + + genPkt.addBeforeExc(genEnableInsertTimeCode(0xa) + + '''spi_trans( (16'h0100), (`SPI_READ), (8), (`IF_IDX(0)));\n''' + #+ '''_temp_time = rxBuf[3] + (rxBuf[4] << 8) + (rxBuf[5] << 16) + (rxBuf[6] << 24) + (rxBuf[7] << 32) + (rxBuf[8] << 40) + (rxBuf[9] << 48) + (rxBuf[10] << 56);\n''' + + '''_temp_time = rxBuf[`ARRAY_IDX_OFF] + (rxBuf[`ARRAY_IDX_OFF+1] << 8) + (rxBuf[`ARRAY_IDX_OFF+2] << 16) + (rxBuf[`ARRAY_IDX_OFF+3] << 24) + (rxBuf[`ARRAY_IDX_OFF+4] << 32) + (rxBuf[`ARRAY_IDX_OFF+5] << 40) + (rxBuf[`ARRAY_IDX_OFF+6] << 48) + (rxBuf[`ARRAY_IDX_OFF+7] << 56);\n''' + + '''_temp_time = _temp_time + 32'h3000;\n\n''' + + '''txBuf[`ARRAY_IDX_OFF] = 8'h0f;\n''' + + '''txBuf[`ARRAY_IDX_OFF+1] = 8'h00;\n''' + + '''txBuf[`ARRAY_IDX_OFF+2] = 8'h0a;\n''' + + '''txBuf[`ARRAY_IDX_OFF+3] = 8'h00;\n''' + + '''txBuf[`ARRAY_IDX_OFF+4] = 8'h0a;\n''' + + '''txBuf[`ARRAY_IDX_OFF+5] = 8'h00;\n''' + + '''txBuf[`ARRAY_IDX_OFF+6] = 8'h0a;\n''' + + '''txBuf[`ARRAY_IDX_OFF+7] = 8'h00;\n''' + + '''txBuf[`ARRAY_IDX_OFF+8] = 8'h01;\n''' + + '''txBuf[`ARRAY_IDX_OFF+9] = 8'h00;\n''' + + '''txBuf[`ARRAY_IDX_OFF+16] = (_temp_time & 8'hff);\n''' + + '''txBuf[`ARRAY_IDX_OFF+17] = ( (_temp_time >> 8) & 8'hff);\n''' + + '''txBuf[`ARRAY_IDX_OFF+18] = ((_temp_time >> 16) & 8'hff);\n''' + + '''txBuf[`ARRAY_IDX_OFF+19] = ((_temp_time >> 24) & 8'hff);\n''' + + '''txBuf[`ARRAY_IDX_OFF+20] = ((_temp_time >> 32) & 8'hff);\n''' + + '''txBuf[`ARRAY_IDX_OFF+21] = 0;\n''' + + '''txBuf[`ARRAY_IDX_OFF+22] = 0;\n''' + + '''txBuf[`ARRAY_IDX_OFF+23] = 0;\n''' + + '''txBuf[`ARRAY_IDX_OFF+24] = 8'h80;\n''' + + '''txBuf[`ARRAY_IDX_OFF+25] = 8'h00;\n''' + + '''txBuf[`ARRAY_IDX_OFF+26] = 8'h00;\n''' + + '''txBuf[`ARRAY_IDX_OFF+27] = 8'h00;\n''' + + '''txBuf[`ARRAY_IDX_OFF+28] = 8'h00;\n''' + + '''txBuf[`ARRAY_IDX_OFF+29] = 8'h00;\n''' + + '''txBuf[`ARRAY_IDX_OFF+30] = 8'h00;\n''' + + '''txBuf[`ARRAY_IDX_OFF+31] = 8'h00;\n''' + + '''txBuf[`ARRAY_IDX_OFF+32] = 8'h00;\n''' + + '''txBuf[`ARRAY_IDX_OFF+33] = 8'h00;\n''' + + '''txBuf[`ARRAY_IDX_OFF+34] = 8'h00;\n''' + + '''txBuf[`ARRAY_IDX_OFF+35] = 8'h00;\n''' + + '''txBuf[`ARRAY_IDX_OFF+36] = 8'h00;\n''' + + '''txBuf[`ARRAY_IDX_OFF+37] = 8'h00;\n''' + + '''txBuf[`ARRAY_IDX_OFF+38] = 8'h00;\n''' + + '''txBuf[`ARRAY_IDX_OFF+39] = 8'h00;\n''' + + '''spi_trans( (16'h0120), (`SPI_WRITE), (40), (`IF_IDX(0)));\n''' + ) + + genPkt.addSubPkt(0x0, 0, 0x0, 0xa, 12, b'\0'*12) + genPkt.addSubPkt(0, 0, 0x18, 0xe, 2, [0x1, 0x58]) + #subPkt参数:索引、索引类型、地址、命令、长度、数据 + data = [0,] * 100 #bytearray(b"\0" * 100) + data[0] = 0x0f #地址0x120 + data[1] = 0x0 + data[2] = 0xa + data[3] = 0x0 + data[4] = 0xa + data[5] = 0x0 + data[6] = 0xa + data[8] = 0xa + + data[16] = '''(_temp_time & 8'hff)''' #地址0x130, sync同步点 + data[17] = '''(_temp_time >> 8) & 8'hff''' #地址0x131 + data[18] = '''(_temp_time >> 16) & 8'hff''' + data[19] = '''(_temp_time >> 24) & 8'hff''' + + data[24] = 0x80 #地址0x138, sync周期 4B + data[25] = 0x00 #地址0x139 + + data[28] = 0x0 #sync1偏移 + data[29] = 0x0 + + data[36] = 0x0#sync3偏移 + data[37] = 0x0 + + genPkt.addSubPkt(0, 0, 0x120, 0xe, 0x28, data) + + data = [0,] * 100 #bytearray(b"\0" * 100) + data[0] = 0x0f #地址0x120 + data[2] = 0xa + data[4] = 0xa + data[6] = 0xa + data[8] = 0xa + + data[16] = '''(_temp_time & 8'hff)''' #地址0x130, sync同步点 + data[17] = '''(_temp_time >> 8) & 8'hff''' #地址0x131 + data[18] = '''(_temp_time >> 16) & 8'hff''' + data[19] = '''(_temp_time >> 24) & 8'hff''' + + data[24] = 0x00 #地址0x138, sync周期 4B + data[25] = 0x01 #地址0x139 + + data[28] = 0x0 #sync1偏移 + data[29] = 0x0 + + data[36] = 0x0 #sync3偏移 + data[37] = 0x0 + + genPkt.addSubPkt(3, 0, 0x120, 0x1, 0x28, data) + + data = [0,] * 100 #bytearray(b"\0" * 100) + data[0] = 0x0f #地址0x120 + data[2] = 0xa + data[4] = 0xa + data[6] = 0xa + data[8] = 0xa + + data[16] = '''(_temp_time & 8'hff)''' #地址0x130, sync同步点 + data[17] = '''(_temp_time >> 8) & 8'hff''' #地址0x131 + data[18] = '''(_temp_time >> 16) & 8'hff''' + data[19] = '''(_temp_time >> 24) & 8'hff''' + + data[24] = 0x00 #地址0x138, sync周期 4B + data[25] = 0x02 #地址0x139 + + data[28] = 0x0 #sync1偏移 + data[29] = 0x0 + + data[36] = 0x0 #sync3偏移 + data[37] = 0x0 + + genPkt.addSubPkt(4, 0, 0x120, 0x1, 0x28, data) + + data = [0,] * 100 #bytearray(b"\0" * 100) + data[0] = 0x0f #地址0x120 + data[2] = 0xa + data[4] = 0xa + data[6] = 0xa + data[8] = 0xa + + data[16] = '''(_temp_time & 8'hff)''' #地址0x130, sync同步点 + data[17] = '''(_temp_time >> 8) & 8'hff''' #地址0x131 + data[18] = '''(_temp_time >> 16) & 8'hff''' + data[19] = '''(_temp_time >> 24) & 8'hff''' + + data[24] = 0x00 #地址0x138, sync周期 4B + data[25] = 0x04 #地址0x139genPkt.addBeforeExc( + + data[28] = 0x0 #sync1偏移 + data[29] = 0x0 + + data[36] = 0x0 #sync3偏移 + data[37] = 0x0 + + genPkt.addSubPkt(2, 0, 0x120, 0x1, 0x28, data) + genPkt.addSubPkt(0, 0, 0x18, 0xe, 2, [0x0, 0x58]) + + gen_file_def_ap = gen_file_def + "_rw06" + genPkt.addAfterExc(genWriteTransLenCode(gen_file_def_ap, sm_idx) + +genWriteTransPktCode(gen_file_def_ap, sm_idx) + +genTrgTransPktCode(gen_file_def_ap, sm_idx) + +genReadAckPktCode(gen_file_def_ap, sm_idx) + + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + + +genMessageCode("--清除中断") + +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + + ) + + genPkt.gen("./generated/shin/%s.vh"%(gen_file_def,), 1, True, gen_file_def_ap) + + #>>>>>>同步数据包 + genPkt.clean() + genPkt.setPktType(0) + + #subPkt参数:索引、索引类型、地址、命令、长度、数据 + genPkt.addSubPkt(0x0, 0, 0x0, 0xa, 12, [0, ] * 12) + #genPkt.addSubPkt(0x0, 0, 0x0, 0xd, 10, [0, ] * 10) + #genPkt.addSubPkt(0x0, 0, 0x0, 0xd, 10, [0, ] * 10) + + + + + genPkt.addBeforeExc(genEnableInsertTimeCode(0xa))# + 18 + 18)) + + sm_idx = 0 + + gen_file_def_ap = gen_file_def + "_rw07" + + genPkt.addAfterExc(genWriteTransLenCode(gen_file_def_ap, sm_idx) + +genWriteTransPktCode(gen_file_def_ap, sm_idx) + +genTrgTransPktCode(gen_file_def_ap, sm_idx) + +genReadAckPktCode(gen_file_def_ap, sm_idx) + +genCheckInsertTimeCode() + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + + +genMessageCode("--清除中断") + +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) + + +genMessageCode("--读取中断") + +genIFRwDataCode(0, 0x74, False, 4) + +genIFRwDataCode(1, 0x74, False, 4) + +genIFRwDataCode(2, 0x74, False, 4) + +genIFRwDataCode(3, 0x74, False, 4) + +genIFRwDataCode(4, 0x74, False, 4) + + +genTcEndFrameCode(gen_file_def) + ) #+genDisableInsertTimeCode()) + + + genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1, True, gen_file_def_ap) + + return gen_file_def diff --git a/tb/shinTest/testcase/watchdog.py b/tb/shinTest/testcase/watchdog.py index fb0f743..593e5e5 100644 --- a/tb/shinTest/testcase/watchdog.py +++ b/tb/shinTest/testcase/watchdog.py @@ -1,370 +1,370 @@ -from pyutils import * - - - -''' -看门狗0超时逻辑: -1. 看门狗0从系统发送下行包时,触发工作; -2. 系统上行时,停止看门狗工作并复位看门狗计数器;若发生超时,报超时状态,复位继续工作,此时有上行包,不予响应; -3. 看门狗不使能,则对应的看门狗停止工作,也不会报相关的状态位与中断; -4. 写对应的看门狗状态寄存器,对应看门狗被复位;需要重新触发才能工作。 - - -SM0/2/4/6与SM1/3/5/7超时逻辑: -1. 看门狗从读写第一个字节被触发计时工作;第二次读写第一个字节,不影响看门狗工作; -2. 读写最后一个字节,停止看门狗工作并复位看门狗计数器;若发生超时,报超时状态,复位继续工作,此时系统读到最后一个字节,不予响应。 -3. 看门狗不使能,则对应的看门狗停止工作,也不会报相关的状态位与中断; -4. 写对应的看门狗状态寄存器,对应看门狗被复位;需要重新触发才能工作。 - -看门狗17超时逻辑: -1. 看门狗17从系统发送第一个下行包时,触发工作; -2. 系统发送第二个下行包时,停止看门狗工作并复位看门狗计数器;若发生超时,报超时状态,复位继续工作; -3. 看门狗不使能,则对应的看门狗停止工作,也不会报相关的状态位与中断; -4. 写对应的看门狗状态寄存器,对应看门狗被复位;需要重新触发才能工作。 - - -复位继续工作,指看门狗需要重新被触发开始计数直至超时或者复位。写看门狗状态,无论超时没超时,对应bit为1,则对应看门狗被复位。 -''' - -def watchdog_test_sm_wr_timeout(tc_id, wd_id): - genPkt = GenPkt() - - gen_file_def = "watchdog_tc%02d"%(tc_id, ) - sm_idx = 0 - - slave_sm_id = int((wd_id - 1) / 2) - tc_des = (f"使能看门狗{wd_id},监视SM{slave_sm_id},写数据到SM中,只写一半,看Watchdog是否超时。\\n" - "清除中断后,错误消失,出问题的设备恢复正常。" - ) - - #-------------------------------------------------------------------------- - #>>>>>> 测试用例1 看门狗测试 - genPkt.clean() - genPkt.setPktType(0) - - data = 1 << wd_id ##使能看门狗 - data0 = [data&0xff, (data>>8)&0xff, (data>>16)&0xff, (data>>24)&0xff] - - data = 0x002000 ##看门狗的超时值 - data1 = [data&0xff, (data>>8)&0xff, (data>>16)&0xff, (data>>24)&0xff] - - data = 0xffffffff ##清除中断 - data2 = [data&0xff, (data>>8)&0xff, (data>>16)&0xff, (data>>24)&0xff] - - genPkt.addBeforeExc(genTcStartFrameCode(gen_file_def, tc_des) - + genIFRwDataCode(0, 0x078, True, 4, [0xff, 0xff, 0xff, 0xff]) - + genIFRwDataCode(1, 0x404, True, 4, data0) - + genIFRwDataCode(1, 0x40C + (wd_id - 1) * 4, True, 4, data1) - + genIFRwDataCode(1, 0x078, True, 4, data2) - + genIFRwDataCode(2, 0x078, True, 4, data2) - + genIFRwDataCode(3, 0x078, True, 4, data2) - + genIFRwDataCode(4, 0x078, True, 4, data2) - + genIFRwDataCode(1, 0x400, True, 4, [0xff, 0xff, 0xff, 0xff]) - + genIFRwDataCode(0, 0x074, False, 0x04) - + genIFRwDataCode(1, 0x074, False, 0x04) - + genIFRwDataCode(2, 0x074, False, 0x04) - + genIFRwDataCode(3, 0x074, False, 0x04) - + genIFRwDataCode(4, 0x074, False, 0x04) - + genIFRwDataCode(1, 0x400, False, 0x04)) - #genPkt.addBeforeExc( genIFRwDataCode(1, 0x078, True, 4, [0xff, 0xff, 0xff, 0xff])) - - data = [0,] * 2 - data[0] = 0x80 - data[1] = 0x00 - genPkt.addSubPkt(0x0, 0, 0x302 + slave_sm_id * 4, 0xe, 2, data) - - data = [0,] * 0x50 - - #subPkt参数:索引、索引类型、地址、命令、长度、数据 - sm_addr = slave_sm_id * 0x1000 + 0x800 - genPkt.addSubPkt(1, 0, sm_addr, 0x1, 0x50, data) - - sm_idx = 0 - - genPkt.addAfterExc(genWriteTransLenCode(gen_file_def, sm_idx) - +genWriteTransPktCode(gen_file_def, sm_idx) - +genTrgTransPktCode(gen_file_def, sm_idx) - +genReadAckPktCode(gen_file_def, sm_idx) - +genMessageCode("--检查中断寄存器") - +genIFRwDataCode(0, 0x074, False, 0x04) - +genIFRwDataCode(1, 0x074, False, 0x04) - +genIFRwDataCode(2, 0x074, False, 0x04) - +genIFRwDataCode(3, 0x074, False, 0x04) - +genIFRwDataCode(4, 0x074, False, 0x04) - +genMessageCode("--延时后检查看门狗寄存器") - +"#700000\n" - +genIFRwDataCode(1, 0x400, False, 0x04) - +genIFRwDataCode(1, 0x400, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(1, 0x400, False, 0x04) - +genMessageCode("--复位数据缓冲区") - +genIFRwDataCode(1, 0x300 + slave_sm_id * 4, True, 1, [0, ]) - +genMessageCode("--延时后检查看门狗寄存器") - +"#1200000\n" - +genIFRwDataCode(1, 0x400, False, 0x04) - +genTcEndFrameCode(gen_file_def)) - - genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1) - - return gen_file_def - -def watchdog_test_sm_wr_no_timeout(tc_id, wd_id): - genPkt = GenPkt() - - gen_file_def = "watchdog_tc%02d"%(tc_id, ) - sm_idx = 0 - - slave_sm_id = int((wd_id - 1) / 2) - tc_des = (f"使能看门狗{wd_id},监视SM{slave_sm_id},写数据到SM中,只写一半,看Watchdog是否超时。\\n" - "清除中断后,错误消失,出问题的设备恢复正常。" - ) - - #-------------------------------------------------------------------------- - #>>>>>> 测试用例1 看门狗测试 - genPkt.clean() - genPkt.setPktType(0) - - data = 1 << wd_id ##使能看门狗 - data0 = [data&0xff, (data>>8)&0xff, (data>>16)&0xff, (data>>24)&0xff] - - data = 0x002000 ##看门狗的超时值 - data1 = [data&0xff, (data>>8)&0xff, (data>>16)&0xff, (data>>24)&0xff] - - data = 0xffffffff ##清除中断 - data2 = [data&0xff, (data>>8)&0xff, (data>>16)&0xff, (data>>24)&0xff] - - genPkt.addBeforeExc(genTcStartFrameCode(gen_file_def, tc_des) - + genIFRwDataCode(0, 0x078, True, 4, [0xff, 0xff, 0xff, 0xff]) - + genIFRwDataCode(1, 0x404, True, 4, data0) - + genIFRwDataCode(1, 0x40C + (wd_id - 1) * 4, True, 4, data1) - + genIFRwDataCode(1, 0x078, True, 4, data2) - + genIFRwDataCode(2, 0x078, True, 4, data2) - + genIFRwDataCode(3, 0x078, True, 4, data2) - + genIFRwDataCode(4, 0x078, True, 4, data2) - + genIFRwDataCode(1, 0x400, True, 4, [0xff, 0xff, 0xff, 0xff]) - + genIFRwDataCode(0, 0x074, False, 0x04) - + genIFRwDataCode(1, 0x074, False, 0x04) - + genIFRwDataCode(2, 0x074, False, 0x04) - + genIFRwDataCode(3, 0x074, False, 0x04) - + genIFRwDataCode(4, 0x074, False, 0x04) - + genIFRwDataCode(1, 0x400, False, 0x04)) - #genPkt.addBeforeExc( genIFRwDataCode(1, 0x078, True, 4, [0xff, 0xff, 0xff, 0xff])) - - data = [0,] * 2 - data[0] = 0x80 - data[1] = 0x00 - genPkt.addSubPkt(0x0, 0, 0x302 + slave_sm_id * 4, 0xe, 2, data) - - data = [0,] * 0x80 - - #subPkt参数:索引、索引类型、地址、命令、长度、数据 - sm_addr = slave_sm_id * 0x1000 + 0x800 - genPkt.addSubPkt(1, 0, sm_addr, 0x1, 0x80, data) - - sm_idx = 0 - - genPkt.addAfterExc(genWriteTransLenCode(gen_file_def, sm_idx) - +genWriteTransPktCode(gen_file_def, sm_idx) - +genTrgTransPktCode(gen_file_def, sm_idx) - +genReadAckPktCode(gen_file_def, sm_idx) - +genMessageCode("--检查中断寄存器") - +genIFRwDataCode(0, 0x074, False, 0x04) - +genIFRwDataCode(1, 0x074, False, 0x04) - +genIFRwDataCode(2, 0x074, False, 0x04) - +genIFRwDataCode(3, 0x074, False, 0x04) - +genIFRwDataCode(4, 0x074, False, 0x04) - +genMessageCode("--延时后检查看门狗寄存器") - +"#700000\n" - +genIFRwDataCode(1, 0x400, False, 0x04) - +genIFRwDataCode(1, 0x400, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(1, 0x400, False, 0x04) - +genMessageCode("--复位数据缓冲区") - +genIFRwDataCode(1, 0x300 + slave_sm_id * 4, True, 1, [0, ]) - +genMessageCode("--延时后检查看门狗寄存器") - +"#1200000\n" - +genIFRwDataCode(1, 0x400, False, 0x04) - +genTcEndFrameCode(gen_file_def)) - - genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1) - - return gen_file_def - - -def watchdog_test_sm_rd_timeout(tc_id, wd_id): - genPkt = GenPkt() - - gen_file_def = "watchdog_tc%02d"%(tc_id, ) - sm_idx = 0 - - slave_sm_id = int((wd_id - 1) / 2) - tc_des = (f"使能看门狗{wd_id},监视SM{slave_sm_id},写数据到SM中,只读一半,看Watchdog是否超时。\\n" - "清除中断后,错误消失,出问题的设备恢复正常。" - ) - - #-------------------------------------------------------------------------- - #>>>>>> 测试用例1 看门狗测试 - genPkt.clean() - genPkt.setPktType(0) - - data = 1 << wd_id ##使能看门狗 - data0 = [data&0xff, (data>>8)&0xff, (data>>16)&0xff, (data>>24)&0xff] - - data = 0x002000 ##看门狗的超时值 - data1 = [data&0xff, (data>>8)&0xff, (data>>16)&0xff, (data>>24)&0xff] - - genPkt.addBeforeExc(genTcStartFrameCode(gen_file_def, tc_des) - + genIFRwDataCode(1, 0x404, True, 4, data0) - + genIFRwDataCode(1, 0x40C + (wd_id - 1) * 4, True, 4, data1) - + genIFRwDataCode(0, 0x078, True, 4, [0xff, 0xff, 0xff, 0xff]) - + genIFRwDataCode(1, 0x078, True, 4, [0xff, 0xff, 0xff, 0xff]) - + genIFRwDataCode(2, 0x078, True, 4, [0xff, 0xff, 0xff, 0xff]) - + genIFRwDataCode(3, 0x078, True, 4, [0xff, 0xff, 0xff, 0xff]) - + genIFRwDataCode(4, 0x078, True, 4, [0xff, 0xff, 0xff, 0xff]) - + genIFRwDataCode(1, 0x400, True, 4, [0xff, 0xff, 0xff, 0xff]) - + genIFRwDataCode(0, 0x074, False, 0x04) - + genIFRwDataCode(1, 0x074, False, 0x04) - + genIFRwDataCode(2, 0x074, False, 0x04) - + genIFRwDataCode(3, 0x074, False, 0x04) - + genIFRwDataCode(4, 0x074, False, 0x04) - + genIFRwDataCode(1, 0x400, False, 0x04) - ) - #genPkt.addBeforeExc( genIFRwDataCode(1, 0x078, True, 4, [0xff, 0xff, 0xff, 0xff])) - - data = [0,] * 2 - data[0] = 0x10 - data[1] = 0x00 - genPkt.addSubPkt(0x0, 0, 0x302 + slave_sm_id * 4, 0xe, 2, data) - - data = list(range(0x10)) - - #subPkt参数:索引、索引类型、地址、命令、长度、数据 - sm_addr = slave_sm_id * 0x1000 + 0x800 - genPkt.addSubPkt(1, 0, sm_addr, 0x1, 0x10, data) - - sm_idx = 0 - - genPkt.addAfterExc(genWriteTransLenCode(gen_file_def, sm_idx) - +genWriteTransPktCode(gen_file_def, sm_idx) - +genTrgTransPktCode(gen_file_def, sm_idx) - +genReadAckPktCode(gen_file_def, sm_idx) - +genMessageCode("--检查中断寄存器") - +genIFRwDataCode(0, 0x074, False, 0x04) - +genIFRwDataCode(1, 0x074, False, 0x04) - +genIFRwDataCode(2, 0x074, False, 0x04) - +genIFRwDataCode(3, 0x074, False, 0x04) - +genIFRwDataCode(4, 0x074, False, 0x04) - +genMessageCode("--读缓冲区") - +genIFRwDataCode(1, 0x800 + slave_sm_id * 0x1000, False, 8) - - +genMessageCode("--延时后检查看门狗寄存器") - +"#2000000\n" - +genIFRwDataCode(1, 0x400, False, 0x04) - +genIFRwDataCode(1, 0x400, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(1, 0x400, False, 0x04) - +genMessageCode("--复位数据缓冲区") - +genIFRwDataCode(1, 0x300 + slave_sm_id * 4, True, 1, [0, ]) - +genMessageCode("--延时后检查看门狗寄存器") - +"#2000000\n" - +genIFRwDataCode(1, 0x400, False, 0x04) - +genIFRwDataCode(1, 0x074, False, 0x04) - +genTcEndFrameCode(gen_file_def)) - - genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1) - - return gen_file_def - - -def watchdog_test_sm_rd_no_timeout(tc_id, wd_id): - genPkt = GenPkt() - - gen_file_def = "watchdog_tc%02d"%(tc_id, ) - sm_idx = 0 - - slave_sm_id = int((wd_id - 1) / 2) - tc_des = (f"使能看门狗{wd_id},监视SM{slave_sm_id},写数据到SM中,只读一半,看Watchdog是否超时。\\n" - "清除中断后,错误消失,出问题的设备恢复正常。" - ) - - #-------------------------------------------------------------------------- - #>>>>>> 测试用例1 看门狗测试 - genPkt.clean() - genPkt.setPktType(0) - - data = 1 << wd_id ##使能看门狗 - data0 = [data&0xff, (data>>8)&0xff, (data>>16)&0xff, (data>>24)&0xff] - - data = 0x002000 ##看门狗的超时值 - data1 = [data&0xff, (data>>8)&0xff, (data>>16)&0xff, (data>>24)&0xff] - - genPkt.addBeforeExc(genTcStartFrameCode(gen_file_def, tc_des) - + genIFRwDataCode(1, 0x404, True, 4, data0) - + genIFRwDataCode(1, 0x40C + (wd_id - 1) * 4, True, 4, data1) - + genIFRwDataCode(0, 0x078, True, 4, [0xff, 0xff, 0xff, 0xff]) - + genIFRwDataCode(1, 0x078, True, 4, [0xff, 0xff, 0xff, 0xff]) - + genIFRwDataCode(2, 0x078, True, 4, [0xff, 0xff, 0xff, 0xff]) - + genIFRwDataCode(3, 0x078, True, 4, [0xff, 0xff, 0xff, 0xff]) - + genIFRwDataCode(4, 0x078, True, 4, [0xff, 0xff, 0xff, 0xff]) - + genIFRwDataCode(1, 0x400, True, 4, [0xff, 0xff, 0xff, 0xff]) - + genIFRwDataCode(0, 0x074, False, 0x04) - + genIFRwDataCode(1, 0x074, False, 0x04) - + genIFRwDataCode(2, 0x074, False, 0x04) - + genIFRwDataCode(3, 0x074, False, 0x04) - + genIFRwDataCode(4, 0x074, False, 0x04) - + genIFRwDataCode(1, 0x400, False, 0x04) - ) - #genPkt.addBeforeExc( genIFRwDataCode(1, 0x078, True, 4, [0xff, 0xff, 0xff, 0xff])) - - data = [0,] * 2 - data[0] = 0x10 - data[1] = 0x00 - genPkt.addSubPkt(0x0, 0, 0x302 + slave_sm_id * 4, 0xe, 2, data) - - data = list(range(0x10)) - - #subPkt参数:索引、索引类型、地址、命令、长度、数据 - sm_addr = slave_sm_id * 0x1000 + 0x800 - genPkt.addSubPkt(1, 0, sm_addr, 0x1, 0x10, data) - - sm_idx = 0 - - genPkt.addAfterExc(genWriteTransLenCode(gen_file_def, sm_idx) - +genWriteTransPktCode(gen_file_def, sm_idx) - +genTrgTransPktCode(gen_file_def, sm_idx) - +genReadAckPktCode(gen_file_def, sm_idx) - +genMessageCode("--检查中断寄存器") - +genIFRwDataCode(0, 0x074, False, 0x04) - +genIFRwDataCode(1, 0x074, False, 0x04) - +genIFRwDataCode(2, 0x074, False, 0x04) - +genIFRwDataCode(3, 0x074, False, 0x04) - +genIFRwDataCode(4, 0x074, False, 0x04) - +genMessageCode("--读缓冲区") - +genIFRwDataCode(1, 0x800 + slave_sm_id * 0x1000, False, 0x10) - - +genMessageCode("--延时后检查看门狗寄存器") - +"#2000000\n" - +genIFRwDataCode(1, 0x400, False, 0x04) - +genIFRwDataCode(1, 0x400, True, 4, [0xff, 0xff, 0xff, 0xff]) - +genIFRwDataCode(1, 0x400, False, 0x04) - +genMessageCode("--复位数据缓冲区") - +genIFRwDataCode(1, 0x300 + slave_sm_id * 4, True, 1, [0, ]) - +genMessageCode("--延时后检查看门狗寄存器") - +"#2000000\n" - +genIFRwDataCode(1, 0x400, False, 0x04) - +genIFRwDataCode(1, 0x074, False, 0x04) - +genTcEndFrameCode(gen_file_def)) - - genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1) - - return gen_file_def - -def tc1(): - return watchdog_test_sm_wr_timeout(1, 1) - - -def tc2(): - return watchdog_test_sm_rd_timeout(2, 2) - -def tc3(): - return watchdog_test_sm_wr_no_timeout(3, 1) - -def tc4(): +from pyutils import * + + + +''' +看门狗0超时逻辑: +1. 看门狗0从系统发送下行包时,触发工作; +2. 系统上行时,停止看门狗工作并复位看门狗计数器;若发生超时,报超时状态,复位继续工作,此时有上行包,不予响应; +3. 看门狗不使能,则对应的看门狗停止工作,也不会报相关的状态位与中断; +4. 写对应的看门狗状态寄存器,对应看门狗被复位;需要重新触发才能工作。 + + +SM0/2/4/6与SM1/3/5/7超时逻辑: +1. 看门狗从读写第一个字节被触发计时工作;第二次读写第一个字节,不影响看门狗工作; +2. 读写最后一个字节,停止看门狗工作并复位看门狗计数器;若发生超时,报超时状态,复位继续工作,此时系统读到最后一个字节,不予响应。 +3. 看门狗不使能,则对应的看门狗停止工作,也不会报相关的状态位与中断; +4. 写对应的看门狗状态寄存器,对应看门狗被复位;需要重新触发才能工作。 + +看门狗17超时逻辑: +1. 看门狗17从系统发送第一个下行包时,触发工作; +2. 系统发送第二个下行包时,停止看门狗工作并复位看门狗计数器;若发生超时,报超时状态,复位继续工作; +3. 看门狗不使能,则对应的看门狗停止工作,也不会报相关的状态位与中断; +4. 写对应的看门狗状态寄存器,对应看门狗被复位;需要重新触发才能工作。 + + +复位继续工作,指看门狗需要重新被触发开始计数直至超时或者复位。写看门狗状态,无论超时没超时,对应bit为1,则对应看门狗被复位。 +''' + +def watchdog_test_sm_wr_timeout(tc_id, wd_id): + genPkt = GenPkt() + + gen_file_def = "watchdog_tc%02d"%(tc_id, ) + sm_idx = 0 + + slave_sm_id = int((wd_id - 1) / 2) + tc_des = (f"使能看门狗{wd_id},监视SM{slave_sm_id},写数据到SM中,只写一半,看Watchdog是否超时。\\n" + "清除中断后,错误消失,出问题的设备恢复正常。" + ) + + #-------------------------------------------------------------------------- + #>>>>>> 测试用例1 看门狗测试 + genPkt.clean() + genPkt.setPktType(0) + + data = 1 << wd_id ##使能看门狗 + data0 = [data&0xff, (data>>8)&0xff, (data>>16)&0xff, (data>>24)&0xff] + + data = 0x002000 ##看门狗的超时值 + data1 = [data&0xff, (data>>8)&0xff, (data>>16)&0xff, (data>>24)&0xff] + + data = 0xffffffff ##清除中断 + data2 = [data&0xff, (data>>8)&0xff, (data>>16)&0xff, (data>>24)&0xff] + + genPkt.addBeforeExc(genTcStartFrameCode(gen_file_def, tc_des) + + genIFRwDataCode(0, 0x078, True, 4, [0xff, 0xff, 0xff, 0xff]) + + genIFRwDataCode(1, 0x404, True, 4, data0) + + genIFRwDataCode(1, 0x40C + (wd_id - 1) * 4, True, 4, data1) + + genIFRwDataCode(1, 0x078, True, 4, data2) + + genIFRwDataCode(2, 0x078, True, 4, data2) + + genIFRwDataCode(3, 0x078, True, 4, data2) + + genIFRwDataCode(4, 0x078, True, 4, data2) + + genIFRwDataCode(1, 0x400, True, 4, [0xff, 0xff, 0xff, 0xff]) + + genIFRwDataCode(0, 0x074, False, 0x04) + + genIFRwDataCode(1, 0x074, False, 0x04) + + genIFRwDataCode(2, 0x074, False, 0x04) + + genIFRwDataCode(3, 0x074, False, 0x04) + + genIFRwDataCode(4, 0x074, False, 0x04) + + genIFRwDataCode(1, 0x400, False, 0x04)) + #genPkt.addBeforeExc( genIFRwDataCode(1, 0x078, True, 4, [0xff, 0xff, 0xff, 0xff])) + + data = [0,] * 2 + data[0] = 0x80 + data[1] = 0x00 + genPkt.addSubPkt(0x0, 0, 0x302 + slave_sm_id * 4, 0xe, 2, data) + + data = [0,] * 0x50 + + #subPkt参数:索引、索引类型、地址、命令、长度、数据 + sm_addr = slave_sm_id * 0x1000 + 0x800 + genPkt.addSubPkt(1, 0, sm_addr, 0x1, 0x50, data) + + sm_idx = 0 + + genPkt.addAfterExc(genWriteTransLenCode(gen_file_def, sm_idx) + +genWriteTransPktCode(gen_file_def, sm_idx) + +genTrgTransPktCode(gen_file_def, sm_idx) + +genReadAckPktCode(gen_file_def, sm_idx) + +genMessageCode("--检查中断寄存器") + +genIFRwDataCode(0, 0x074, False, 0x04) + +genIFRwDataCode(1, 0x074, False, 0x04) + +genIFRwDataCode(2, 0x074, False, 0x04) + +genIFRwDataCode(3, 0x074, False, 0x04) + +genIFRwDataCode(4, 0x074, False, 0x04) + +genMessageCode("--延时后检查看门狗寄存器") + +"#700000\n" + +genIFRwDataCode(1, 0x400, False, 0x04) + +genIFRwDataCode(1, 0x400, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(1, 0x400, False, 0x04) + +genMessageCode("--复位数据缓冲区") + +genIFRwDataCode(1, 0x300 + slave_sm_id * 4, True, 1, [0, ]) + +genMessageCode("--延时后检查看门狗寄存器") + +"#1200000\n" + +genIFRwDataCode(1, 0x400, False, 0x04) + +genTcEndFrameCode(gen_file_def)) + + genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1) + + return gen_file_def + +def watchdog_test_sm_wr_no_timeout(tc_id, wd_id): + genPkt = GenPkt() + + gen_file_def = "watchdog_tc%02d"%(tc_id, ) + sm_idx = 0 + + slave_sm_id = int((wd_id - 1) / 2) + tc_des = (f"使能看门狗{wd_id},监视SM{slave_sm_id},写数据到SM中,只写一半,看Watchdog是否超时。\\n" + "清除中断后,错误消失,出问题的设备恢复正常。" + ) + + #-------------------------------------------------------------------------- + #>>>>>> 测试用例1 看门狗测试 + genPkt.clean() + genPkt.setPktType(0) + + data = 1 << wd_id ##使能看门狗 + data0 = [data&0xff, (data>>8)&0xff, (data>>16)&0xff, (data>>24)&0xff] + + data = 0x002000 ##看门狗的超时值 + data1 = [data&0xff, (data>>8)&0xff, (data>>16)&0xff, (data>>24)&0xff] + + data = 0xffffffff ##清除中断 + data2 = [data&0xff, (data>>8)&0xff, (data>>16)&0xff, (data>>24)&0xff] + + genPkt.addBeforeExc(genTcStartFrameCode(gen_file_def, tc_des) + + genIFRwDataCode(0, 0x078, True, 4, [0xff, 0xff, 0xff, 0xff]) + + genIFRwDataCode(1, 0x404, True, 4, data0) + + genIFRwDataCode(1, 0x40C + (wd_id - 1) * 4, True, 4, data1) + + genIFRwDataCode(1, 0x078, True, 4, data2) + + genIFRwDataCode(2, 0x078, True, 4, data2) + + genIFRwDataCode(3, 0x078, True, 4, data2) + + genIFRwDataCode(4, 0x078, True, 4, data2) + + genIFRwDataCode(1, 0x400, True, 4, [0xff, 0xff, 0xff, 0xff]) + + genIFRwDataCode(0, 0x074, False, 0x04) + + genIFRwDataCode(1, 0x074, False, 0x04) + + genIFRwDataCode(2, 0x074, False, 0x04) + + genIFRwDataCode(3, 0x074, False, 0x04) + + genIFRwDataCode(4, 0x074, False, 0x04) + + genIFRwDataCode(1, 0x400, False, 0x04)) + #genPkt.addBeforeExc( genIFRwDataCode(1, 0x078, True, 4, [0xff, 0xff, 0xff, 0xff])) + + data = [0,] * 2 + data[0] = 0x80 + data[1] = 0x00 + genPkt.addSubPkt(0x0, 0, 0x302 + slave_sm_id * 4, 0xe, 2, data) + + data = [0,] * 0x80 + + #subPkt参数:索引、索引类型、地址、命令、长度、数据 + sm_addr = slave_sm_id * 0x1000 + 0x800 + genPkt.addSubPkt(1, 0, sm_addr, 0x1, 0x80, data) + + sm_idx = 0 + + genPkt.addAfterExc(genWriteTransLenCode(gen_file_def, sm_idx) + +genWriteTransPktCode(gen_file_def, sm_idx) + +genTrgTransPktCode(gen_file_def, sm_idx) + +genReadAckPktCode(gen_file_def, sm_idx) + +genMessageCode("--检查中断寄存器") + +genIFRwDataCode(0, 0x074, False, 0x04) + +genIFRwDataCode(1, 0x074, False, 0x04) + +genIFRwDataCode(2, 0x074, False, 0x04) + +genIFRwDataCode(3, 0x074, False, 0x04) + +genIFRwDataCode(4, 0x074, False, 0x04) + +genMessageCode("--延时后检查看门狗寄存器") + +"#700000\n" + +genIFRwDataCode(1, 0x400, False, 0x04) + +genIFRwDataCode(1, 0x400, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(1, 0x400, False, 0x04) + +genMessageCode("--复位数据缓冲区") + +genIFRwDataCode(1, 0x300 + slave_sm_id * 4, True, 1, [0, ]) + +genMessageCode("--延时后检查看门狗寄存器") + +"#1200000\n" + +genIFRwDataCode(1, 0x400, False, 0x04) + +genTcEndFrameCode(gen_file_def)) + + genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1) + + return gen_file_def + + +def watchdog_test_sm_rd_timeout(tc_id, wd_id): + genPkt = GenPkt() + + gen_file_def = "watchdog_tc%02d"%(tc_id, ) + sm_idx = 0 + + slave_sm_id = int((wd_id - 1) / 2) + tc_des = (f"使能看门狗{wd_id},监视SM{slave_sm_id},写数据到SM中,只读一半,看Watchdog是否超时。\\n" + "清除中断后,错误消失,出问题的设备恢复正常。" + ) + + #-------------------------------------------------------------------------- + #>>>>>> 测试用例1 看门狗测试 + genPkt.clean() + genPkt.setPktType(0) + + data = 1 << wd_id ##使能看门狗 + data0 = [data&0xff, (data>>8)&0xff, (data>>16)&0xff, (data>>24)&0xff] + + data = 0x002000 ##看门狗的超时值 + data1 = [data&0xff, (data>>8)&0xff, (data>>16)&0xff, (data>>24)&0xff] + + genPkt.addBeforeExc(genTcStartFrameCode(gen_file_def, tc_des) + + genIFRwDataCode(1, 0x404, True, 4, data0) + + genIFRwDataCode(1, 0x40C + (wd_id - 1) * 4, True, 4, data1) + + genIFRwDataCode(0, 0x078, True, 4, [0xff, 0xff, 0xff, 0xff]) + + genIFRwDataCode(1, 0x078, True, 4, [0xff, 0xff, 0xff, 0xff]) + + genIFRwDataCode(2, 0x078, True, 4, [0xff, 0xff, 0xff, 0xff]) + + genIFRwDataCode(3, 0x078, True, 4, [0xff, 0xff, 0xff, 0xff]) + + genIFRwDataCode(4, 0x078, True, 4, [0xff, 0xff, 0xff, 0xff]) + + genIFRwDataCode(1, 0x400, True, 4, [0xff, 0xff, 0xff, 0xff]) + + genIFRwDataCode(0, 0x074, False, 0x04) + + genIFRwDataCode(1, 0x074, False, 0x04) + + genIFRwDataCode(2, 0x074, False, 0x04) + + genIFRwDataCode(3, 0x074, False, 0x04) + + genIFRwDataCode(4, 0x074, False, 0x04) + + genIFRwDataCode(1, 0x400, False, 0x04) + ) + #genPkt.addBeforeExc( genIFRwDataCode(1, 0x078, True, 4, [0xff, 0xff, 0xff, 0xff])) + + data = [0,] * 2 + data[0] = 0x10 + data[1] = 0x00 + genPkt.addSubPkt(0x0, 0, 0x302 + slave_sm_id * 4, 0xe, 2, data) + + data = list(range(0x10)) + + #subPkt参数:索引、索引类型、地址、命令、长度、数据 + sm_addr = slave_sm_id * 0x1000 + 0x800 + genPkt.addSubPkt(1, 0, sm_addr, 0x1, 0x10, data) + + sm_idx = 0 + + genPkt.addAfterExc(genWriteTransLenCode(gen_file_def, sm_idx) + +genWriteTransPktCode(gen_file_def, sm_idx) + +genTrgTransPktCode(gen_file_def, sm_idx) + +genReadAckPktCode(gen_file_def, sm_idx) + +genMessageCode("--检查中断寄存器") + +genIFRwDataCode(0, 0x074, False, 0x04) + +genIFRwDataCode(1, 0x074, False, 0x04) + +genIFRwDataCode(2, 0x074, False, 0x04) + +genIFRwDataCode(3, 0x074, False, 0x04) + +genIFRwDataCode(4, 0x074, False, 0x04) + +genMessageCode("--读缓冲区") + +genIFRwDataCode(1, 0x800 + slave_sm_id * 0x1000, False, 8) + + +genMessageCode("--延时后检查看门狗寄存器") + +"#2000000\n" + +genIFRwDataCode(1, 0x400, False, 0x04) + +genIFRwDataCode(1, 0x400, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(1, 0x400, False, 0x04) + +genMessageCode("--复位数据缓冲区") + +genIFRwDataCode(1, 0x300 + slave_sm_id * 4, True, 1, [0, ]) + +genMessageCode("--延时后检查看门狗寄存器") + +"#2000000\n" + +genIFRwDataCode(1, 0x400, False, 0x04) + +genIFRwDataCode(1, 0x074, False, 0x04) + +genTcEndFrameCode(gen_file_def)) + + genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1) + + return gen_file_def + + +def watchdog_test_sm_rd_no_timeout(tc_id, wd_id): + genPkt = GenPkt() + + gen_file_def = "watchdog_tc%02d"%(tc_id, ) + sm_idx = 0 + + slave_sm_id = int((wd_id - 1) / 2) + tc_des = (f"使能看门狗{wd_id},监视SM{slave_sm_id},写数据到SM中,只读一半,看Watchdog是否超时。\\n" + "清除中断后,错误消失,出问题的设备恢复正常。" + ) + + #-------------------------------------------------------------------------- + #>>>>>> 测试用例1 看门狗测试 + genPkt.clean() + genPkt.setPktType(0) + + data = 1 << wd_id ##使能看门狗 + data0 = [data&0xff, (data>>8)&0xff, (data>>16)&0xff, (data>>24)&0xff] + + data = 0x002000 ##看门狗的超时值 + data1 = [data&0xff, (data>>8)&0xff, (data>>16)&0xff, (data>>24)&0xff] + + genPkt.addBeforeExc(genTcStartFrameCode(gen_file_def, tc_des) + + genIFRwDataCode(1, 0x404, True, 4, data0) + + genIFRwDataCode(1, 0x40C + (wd_id - 1) * 4, True, 4, data1) + + genIFRwDataCode(0, 0x078, True, 4, [0xff, 0xff, 0xff, 0xff]) + + genIFRwDataCode(1, 0x078, True, 4, [0xff, 0xff, 0xff, 0xff]) + + genIFRwDataCode(2, 0x078, True, 4, [0xff, 0xff, 0xff, 0xff]) + + genIFRwDataCode(3, 0x078, True, 4, [0xff, 0xff, 0xff, 0xff]) + + genIFRwDataCode(4, 0x078, True, 4, [0xff, 0xff, 0xff, 0xff]) + + genIFRwDataCode(1, 0x400, True, 4, [0xff, 0xff, 0xff, 0xff]) + + genIFRwDataCode(0, 0x074, False, 0x04) + + genIFRwDataCode(1, 0x074, False, 0x04) + + genIFRwDataCode(2, 0x074, False, 0x04) + + genIFRwDataCode(3, 0x074, False, 0x04) + + genIFRwDataCode(4, 0x074, False, 0x04) + + genIFRwDataCode(1, 0x400, False, 0x04) + ) + #genPkt.addBeforeExc( genIFRwDataCode(1, 0x078, True, 4, [0xff, 0xff, 0xff, 0xff])) + + data = [0,] * 2 + data[0] = 0x10 + data[1] = 0x00 + genPkt.addSubPkt(0x0, 0, 0x302 + slave_sm_id * 4, 0xe, 2, data) + + data = list(range(0x10)) + + #subPkt参数:索引、索引类型、地址、命令、长度、数据 + sm_addr = slave_sm_id * 0x1000 + 0x800 + genPkt.addSubPkt(1, 0, sm_addr, 0x1, 0x10, data) + + sm_idx = 0 + + genPkt.addAfterExc(genWriteTransLenCode(gen_file_def, sm_idx) + +genWriteTransPktCode(gen_file_def, sm_idx) + +genTrgTransPktCode(gen_file_def, sm_idx) + +genReadAckPktCode(gen_file_def, sm_idx) + +genMessageCode("--检查中断寄存器") + +genIFRwDataCode(0, 0x074, False, 0x04) + +genIFRwDataCode(1, 0x074, False, 0x04) + +genIFRwDataCode(2, 0x074, False, 0x04) + +genIFRwDataCode(3, 0x074, False, 0x04) + +genIFRwDataCode(4, 0x074, False, 0x04) + +genMessageCode("--读缓冲区") + +genIFRwDataCode(1, 0x800 + slave_sm_id * 0x1000, False, 0x10) + + +genMessageCode("--延时后检查看门狗寄存器") + +"#2000000\n" + +genIFRwDataCode(1, 0x400, False, 0x04) + +genIFRwDataCode(1, 0x400, True, 4, [0xff, 0xff, 0xff, 0xff]) + +genIFRwDataCode(1, 0x400, False, 0x04) + +genMessageCode("--复位数据缓冲区") + +genIFRwDataCode(1, 0x300 + slave_sm_id * 4, True, 1, [0, ]) + +genMessageCode("--延时后检查看门狗寄存器") + +"#2000000\n" + +genIFRwDataCode(1, 0x400, False, 0x04) + +genIFRwDataCode(1, 0x074, False, 0x04) + +genTcEndFrameCode(gen_file_def)) + + genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1) + + return gen_file_def + +def tc1(): + return watchdog_test_sm_wr_timeout(1, 1) + + +def tc2(): + return watchdog_test_sm_rd_timeout(2, 2) + +def tc3(): + return watchdog_test_sm_wr_no_timeout(3, 1) + +def tc4(): return watchdog_test_sm_rd_no_timeout(4, 2) \ No newline at end of file diff --git a/tb/shinTest/testcase_result/regtest_tc01_result.log b/tb/shinTest/testcase_result/regtest_tc01_result.log index 84d263a..0ff03b1 100644 --- a/tb/shinTest/testcase_result/regtest_tc01_result.log +++ b/tb/shinTest/testcase_result/regtest_tc01_result.log @@ -1,100 +1,100 @@ -16'h004c 8'h00 16'h0002 8'h00 8'h59 -16'h004c 8'h80 16'h0002 8'h00 8'h00 -16'h004c 8'h00 16'h0002 8'h00 8'h59 -16'h004c 8'h80 16'h0002 8'h00 8'h00 -16'h004c 8'h00 16'h0002 8'h00 8'h59 -16'h004c 8'h80 16'h0002 8'h00 8'h00 -16'h004c 8'h00 16'h0002 8'h00 8'h59 -16'h004c 8'h80 16'h0002 8'h00 8'h00 -16'h004c 8'h00 16'h0002 8'h00 8'h59 -16'h004c 8'h80 16'h0002 8'h00 8'h00 -16'h004c 8'h00 16'h0001 8'h01 -16'h004c 8'h80 16'h0002 8'h00 8'h00 -16'h004c 8'h00 16'h0001 8'h01 -16'h004c 8'h80 16'h0002 8'h00 8'h00 -16'h004c 8'h00 16'h0001 8'h01 -16'h004c 8'h80 16'h0002 8'h00 8'h00 -16'h004c 8'h00 16'h0001 8'h01 -16'h004c 8'h80 16'h0002 8'h00 8'h00 -16'h004c 8'h00 16'h0001 8'h01 -16'h004c 8'h80 16'h0002 8'h00 8'h00 -16'h004c 8'h00 16'h0002 8'h00 8'h32 -16'h004c 8'h80 16'h0002 8'h00 8'h00 -16'h004c 8'h00 16'h0002 8'h00 8'h32 -16'h004c 8'h80 16'h0002 8'h00 8'h00 -16'h004c 8'h00 16'h0002 8'h00 8'h32 -16'h004c 8'h80 16'h0002 8'h00 8'h00 -16'h004c 8'h00 16'h0002 8'h00 8'h32 -16'h004c 8'h80 16'h0002 8'h00 8'h00 -16'h004c 8'h00 16'h0002 8'h00 8'h32 -16'h004c 8'h80 16'h0002 8'h00 8'h00 -16'h004c 8'h00 16'h0002 8'h01 8'h43 -16'h004c 8'h80 16'h0002 8'h00 8'h00 -16'h004c 8'h00 16'h0002 8'h01 8'h43 -16'h004c 8'h80 16'h0002 8'h00 8'h00 -16'h004c 8'h00 16'h0002 8'h01 8'h43 -16'h004c 8'h80 16'h0002 8'h00 8'h00 -16'h004c 8'h00 16'h0002 8'h01 8'h43 -16'h004c 8'h80 16'h0002 8'h00 8'h00 -16'h004c 8'h00 16'h0002 8'h01 8'h43 -16'h004c 8'h80 16'h0002 8'h00 8'h00 -16'h004c 8'h00 16'h0002 8'h01 8'h59 -16'h004c 8'h80 16'h0002 8'h01 8'h00 -16'h004c 8'h00 16'h0002 8'h01 8'h59 -16'h004c 8'h80 16'h0002 8'h01 8'h00 -16'h004c 8'h00 16'h0002 8'h01 8'h59 -16'h004c 8'h80 16'h0002 8'h01 8'h00 -16'h004c 8'h00 16'h0002 8'h01 8'h59 -16'h004c 8'h80 16'h0002 8'h01 8'h00 -16'h004c 8'h00 16'h0002 8'h01 8'h59 -16'h004c 8'h80 16'h0002 8'h01 8'h00 -16'h004c 8'h00 16'h0001 8'h00 -16'h004c 8'h80 16'h0002 8'h01 8'h00 -16'h004c 8'h00 16'h0001 8'h00 -16'h004c 8'h80 16'h0002 8'h01 8'h00 -16'h004c 8'h00 16'h0001 8'h00 -16'h004c 8'h80 16'h0002 8'h01 8'h00 -16'h004c 8'h00 16'h0001 8'h00 -16'h004c 8'h80 16'h0002 8'h01 8'h00 -16'h004c 8'h00 16'h0001 8'h00 -16'h004c 8'h80 16'h0002 8'h01 8'h00 -16'h004c 8'h00 16'h0002 8'h00 8'h32 -16'h004c 8'h80 16'h0002 8'h01 8'h00 -16'h004c 8'h00 16'h0002 8'h00 8'h32 -16'h004c 8'h80 16'h0002 8'h01 8'h00 -16'h004c 8'h00 16'h0002 8'h00 8'h32 -16'h004c 8'h80 16'h0002 8'h01 8'h00 -16'h004c 8'h00 16'h0002 8'h00 8'h32 -16'h004c 8'h80 16'h0002 8'h01 8'h00 -16'h004c 8'h00 16'h0002 8'h00 8'h32 -16'h004c 8'h80 16'h0002 8'h01 8'h00 -16'h004c 8'h00 16'h0002 8'h01 8'h43 -16'h004c 8'h80 16'h0002 8'h01 8'h00 -16'h004c 8'h00 16'h0002 8'h01 8'h43 -16'h004c 8'h80 16'h0002 8'h01 8'h00 -16'h004c 8'h00 16'h0002 8'h01 8'h43 -16'h004c 8'h80 16'h0002 8'h01 8'h00 -16'h004c 8'h00 16'h0002 8'h01 8'h43 -16'h004c 8'h80 16'h0002 8'h01 8'h00 -16'h004c 8'h00 16'h0002 8'h01 8'h43 -16'h004c 8'h80 16'h0002 8'h01 8'h00 -16'h004c 8'h00 16'h0002 8'h30 8'h59 -16'h004c 8'h80 16'h0002 8'h00 8'h00 -16'h004c 8'h00 16'h0002 8'h30 8'h59 -16'h004c 8'h80 16'h0002 8'h00 8'h00 -16'h004c 8'h00 16'h0002 8'h30 8'h59 -16'h004c 8'h80 16'h0002 8'h00 8'h00 -16'h004c 8'h00 16'h0002 8'h30 8'h59 -16'h004c 8'h80 16'h0002 8'h00 8'h00 -16'h004c 8'h00 16'h0002 8'h30 8'h59 -16'h004c 8'h80 16'h0002 8'h00 8'h00 -16'h004c 8'h00 16'h0002 8'h23 8'h59 -16'h004c 8'h80 16'h0002 8'h01 8'h00 -16'h004c 8'h00 16'h0002 8'h23 8'h59 -16'h004c 8'h80 16'h0002 8'h01 8'h00 -16'h004c 8'h00 16'h0002 8'h23 8'h59 -16'h004c 8'h80 16'h0002 8'h01 8'h00 -16'h004c 8'h00 16'h0002 8'h23 8'h59 -16'h004c 8'h80 16'h0002 8'h01 8'h00 -16'h004c 8'h00 16'h0002 8'h23 8'h59 -16'h004c 8'h80 16'h0002 8'h01 8'h00 +16'h004c 8'h00 16'h0002 8'h00 8'h59 +16'h004c 8'h80 16'h0002 8'h00 8'h00 +16'h004c 8'h00 16'h0002 8'h00 8'h59 +16'h004c 8'h80 16'h0002 8'h00 8'h00 +16'h004c 8'h00 16'h0002 8'h00 8'h59 +16'h004c 8'h80 16'h0002 8'h00 8'h00 +16'h004c 8'h00 16'h0002 8'h00 8'h59 +16'h004c 8'h80 16'h0002 8'h00 8'h00 +16'h004c 8'h00 16'h0002 8'h00 8'h59 +16'h004c 8'h80 16'h0002 8'h00 8'h00 +16'h004c 8'h00 16'h0001 8'h01 +16'h004c 8'h80 16'h0002 8'h00 8'h00 +16'h004c 8'h00 16'h0001 8'h01 +16'h004c 8'h80 16'h0002 8'h00 8'h00 +16'h004c 8'h00 16'h0001 8'h01 +16'h004c 8'h80 16'h0002 8'h00 8'h00 +16'h004c 8'h00 16'h0001 8'h01 +16'h004c 8'h80 16'h0002 8'h00 8'h00 +16'h004c 8'h00 16'h0001 8'h01 +16'h004c 8'h80 16'h0002 8'h00 8'h00 +16'h004c 8'h00 16'h0002 8'h00 8'h32 +16'h004c 8'h80 16'h0002 8'h00 8'h00 +16'h004c 8'h00 16'h0002 8'h00 8'h32 +16'h004c 8'h80 16'h0002 8'h00 8'h00 +16'h004c 8'h00 16'h0002 8'h00 8'h32 +16'h004c 8'h80 16'h0002 8'h00 8'h00 +16'h004c 8'h00 16'h0002 8'h00 8'h32 +16'h004c 8'h80 16'h0002 8'h00 8'h00 +16'h004c 8'h00 16'h0002 8'h00 8'h32 +16'h004c 8'h80 16'h0002 8'h00 8'h00 +16'h004c 8'h00 16'h0002 8'h01 8'h43 +16'h004c 8'h80 16'h0002 8'h00 8'h00 +16'h004c 8'h00 16'h0002 8'h01 8'h43 +16'h004c 8'h80 16'h0002 8'h00 8'h00 +16'h004c 8'h00 16'h0002 8'h01 8'h43 +16'h004c 8'h80 16'h0002 8'h00 8'h00 +16'h004c 8'h00 16'h0002 8'h01 8'h43 +16'h004c 8'h80 16'h0002 8'h00 8'h00 +16'h004c 8'h00 16'h0002 8'h01 8'h43 +16'h004c 8'h80 16'h0002 8'h00 8'h00 +16'h004c 8'h00 16'h0002 8'h01 8'h59 +16'h004c 8'h80 16'h0002 8'h01 8'h00 +16'h004c 8'h00 16'h0002 8'h01 8'h59 +16'h004c 8'h80 16'h0002 8'h01 8'h00 +16'h004c 8'h00 16'h0002 8'h01 8'h59 +16'h004c 8'h80 16'h0002 8'h01 8'h00 +16'h004c 8'h00 16'h0002 8'h01 8'h59 +16'h004c 8'h80 16'h0002 8'h01 8'h00 +16'h004c 8'h00 16'h0002 8'h01 8'h59 +16'h004c 8'h80 16'h0002 8'h01 8'h00 +16'h004c 8'h00 16'h0001 8'h00 +16'h004c 8'h80 16'h0002 8'h01 8'h00 +16'h004c 8'h00 16'h0001 8'h00 +16'h004c 8'h80 16'h0002 8'h01 8'h00 +16'h004c 8'h00 16'h0001 8'h00 +16'h004c 8'h80 16'h0002 8'h01 8'h00 +16'h004c 8'h00 16'h0001 8'h00 +16'h004c 8'h80 16'h0002 8'h01 8'h00 +16'h004c 8'h00 16'h0001 8'h00 +16'h004c 8'h80 16'h0002 8'h01 8'h00 +16'h004c 8'h00 16'h0002 8'h00 8'h32 +16'h004c 8'h80 16'h0002 8'h01 8'h00 +16'h004c 8'h00 16'h0002 8'h00 8'h32 +16'h004c 8'h80 16'h0002 8'h01 8'h00 +16'h004c 8'h00 16'h0002 8'h00 8'h32 +16'h004c 8'h80 16'h0002 8'h01 8'h00 +16'h004c 8'h00 16'h0002 8'h00 8'h32 +16'h004c 8'h80 16'h0002 8'h01 8'h00 +16'h004c 8'h00 16'h0002 8'h00 8'h32 +16'h004c 8'h80 16'h0002 8'h01 8'h00 +16'h004c 8'h00 16'h0002 8'h01 8'h43 +16'h004c 8'h80 16'h0002 8'h01 8'h00 +16'h004c 8'h00 16'h0002 8'h01 8'h43 +16'h004c 8'h80 16'h0002 8'h01 8'h00 +16'h004c 8'h00 16'h0002 8'h01 8'h43 +16'h004c 8'h80 16'h0002 8'h01 8'h00 +16'h004c 8'h00 16'h0002 8'h01 8'h43 +16'h004c 8'h80 16'h0002 8'h01 8'h00 +16'h004c 8'h00 16'h0002 8'h01 8'h43 +16'h004c 8'h80 16'h0002 8'h01 8'h00 +16'h004c 8'h00 16'h0002 8'h30 8'h59 +16'h004c 8'h80 16'h0002 8'h00 8'h00 +16'h004c 8'h00 16'h0002 8'h30 8'h59 +16'h004c 8'h80 16'h0002 8'h00 8'h00 +16'h004c 8'h00 16'h0002 8'h30 8'h59 +16'h004c 8'h80 16'h0002 8'h00 8'h00 +16'h004c 8'h00 16'h0002 8'h30 8'h59 +16'h004c 8'h80 16'h0002 8'h00 8'h00 +16'h004c 8'h00 16'h0002 8'h30 8'h59 +16'h004c 8'h80 16'h0002 8'h00 8'h00 +16'h004c 8'h00 16'h0002 8'h23 8'h59 +16'h004c 8'h80 16'h0002 8'h01 8'h00 +16'h004c 8'h00 16'h0002 8'h23 8'h59 +16'h004c 8'h80 16'h0002 8'h01 8'h00 +16'h004c 8'h00 16'h0002 8'h23 8'h59 +16'h004c 8'h80 16'h0002 8'h01 8'h00 +16'h004c 8'h00 16'h0002 8'h23 8'h59 +16'h004c 8'h80 16'h0002 8'h01 8'h00 +16'h004c 8'h00 16'h0002 8'h23 8'h59 +16'h004c 8'h80 16'h0002 8'h01 8'h00 diff --git a/tb/shinTest/testcase_result/regtest_tc02_result.log b/tb/shinTest/testcase_result/regtest_tc02_result.log index d0ab0b8..00b0e43 100644 --- a/tb/shinTest/testcase_result/regtest_tc02_result.log +++ b/tb/shinTest/testcase_result/regtest_tc02_result.log @@ -1,105 +1,105 @@ -16'h004a 8'h00 16'h0002 8'h00 8'h58 -16'h004a 8'h80 16'h0002 8'h00 8'h00 -16'h004a 8'h00 16'h0002 8'h00 8'h58 -16'h004a 8'h80 16'h0002 8'h00 8'h00 -16'h004a 8'h00 16'h0002 8'h00 8'h58 -16'h004a 8'h80 16'h0002 8'h00 8'h00 -16'h004a 8'h00 16'h0002 8'h00 8'h58 -16'h004a 8'h80 16'h0002 8'h00 8'h00 -16'h004a 8'h00 16'h0002 8'h00 8'h58 -16'h004a 8'h80 16'h0002 8'h00 8'h00 -16'h004a 8'h00 16'h0001 8'h01 -16'h004a 8'h80 16'h0002 8'h00 8'h00 -16'h004a 8'h00 16'h0001 8'h01 -16'h004a 8'h80 16'h0002 8'h00 8'h00 -16'h004a 8'h00 16'h0001 8'h01 -16'h004a 8'h80 16'h0002 8'h00 8'h00 -16'h004a 8'h00 16'h0001 8'h01 -16'h004a 8'h80 16'h0002 8'h00 8'h00 -16'h004a 8'h00 16'h0001 8'h01 -16'h004a 8'h80 16'h0002 8'h00 8'h00 -16'h004a 8'h00 16'h0002 8'h00 8'h32 -16'h004a 8'h80 16'h0002 8'h00 8'h00 -16'h004a 8'h00 16'h0002 8'h00 8'h32 -16'h004a 8'h80 16'h0002 8'h00 8'h00 -16'h004a 8'h00 16'h0002 8'h00 8'h32 -16'h004a 8'h80 16'h0002 8'h00 8'h00 -16'h004a 8'h00 16'h0002 8'h00 8'h32 -16'h004a 8'h80 16'h0002 8'h00 8'h00 -16'h004a 8'h00 16'h0002 8'h00 8'h32 -16'h004a 8'h80 16'h0002 8'h00 8'h00 -16'h004a 8'h00 16'h0002 8'h01 8'h43 -16'h004a 8'h80 16'h0002 8'h00 8'h00 -16'h004a 8'h00 16'h0002 8'h01 8'h43 -16'h004a 8'h80 16'h0002 8'h00 8'h00 -16'h004a 8'h00 16'h0002 8'h01 8'h43 -16'h004a 8'h80 16'h0002 8'h00 8'h00 -16'h004a 8'h00 16'h0002 8'h01 8'h43 -16'h004a 8'h80 16'h0002 8'h00 8'h00 -16'h004a 8'h00 16'h0002 8'h01 8'h43 -16'h004a 8'h80 16'h0002 8'h00 8'h00 -16'h004a 8'h00 16'h0002 8'h01 8'h58 -16'h004a 8'h80 16'h0002 8'h01 8'h00 -16'h004a 8'h00 16'h0002 8'h01 8'h58 -16'h004a 8'h80 16'h0002 8'h01 8'h00 -16'h004a 8'h00 16'h0002 8'h01 8'h58 -16'h004a 8'h80 16'h0002 8'h01 8'h00 -16'h004a 8'h00 16'h0002 8'h01 8'h58 -16'h004a 8'h80 16'h0002 8'h01 8'h00 -16'h004a 8'h00 16'h0002 8'h01 8'h58 -16'h004a 8'h80 16'h0002 8'h01 8'h00 -16'h004a 8'h00 16'h0001 8'h00 -16'h004a 8'h80 16'h0002 8'h01 8'h00 -16'h004a 8'h00 16'h0001 8'h00 -16'h004a 8'h80 16'h0002 8'h01 8'h00 -16'h004a 8'h00 16'h0001 8'h00 -16'h004a 8'h80 16'h0002 8'h01 8'h00 -16'h004a 8'h00 16'h0001 8'h00 -16'h004a 8'h80 16'h0002 8'h01 8'h00 -16'h004a 8'h00 16'h0001 8'h00 -16'h004a 8'h80 16'h0002 8'h01 8'h00 -16'h004a 8'h00 16'h0002 8'h00 8'h32 -16'h004a 8'h80 16'h0002 8'h01 8'h00 -16'h004a 8'h00 16'h0002 8'h00 8'h32 -16'h004a 8'h80 16'h0002 8'h01 8'h00 -16'h004a 8'h00 16'h0002 8'h00 8'h32 -16'h004a 8'h80 16'h0002 8'h01 8'h00 -16'h004a 8'h00 16'h0002 8'h00 8'h32 -16'h004a 8'h80 16'h0002 8'h01 8'h00 -16'h004a 8'h00 16'h0002 8'h00 8'h32 -16'h004a 8'h80 16'h0002 8'h01 8'h00 -16'h004a 8'h00 16'h0002 8'h01 8'h43 -16'h004a 8'h80 16'h0002 8'h01 8'h00 -16'h004a 8'h00 16'h0002 8'h01 8'h43 -16'h004a 8'h80 16'h0002 8'h01 8'h00 -16'h004a 8'h00 16'h0002 8'h01 8'h43 -16'h004a 8'h80 16'h0002 8'h01 8'h00 -16'h004a 8'h00 16'h0002 8'h01 8'h43 -16'h004a 8'h80 16'h0002 8'h01 8'h00 -16'h004a 8'h00 16'h0002 8'h01 8'h43 -16'h004a 8'h80 16'h0002 8'h01 8'h00 -16'h004a 8'h00 16'h0002 8'h30 8'h58 -16'h004a 8'h80 16'h0002 8'h00 8'h00 -16'h004a 8'h00 16'h0002 8'h30 8'h58 -16'h004a 8'h80 16'h0002 8'h00 8'h00 -16'h004a 8'h00 16'h0002 8'h30 8'h58 -16'h004a 8'h80 16'h0002 8'h00 8'h00 -16'h004a 8'h00 16'h0002 8'h30 8'h58 -16'h004a 8'h80 16'h0002 8'h00 8'h00 -16'h004a 8'h00 16'h0002 8'h30 8'h58 -16'h004a 8'h80 16'h0002 8'h00 8'h00 -16'h004a 8'h00 16'h0002 8'h23 8'h58 -16'h004a 8'h80 16'h0002 8'h01 8'h00 -16'h004a 8'h00 16'h0002 8'h23 8'h58 -16'h004a 8'h80 16'h0002 8'h01 8'h00 -16'h004a 8'h00 16'h0002 8'h23 8'h58 -16'h004a 8'h80 16'h0002 8'h01 8'h00 -16'h004a 8'h00 16'h0002 8'h23 8'h58 -16'h004a 8'h80 16'h0002 8'h01 8'h00 -16'h004a 8'h00 16'h0002 8'h23 8'h58 -16'h004a 8'h80 16'h0002 8'h01 8'h00 -16'h004a 8'h00 16'h0002 8'h00 8'h58 -16'h004a 8'h00 16'h0002 8'h00 8'h58 -16'h004a 8'h00 16'h0002 8'h00 8'h58 -16'h004a 8'h00 16'h0002 8'h00 8'h58 -16'h004a 8'h00 16'h0002 8'h00 8'h58 +16'h004a 8'h00 16'h0002 8'h00 8'h58 +16'h004a 8'h80 16'h0002 8'h00 8'h00 +16'h004a 8'h00 16'h0002 8'h00 8'h58 +16'h004a 8'h80 16'h0002 8'h00 8'h00 +16'h004a 8'h00 16'h0002 8'h00 8'h58 +16'h004a 8'h80 16'h0002 8'h00 8'h00 +16'h004a 8'h00 16'h0002 8'h00 8'h58 +16'h004a 8'h80 16'h0002 8'h00 8'h00 +16'h004a 8'h00 16'h0002 8'h00 8'h58 +16'h004a 8'h80 16'h0002 8'h00 8'h00 +16'h004a 8'h00 16'h0001 8'h01 +16'h004a 8'h80 16'h0002 8'h00 8'h00 +16'h004a 8'h00 16'h0001 8'h01 +16'h004a 8'h80 16'h0002 8'h00 8'h00 +16'h004a 8'h00 16'h0001 8'h01 +16'h004a 8'h80 16'h0002 8'h00 8'h00 +16'h004a 8'h00 16'h0001 8'h01 +16'h004a 8'h80 16'h0002 8'h00 8'h00 +16'h004a 8'h00 16'h0001 8'h01 +16'h004a 8'h80 16'h0002 8'h00 8'h00 +16'h004a 8'h00 16'h0002 8'h00 8'h32 +16'h004a 8'h80 16'h0002 8'h00 8'h00 +16'h004a 8'h00 16'h0002 8'h00 8'h32 +16'h004a 8'h80 16'h0002 8'h00 8'h00 +16'h004a 8'h00 16'h0002 8'h00 8'h32 +16'h004a 8'h80 16'h0002 8'h00 8'h00 +16'h004a 8'h00 16'h0002 8'h00 8'h32 +16'h004a 8'h80 16'h0002 8'h00 8'h00 +16'h004a 8'h00 16'h0002 8'h00 8'h32 +16'h004a 8'h80 16'h0002 8'h00 8'h00 +16'h004a 8'h00 16'h0002 8'h01 8'h43 +16'h004a 8'h80 16'h0002 8'h00 8'h00 +16'h004a 8'h00 16'h0002 8'h01 8'h43 +16'h004a 8'h80 16'h0002 8'h00 8'h00 +16'h004a 8'h00 16'h0002 8'h01 8'h43 +16'h004a 8'h80 16'h0002 8'h00 8'h00 +16'h004a 8'h00 16'h0002 8'h01 8'h43 +16'h004a 8'h80 16'h0002 8'h00 8'h00 +16'h004a 8'h00 16'h0002 8'h01 8'h43 +16'h004a 8'h80 16'h0002 8'h00 8'h00 +16'h004a 8'h00 16'h0002 8'h01 8'h58 +16'h004a 8'h80 16'h0002 8'h01 8'h00 +16'h004a 8'h00 16'h0002 8'h01 8'h58 +16'h004a 8'h80 16'h0002 8'h01 8'h00 +16'h004a 8'h00 16'h0002 8'h01 8'h58 +16'h004a 8'h80 16'h0002 8'h01 8'h00 +16'h004a 8'h00 16'h0002 8'h01 8'h58 +16'h004a 8'h80 16'h0002 8'h01 8'h00 +16'h004a 8'h00 16'h0002 8'h01 8'h58 +16'h004a 8'h80 16'h0002 8'h01 8'h00 +16'h004a 8'h00 16'h0001 8'h00 +16'h004a 8'h80 16'h0002 8'h01 8'h00 +16'h004a 8'h00 16'h0001 8'h00 +16'h004a 8'h80 16'h0002 8'h01 8'h00 +16'h004a 8'h00 16'h0001 8'h00 +16'h004a 8'h80 16'h0002 8'h01 8'h00 +16'h004a 8'h00 16'h0001 8'h00 +16'h004a 8'h80 16'h0002 8'h01 8'h00 +16'h004a 8'h00 16'h0001 8'h00 +16'h004a 8'h80 16'h0002 8'h01 8'h00 +16'h004a 8'h00 16'h0002 8'h00 8'h32 +16'h004a 8'h80 16'h0002 8'h01 8'h00 +16'h004a 8'h00 16'h0002 8'h00 8'h32 +16'h004a 8'h80 16'h0002 8'h01 8'h00 +16'h004a 8'h00 16'h0002 8'h00 8'h32 +16'h004a 8'h80 16'h0002 8'h01 8'h00 +16'h004a 8'h00 16'h0002 8'h00 8'h32 +16'h004a 8'h80 16'h0002 8'h01 8'h00 +16'h004a 8'h00 16'h0002 8'h00 8'h32 +16'h004a 8'h80 16'h0002 8'h01 8'h00 +16'h004a 8'h00 16'h0002 8'h01 8'h43 +16'h004a 8'h80 16'h0002 8'h01 8'h00 +16'h004a 8'h00 16'h0002 8'h01 8'h43 +16'h004a 8'h80 16'h0002 8'h01 8'h00 +16'h004a 8'h00 16'h0002 8'h01 8'h43 +16'h004a 8'h80 16'h0002 8'h01 8'h00 +16'h004a 8'h00 16'h0002 8'h01 8'h43 +16'h004a 8'h80 16'h0002 8'h01 8'h00 +16'h004a 8'h00 16'h0002 8'h01 8'h43 +16'h004a 8'h80 16'h0002 8'h01 8'h00 +16'h004a 8'h00 16'h0002 8'h30 8'h58 +16'h004a 8'h80 16'h0002 8'h00 8'h00 +16'h004a 8'h00 16'h0002 8'h30 8'h58 +16'h004a 8'h80 16'h0002 8'h00 8'h00 +16'h004a 8'h00 16'h0002 8'h30 8'h58 +16'h004a 8'h80 16'h0002 8'h00 8'h00 +16'h004a 8'h00 16'h0002 8'h30 8'h58 +16'h004a 8'h80 16'h0002 8'h00 8'h00 +16'h004a 8'h00 16'h0002 8'h30 8'h58 +16'h004a 8'h80 16'h0002 8'h00 8'h00 +16'h004a 8'h00 16'h0002 8'h23 8'h58 +16'h004a 8'h80 16'h0002 8'h01 8'h00 +16'h004a 8'h00 16'h0002 8'h23 8'h58 +16'h004a 8'h80 16'h0002 8'h01 8'h00 +16'h004a 8'h00 16'h0002 8'h23 8'h58 +16'h004a 8'h80 16'h0002 8'h01 8'h00 +16'h004a 8'h00 16'h0002 8'h23 8'h58 +16'h004a 8'h80 16'h0002 8'h01 8'h00 +16'h004a 8'h00 16'h0002 8'h23 8'h58 +16'h004a 8'h80 16'h0002 8'h01 8'h00 +16'h004a 8'h00 16'h0002 8'h00 8'h58 +16'h004a 8'h00 16'h0002 8'h00 8'h58 +16'h004a 8'h00 16'h0002 8'h00 8'h58 +16'h004a 8'h00 16'h0002 8'h00 8'h58 +16'h004a 8'h00 16'h0002 8'h00 8'h58 diff --git a/tb/shinTest/testcase_result/regtest_tc03_result.log b/tb/shinTest/testcase_result/regtest_tc03_result.log index 6c0ef50..9686be1 100644 --- a/tb/shinTest/testcase_result/regtest_tc03_result.log +++ b/tb/shinTest/testcase_result/regtest_tc03_result.log @@ -1,36 +1,36 @@ -16'h0302 8'h00 16'h0002 8'h20 8'h00 -16'h0302 8'h00 16'h0002 8'h20 8'h00 -16'h0302 8'h00 16'h0002 8'h20 8'h00 -16'h0302 8'h00 16'h0002 8'h20 8'h00 -16'h0302 8'h00 16'h0002 8'h20 8'h00 -16'h0078 8'h00 16'h0004 8'hff 8'hff 8'hff 8'hff -16'h0302 8'h00 16'h0002 8'h2c 8'h00 -16'h0306 8'h00 16'h0002 8'h2c 8'h00 -16'h1000 8'h00 16'h002c 8'h02 8'h80 8'h00 8'h00 8'h00 8'h00 8'h08 8'h00 8'he0 8'h20 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 -16'h0020 8'h00 16'h0001 8'h01 -16'h0800 8'h80 16'h002c 8'h02 8'h80 8'h00 8'h04 8'h00 8'h00 8'h08 8'h00 8'he0 8'h20 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h04 -16'h0302 8'h00 16'h0002 8'h40 8'h00 -16'h0302 8'h00 16'h0002 8'h40 8'h00 -16'h0302 8'h00 16'h0002 8'h40 8'h00 -16'h0302 8'h00 16'h0002 8'h40 8'h00 -16'h0302 8'h00 16'h0002 8'h40 8'h00 -16'h0300 8'h80 16'h0004 8'h00 8'h00 8'h40 8'h00 -16'h0300 8'h80 16'h0004 8'h00 8'h01 8'h20 8'h00 -16'h0300 8'h80 16'h0004 8'h00 8'h01 8'h20 8'h00 -16'h0300 8'h80 16'h0004 8'h00 8'h01 8'h20 8'h00 -16'h0300 8'h80 16'h0004 8'h00 8'h01 8'h20 8'h00 -16'h0300 8'h00 16'h0001 8'h00 -16'h0300 8'h00 16'h0001 8'h00 -16'h0300 8'h00 16'h0001 8'h00 -16'h0300 8'h00 16'h0001 8'h00 -16'h0300 8'h00 16'h0001 8'h00 -16'h0300 8'h80 16'h0004 8'h00 8'h00 8'h40 8'h00 -16'h0300 8'h80 16'h0004 8'h00 8'h00 8'h20 8'h00 -16'h0300 8'h80 16'h0004 8'h00 8'h00 8'h20 8'h00 -16'h0300 8'h80 16'h0004 8'h00 8'h00 8'h20 8'h00 -16'h0300 8'h80 16'h0004 8'h00 8'h00 8'h20 8'h00 -16'h0078 8'h00 16'h0004 8'hff 8'hff 8'hff 8'hff -16'h0078 8'h00 16'h0004 8'hff 8'hff 8'hff 8'hff -16'h0078 8'h00 16'h0004 8'hff 8'hff 8'hff 8'hff -16'h0078 8'h00 16'h0004 8'hff 8'hff 8'hff 8'hff -16'h0078 8'h00 16'h0004 8'hff 8'hff 8'hff 8'hff +16'h0302 8'h00 16'h0002 8'h20 8'h00 +16'h0302 8'h00 16'h0002 8'h20 8'h00 +16'h0302 8'h00 16'h0002 8'h20 8'h00 +16'h0302 8'h00 16'h0002 8'h20 8'h00 +16'h0302 8'h00 16'h0002 8'h20 8'h00 +16'h0078 8'h00 16'h0004 8'hff 8'hff 8'hff 8'hff +16'h0302 8'h00 16'h0002 8'h2c 8'h00 +16'h0306 8'h00 16'h0002 8'h2c 8'h00 +16'h1000 8'h00 16'h002c 8'h02 8'h80 8'h00 8'h00 8'h00 8'h00 8'h08 8'h00 8'he0 8'h20 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 +16'h0020 8'h00 16'h0001 8'h01 +16'h0800 8'h80 16'h002c 8'h02 8'h80 8'h00 8'h04 8'h00 8'h00 8'h08 8'h00 8'he0 8'h20 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h04 +16'h0302 8'h00 16'h0002 8'h40 8'h00 +16'h0302 8'h00 16'h0002 8'h40 8'h00 +16'h0302 8'h00 16'h0002 8'h40 8'h00 +16'h0302 8'h00 16'h0002 8'h40 8'h00 +16'h0302 8'h00 16'h0002 8'h40 8'h00 +16'h0300 8'h80 16'h0004 8'h00 8'h00 8'h40 8'h00 +16'h0300 8'h80 16'h0004 8'h00 8'h01 8'h20 8'h00 +16'h0300 8'h80 16'h0004 8'h00 8'h01 8'h20 8'h00 +16'h0300 8'h80 16'h0004 8'h00 8'h01 8'h20 8'h00 +16'h0300 8'h80 16'h0004 8'h00 8'h01 8'h20 8'h00 +16'h0300 8'h00 16'h0001 8'h00 +16'h0300 8'h00 16'h0001 8'h00 +16'h0300 8'h00 16'h0001 8'h00 +16'h0300 8'h00 16'h0001 8'h00 +16'h0300 8'h00 16'h0001 8'h00 +16'h0300 8'h80 16'h0004 8'h00 8'h00 8'h40 8'h00 +16'h0300 8'h80 16'h0004 8'h00 8'h00 8'h20 8'h00 +16'h0300 8'h80 16'h0004 8'h00 8'h00 8'h20 8'h00 +16'h0300 8'h80 16'h0004 8'h00 8'h00 8'h20 8'h00 +16'h0300 8'h80 16'h0004 8'h00 8'h00 8'h20 8'h00 +16'h0078 8'h00 16'h0004 8'hff 8'hff 8'hff 8'hff +16'h0078 8'h00 16'h0004 8'hff 8'hff 8'hff 8'hff +16'h0078 8'h00 16'h0004 8'hff 8'hff 8'hff 8'hff +16'h0078 8'h00 16'h0004 8'hff 8'hff 8'hff 8'hff +16'h0078 8'h00 16'h0004 8'hff 8'hff 8'hff 8'hff