【RISC-V操持-13】- RISC-V处置惩罚器操持K0A之指令测试

[复制链接]
发表于 2026-2-8 19:27:46 | 显示全部楼层 |阅读模式
【RISC-V操持-13】- RISC-V处置惩罚器操持K0A之指令测试



1.简介

借助上一篇文章所提及的验证环境,在本篇文章中,将会叙述怎样增长一个用例来验证指令集,以及怎样运用编译器编译汇编代码,并天生二进制的 Bin 文件。针对 RISC-V 所利用的编译器,这里采取的是“山河编译器”。山河编译器(MounRiver Studio)是一款国产的集成开辟环境(IDE),官网地点:http://www.mounriver.com,可自行下载对应版本,并将编译器路径添加到环境变量中。

2.验证用例

  1. // -------------------------------------------------------------------------------------------------
  2. // Copyright 2024 Kearn Chen, kearn.chen@aliyun.com
  3. //
  4. // Licensed under the Apache License, Version 2.0 (the "License");
  5. // you may not use this file except in compliance with the License.
  6. // You may obtain a copy of the License at
  7. //
  8. //     http://www.apache.org/licenses/LICENSE-2.0
  9. //
  10. // Unless required by applicable law or agreed to in writing, software
  11. // distributed under the License is distributed on an "AS IS" BASIS,
  12. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13. // See the License for the specific language governing permissions and
  14. // limitations under the License.
  15. // -------------------------------------------------------------------------------------------------
  16. // Description :
  17. //             1. Instr smoke test
  18. // -------------------------------------------------------------------------------------------------
  19. task initcase;
  20.     load_instr("instr_smoke_test/instr_smoke_test.bin");
  21. endtask
  22. task testcase;
  23.     #1_000_000;
  24. endtask
复制代码
在验证用例中,使命initcase加载Bin文件到仿真模子中,使命testcase延长1毫秒,期待CPU实行完软件指令。
3.指令代码

  1. /*Copyright 2018-2021 T-Head Semiconductor Co., Ltd.
  2. Licensed under the Apache License, Version 2.0 (the "License");
  3. you may not use this file except in compliance with the License.
  4. You may obtain a copy of the License at
  5.     http://www.apache.org/licenses/LICENSE-2.0
  6. Unless required by applicable law or agreed to in writing, software
  7. distributed under the License is distributed on an "AS IS" BASIS,
  8. WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  9. See the License for the specific language governing permissions and
  10. limitations under the License.
  11. */
  12. .text
  13. .align 1
  14. .global _start
  15. _start:
  16. #---------------------------------------#
  17. #       main execution routine          #  
  18. #---------------------------------------#
  19. #---------------------------------------#
  20. #          RV32I  instructions          #
  21. #---------------------------------------#
  22. #---------------------------------------#
  23. #          Int Reg-imm Ins              #
  24. #---------------------------------------#
  25. #ADDi
  26. ADDI:
  27.     #func 1 test basic
  28.     #-1 +5
  29.     li          x5, 0x4
  30.     li          x4, 0x5
  31.     addi        x4, x4, 0xffffffff
  32.     bne         x4, x5, TEST_FAIL
  33.     #2047+2047
  34.     li          x5, 0xffe
  35.     li          x4, 0x7ff
  36.     addi        x4, x4, 0x7ff
  37.     bne         x4, x5, TEST_FAIL
  38.     #-2048+-2048
  39.     li          x5, 0xfffff000
  40.     li          x4, 0xfffff800
  41.     addi        x4, x4, 0xfffff800
  42.     bne         x4, x5, TEST_FAIL
  43.     #func 2 test MV
  44.     addi        x4, x4, 0x123
  45.     addi        x5, x4, 0x0
  46.     bne         x4, x5, TEST_FAIL
  47.     #func 3 test nop
  48.     li          x5, 0x0
  49.     addi        x5, x5, 0x0
  50.     addi        x0, x0, 0x0
  51.     addi        x0, x0, 0x5
  52.     bne         x5, x0, TEST_FAIL
  53. #SLTI
  54. SLTI:
  55.     li          x4, 0x1
  56.     #signed compare 0xfff compare with 0xffffffff(imm expand)
  57.     li          x5, 0xfff
  58.     slti        x5, x5, 0xffffffff
  59.     bne         x5, x0, TEST_FAIL
  60.    
  61.     #signed compare 0xfff compare with 0x1(imm not expand)
  62.     li          x5, 0xfff
  63.     slti        x5, x5, 0x1
  64.     bne         x5, x0, TEST_FAIL
  65.    
  66.     #signed compare 0xffffffff compare with 0x1
  67.     li          x5, 0xffffffff
  68.     slti        x5, x5, 0x1
  69.     bne         x5, x4, TEST_FAIL
  70.    
  71.     #signed compare 0x1 compare with 0x1
  72.     li          x5, 0x1
  73.     slti        x5, x5, 0x1
  74.     bne         x5, x0, TEST_FAIL
  75. #SLTIU
  76. SLTIU:
  77.     li          x4, 0x1
  78.     #0xffffffff compare with 0xfff
  79.     li          x5, 0xffffffff
  80.     sltiu       x5, x5, 0x7ff
  81.     bne         x5, x0, TEST_FAIL
  82.    
  83.     #0xfff compare with 0x1
  84.     li          x5, 0xfff
  85.     sltiu       x5, x5, 0x1
  86.     bne         x5, x0, TEST_FAIL
  87.    
  88.     #0x1 compare with 0xfff(no sign extend)
  89.     li          x5, 0x1
  90.     sltiu       x5, x5, 0x7ff
  91.     bne         x5, x4, TEST_FAIL
  92. #ANDI
  93. ANDI:
  94.     #0xaaaaaaaa andi 0xfff(sign extend)
  95.     li          x4, 0xaaaaaaaa
  96.     li          x5, 0xaaaaaaaa
  97.     andi        x5, x5, 0xffffffff
  98.     bne         x4, x5, TEST_FAIL
  99.    
  100.     #0xaaaaaaaa andi 0x7ff(sign extend)
  101.     li          x4, 0x2aa
  102.     li          x5, 0xaaaaaaaa
  103.     andi        x5, x5, 0x7ff
  104.     bne         x4, x5, TEST_FAIL
  105.    
  106.     #0xaaaaaaaa andi 0x0
  107.     li           x4, 0x0
  108.     li           x5, 0xaaaaaaaa
  109.     andi         x5, x5, 0x0
  110.     bne          x4, x5, TEST_FAIL
  111.    
  112. #ORI
  113. ORI:
  114.     #0xaaaaaaaa ori 0xffffffff(sign extend)
  115.     li          x4, 0xffffffff
  116.     li          x5, 0xaaaaaaaa
  117.     ori         x5, x5, 0xffffffff
  118.     bne         x4, x5, TEST_FAIL
  119.    
  120.     #0xaaaaaaaa ori 0x7ff(sign extend)
  121.     li          x4, 0x2aa
  122.     li          x5, 0xaaaaaaaa
  123.     ori         x5, x5, 0x7ff
  124.     beq         x4, x5, TEST_FAIL
  125.    
  126.     #0xaaaaaaaa ori 0x0
  127.     li          x4, 0xaaaaaaaa
  128.     li          x5, 0xaaaaaaaa
  129.     ori         x5, x5, 0x0
  130.     bne         x4, x5, TEST_FAIL
  131. #XORI
  132. XORI:
  133.     #not
  134.     li          x4, 0xabcdabcd
  135.     xori        x5, x4, -1
  136.     not         x6, x4
  137.     bne         x6, x5, TEST_FAIL
  138.    
  139.     #0xf
  140.     li          x4, 0xabcdffff
  141.     li          x6, 0xabcdfff0
  142.     xori        x5, x4, 0xf
  143.     bne         x6, x5, TEST_FAIL
  144.    
  145.     #0x0
  146.     li          x4, 0xabcdabcd
  147.     li          x6, 0xabcdabcd
  148.     xori        x5, x4, 0x0
  149.     bne         x6, x5, TEST_FAIL
  150. #SLLI
  151. SLLI:
  152.     li          x4, 0xabcd1234
  153.     slli        x2, x4, 0             #IMM5 = 0, x2 = x4
  154.     bne         x2, x4, TEST_FAIL
  155.    
  156.     li          x4, 0xabcd1234
  157.     slli        x2, x4, 31            #IMM5 = 31, x2 = 0
  158.     li          x3, 0x0
  159.     bne         x2, x3, TEST_FAIL
  160.    
  161.     li          x4, 0xaaaaaaaa
  162.     slli        x2, x4, 8             #IMM5 = 8, x2 = 0xaaaaaa
  163.     li          x3, 0xaaaaaa00
  164.     bne         x2, x3, TEST_FAIL
  165. #SRLI
  166. SRLI:
  167.     li          x2, 0xabcd1234
  168.     srli        x3, x2, 0             #IMM5 = 0, r2 = r1
  169.     bne         x2, x3, TEST_FAIL
  170.    
  171.     li          x2, 0xaaaaaaaa
  172.     srli        x3, x2, 31            #IMM5 = 31, r2 = 1
  173.     li          x4, 0x1
  174.     bne         x3, x4, TEST_FAIL
  175.    
  176.     li          x2, 0xaaaaaaaa
  177.     srli        x2, x2, 1             #IMM5 = 1, r2 = 0x55555555
  178.     li          x3, 0x55555555
  179.     bne         x2, x3, TEST_FAIL
  180. #SRAI
  181. SRAI:
  182.     li          x2, 0xaaaaaaaa
  183.     srai        x2, x2, 31          #IMM5 = 31,sign=1, x2 = 0xffffffff
  184.     li          x3, 0xffffffff
  185.     bne         x2, x3, TEST_FAIL
  186.    
  187.     li          x2, 0x55555555
  188.     srai        x2, x2, 31          #IMM5=31, sign=0, x2 = 0
  189.     li          x3, 0
  190.     bne         x2, x3, TEST_FAIL
  191.      
  192.     li          x2, 0x55555555
  193.     srai        x2, x2, 1           #IMM5=1 , x2 = 2aaaaaaa
  194.     li          x3, 0x2aaaaaaa
  195.     bne         x2, x3, TEST_FAIL
  196.    
  197.     li          x2, 0xabcd1234
  198.     srai        x2, x2, 0           # /IMM5=0, r2 = abcd1234
  199.     li          x3, 0xabcd1234
  200.     bne         x2, x3, TEST_FAIL
  201. #LUI
  202. LUI:
  203.     lui         x2, 0x7bcd1           
  204.     li          x3, 0x7bcd1000
  205.     bne         x2, x3, TEST_FAIL
  206.    
  207.     lui         x2, 0x89abc           
  208.     li          x3, 0x89abc000
  209.     bne         x2, x3, TEST_FAIL
  210. #AUIPC
  211. AUIPC:
  212.     auipc       x2, 0x0
  213.     li          x3, 0xa010
  214.     add         x2, x3, x2
  215.     auipc       x4, 0xa
  216.     bne         x2, x4, TEST_FAIL
  217.     auipc       x2, 0x0
  218.     li          x3, 0x80000010
  219.     add         x2, x3, x2
  220.     auipc       x4, 0x80000
  221.     bne         x2, x4, TEST_FAIL
  222. #---------------------------------------#
  223. #          Int Reg-Reg Ins              #
  224. #---------------------------------------#
  225. #ADD
  226. ADD:
  227.     #-1+ -1
  228.     li          x3, 0xffffffff
  229.     li          x4, 0xffffffff
  230.     add         x5, x3, x4
  231.     li          x6, 0xfffffffe
  232.     bne         x5, x6, TEST_FAIL
  233.    
  234.     #0x8000000+ 0x80000000
  235.     li          x3, 0x80000000
  236.     li          x4, 0x80000000
  237.     add         x5, x3, x4
  238.     li          x6, 0x0
  239.     bne         x5, x6, TEST_FAIL
  240.    
  241.     #0x7fffffff+ 0x7fffffff
  242.     li          x3, 0x7fffffff
  243.     li          x4, 0x7fffffff
  244.     add         x5, x3, x4
  245.     li          x6, 0xfffffffe
  246.     bne         x5, x6, TEST_FAIL
  247. #SUB
  248. SUB:
  249.     #0x80000000- 0x7fffffff
  250.     li          x3, 0x80000000
  251.     li          x4, 0x7fffffff
  252.     sub         x5, x3, x4
  253.     li          x6, 0x1
  254.     bne         x5, x6, TEST_FAIL
  255.    
  256.     #0x7fffffff -  0x80000000
  257.     li          x3, 0x7fffffff
  258.     li          x4, 0x80000000
  259.     sub         x5, x3, x4
  260.     li          x6, 0xffffffff
  261.     bne         x5, x6, TEST_FAIL
  262.    
  263.     #0xf - 0x2
  264.     li          x3, 0xf
  265.     li          x4, 0x2
  266.     sub         x5, x3, x4
  267.     li          x6, 0xd
  268.     bne         x5, x6, TEST_FAIL
  269. #SLT
  270. SLT:
  271.     li          x3, 0x1
  272.     li          x4, 0x0
  273.     li          x5, 0x80000000
  274.     li          x6, 0xffffffff
  275.    
  276.     #1 / 1
  277.     slt         x7, x3, x3
  278.     bne         x7, x4, TEST_FAIL
  279.    
  280.     #1 / 0
  281.     slt         x7, x3, x4
  282.     bne         x7, x4, TEST_FAIL
  283.    
  284.     #0 / 1
  285.     slt         x7, x4, x3
  286.     bne         x7, x3, TEST_FAIL
  287.    
  288.     #0x80000000/ 0x1 # -max /1
  289.     slt         x7, x5, x3
  290.     bne         x7, x3, TEST_FAIL
  291. #SLTU
  292. SLTU:
  293.     li          x3, 0x1
  294.     li          x4, 0x0
  295.     li          x5, 0x80000000
  296.     li          x6, 0xffffffff
  297.    
  298.     #1 / 1
  299.     sltu        x7, x3, x3
  300.     bne         x7, x4, TEST_FAIL
  301.    
  302.     #1 / 0
  303.     sltu        x7, x3, x4
  304.     bne         x7, x4, TEST_FAIL
  305.    
  306.     #0 / 1
  307.     sltu        x7, x4, x3
  308.     bne         x7, x3, TEST_FAIL
  309.    
  310.     #0x80000000/0x1
  311.     sltu        x7, x5, x3
  312.     bne         x7, x4, TEST_FAIL
  313. #AND
  314. AND:
  315.     li          x3, 0x0
  316.     li          x4, 0xffffffff
  317.    
  318.     #0xabcdabcd  0xffffffff
  319.     li          x5, 0xabcdabcd
  320.     and         x6, x5, x4
  321.     bne         x6, x5, TEST_FAIL
  322.    
  323.     #0xabcdabcd  0x0
  324.     li          x5, 0xabcdabcd
  325.     and         x6, x5, x3
  326.     bne         x6, x3, TEST_FAIL
  327. #OR
  328. OR:
  329.     li          x3, 0x0
  330.     li          x4, 0xffffffff
  331.    
  332.     #0xabcdabcd | 0xffffffff
  333.     li          x5, 0xabcdabcd
  334.     or          x6, x5, x4
  335.     bne         x6, x4, TEST_FAIL
  336.    
  337.     #0xabcdabcd | 0x0
  338.     li          x5, 0xabcdabcd
  339.     or          x6, x5, x3
  340.     bne         x6, x5, TEST_FAIL
  341. #XOR
  342. XOR:
  343.     li          x3, 0x0
  344.     li          x4, 0xffffffff
  345.    
  346.     #0xabcd | 0xffffffff #not
  347.     li          x5, 0xabcdabcd
  348.     xor         x6, x5, x4
  349.     not         x5, x5
  350.     bne         x6, x5, TEST_FAIL
  351.    
  352.     #0xabcd | 0x0
  353.     li          x5, 0xabcdabcd
  354.     xor         x6, x5, x3
  355.     bne         x6, x5, TEST_FAIL
  356. #SLL
  357. SLL:
  358.     li          x4, 0xabcd1234
  359.     sll         x2, x4, x0             #IMM5 = 0, x2 = x4
  360.     bne         x2, x4, TEST_FAIL
  361.    
  362.     li          x4, 0xabcd1234
  363.     li          x5, 31
  364.     sll         x2, x4, x5             #IMM5 = 31, x2 = 0
  365.     li          x3, 0x0
  366.     bne         x2, x3, TEST_FAIL
  367.    
  368.     li          x4, 0xaaaaaaaa
  369.     li          x5, 0x8
  370.     sll         x2, x4, x5             #IMM5 = 8, x2 = 0xaaaaaa
  371.     li          x3, 0xaaaaaa00
  372.     bne         x2, x3, TEST_FAIL
  373.    
  374.     li          x4, 0xaaaaaaaa
  375.     li          x5, 0x21
  376.     sll         x2, x4, x5           #IMM5 = 0x1, x2 = 0x55555554
  377.     li          x3, 0x55555554
  378.     bne         x2, x3, TEST_FAIL
  379. #SRL
  380. SRL:
  381.     li          x2, 0xabcd1234
  382.     srl         x3, x2, x0           #IMM5 = 0, r2 = r1
  383.     bne         x2, x3, TEST_FAIL
  384.    
  385.     li          x2, 0xaaaaaaaa
  386.     li          x5, 31
  387.     srl         x3, x2, x5        #IMM5 = 31, r2 = 1
  388.     li          x4, 0x1
  389.     bne         x3, x4, TEST_FAIL
  390.    
  391.     li          x2, 0xaaaaaaaa
  392.     li          x5, 0x1
  393.     srl         x2, x2, x5         #IMM5 = 1, r2 = 0x55555555
  394.     li          x3, 0x55555555
  395.     bne         x2, x3, TEST_FAIL
  396.    
  397.     li          x2, 0xaaaaaaaa
  398.     li          x5, 0x21
  399.     srl         x2, x2, x5         #IMM5 = 0x1, x2 = 0x55555555
  400.     li          x3, 0x55555555
  401.     bne         x2, x3, TEST_FAIL
  402. #SRA
  403. SRA:
  404.     li          x2, 0xaaaaaaaa
  405.     li          x5, 0x1f
  406.     sra         x2, x2, x5        #IMM5 = 31,sign=1, x2 = 0xffffffff
  407.     li          x3, 0xffffffff
  408.     bne         x2, x3, TEST_FAIL
  409.    
  410.     li          x2, 0x55555555
  411.     li          x5, 0x1f
  412.     sra         x2, x2, x5         #IMM5=31, sign=0, x2 = 0
  413.     li          x3, 0
  414.     bne         x2, x3, TEST_FAIL
  415.      
  416.     li          x2, 0x55555555
  417.     li          x5, 0x1
  418.     sra         x2, x2, x5         #IMM5=1 , x2 = 2aaaaaaa
  419.     li          x3, 0x2aaaaaaa
  420.     bne         x2, x3, TEST_FAIL
  421.    
  422.     li          x2, 0x55555555
  423.     li          x5, 0x21
  424.     sra         x2, x2, x5        #IMM5=1 , x2 = 2aaaaaaa
  425.     li          x3, 0x2aaaaaaa
  426.     bne         x2, x3, TEST_FAIL
  427.    
  428.     li          x2, 0xabcd1234
  429.     sra         x2, x2, x0        # /IMM5=0, r2 = abcd1234
  430.     li          x3, 0xabcd1234
  431.     bne         x2, x3, TEST_FAIL
  432. ######################################################
  433. #                         RV32I
  434. ######################################################
  435. #*****************************************************
  436. #                  store and load
  437. #*****************************************************
  438.     #r1 is link reg  ,r2 is stack reg
  439.     #r0 = 0
  440.     #r3 = ffffffff
  441.     li          x3,0xffffffff
  442.     li          x8,0xaaaaaaaa
  443.     #x3 = ffffffff
  444.     #addr is in x4
  445.     #sw and lw
  446.     li    x4,0x0000a000           #x4 = 0000a000
  447.    
  448.     sw     x8,0xfffffffc(x4)      #mem[0x0000affc] = 0xaaaaaaaa
  449.     lw     x5,0xfffffffc(x4)      # x5 = aaaaaaaa
  450.     bne    x8,x5,TEST_FAIL      
  451.    
  452.     sw     x8,0x7fc(x4)           #mem[0x0000a7fc] = 0xaaaaaaaa
  453.     lw     x5,0x7fc(x4)           # x5 = aaaaaaaa
  454.     bne    x8,x5,TEST_FAIL      
  455.    
  456.     sw     x3,0x0(x4)             #mem[0x0000a000] = 0xffffffff
  457.     lw     x5,0x0(x4)             # x5 = 0xffffffff
  458.     bne    x3,x5,TEST_FAIL         
  459.    
  460.     li     x6,0xffff8000          #x6 =  0xffff_8000
  461.     li     x8,0x00008000          #x8 cmp reg = 0000_8000
  462.     li     x9,0xaaaaaaaa
  463.     li     x10,0xaaaa8000
  464.     #sh and lh
  465.     sw          x9,0x0(x4)           #mem[0x0000a000] = 0xaaaaaaaa
  466.     sh          x6,0x0(x4)           #mem[0x0000a000] = 0xaaaa_8000
  467.     lhu         x7,0x0(x4)           # x7 = 0x0000_8000  zeroextend
  468.     lh          x5,0x0(x4)           #x5 = 0xffff_8000   signextend
  469.     lw          x11,0x0(x4)
  470.     bne         x7,x8,TEST_FAIL
  471.     bne         x6,x5,TEST_FAIL
  472.     bne         x11,x10,TEST_FAIL
  473.    
  474.     sh          x6,0xfffffffe(x4)    #mem[0x0000affe] = 0x8000
  475.     lhu         x7,0xfffffffe(x4)    # x7 = 0x0000_8000  zeroextend
  476.     lh          x5,0xfffffffe(x4)    #x5 = 0xffff_8000   signextend
  477.     bne         x7,x8,TEST_FAIL
  478.     bne         x6,x5,TEST_FAIL
  479.    
  480.     sh          x6,0x7fe(x4)         #mem[0x0000a7fe] = 0x8000
  481.     lhu         x7,0x7fe(x4)         # x7 = 0x0000_8000  zeroextend
  482.     lh          x5,0x7fe(x4)         #x5 = 0xffff_8000   signextend
  483.     bne         x7,x8,TEST_FAIL
  484.     bne         x6,x5,TEST_FAIL
  485.     #sb and lb
  486.     li          x8,0x000000ff
  487.     li          x9,0xaaaaaaaa
  488.     li          x10,0xaaaaaaff
  489.     sw          x9,0x0(x4)           #mem[0x0000a000] = 0xaaaaaaaa
  490.     sb          x3,0x0(x4)           #mem[0x0000a000] = 0xaaaaaaff
  491.     lbu         x7,0x0(x4)           # x7 = 0x0000_00ff   zeroextend
  492.     lb          x5,0x0(x4)           #x5  = 0xffff_ffff   signextend
  493.     lw          x11,0x0(x4)
  494.     bne         x7,x8,TEST_FAIL
  495.     bne         x3,x5,TEST_FAIL
  496.     bne         x10,x11,TEST_FAIL
  497.    
  498.     sb          x3,0xffffffff(x4)    #mem[0x0000afff] = ff
  499.     lbu         x7,0xffffffff(x4)    # x7 = 0x0000_00ff   zeroextend
  500.     lb          x5,0xffffffff(x4)    #x5  = 0xffff_ffff   signextend
  501.     bne         x7,x8,TEST_FAIL
  502.     bne         x3,x5,TEST_FAIL
  503.    
  504.     sb          x3,0x7ff(x4)         #mem[0x0000a7ff] = ff
  505.     lbu         x7,0x7ff(x4)         # x7 = 0x0000_00ff   zeroextend
  506.     lb          x5,0x7ff(x4)         #x5  = 0xffff_ffff   signextend
  507.     bne         x7,x8,TEST_FAIL
  508.     bne         x3,x5,TEST_FAIL
  509. #*************************************************
  510. #                      jmp
  511. #**************************************************
  512.     jal         x1, BRANCH_LABEL
  513. A:
  514.     jal         x0,JREG_LABEL                 #j
  515. #***********************************************************
  516. #               branch
  517. #r0 = 0
  518. #r3 = ffff_ffff
  519. #r4 = 8000_0000
  520. #*************************************************************
  521. BRANCH_LABEL:
  522.     li          x4,0x80000000
  523. #beq
  524.     beq         x0,x4,TEST_FAIL
  525.     beq         x4,x4,BNE_LABEL
  526.     beq         x0,x0,TEST_FAIL                   #not execute
  527. #bne
  528. BNE_LABEL:
  529.     bne         x4,x4,TEST_FAIL
  530.     bne         x0,x4,BLT_LABEL
  531.     beq         x0,x0,TEST_FAIL                   #not execute
  532. #blt
  533. BLT_LABEL:            
  534.     blt         x0,x4,TEST_FAIL
  535.     blt         x4,x4,TEST_FAIL
  536.     blt         x4,x0,BGE_LABEL
  537.     beq         x0,x0,TEST_FAIL                   #not execute
  538. #bge   
  539. BGE_LABEL:
  540.     bge         x4,x3,TEST_FAIL
  541.     bge         x3,x4,BGEE_LABEL
  542.     beq         x0,x0,TEST_FAIL                   #not execute
  543. BGEE_LABEL:                  #equal
  544.     bge         x3,x3,BGEU_LABEL
  545.     beq         x0,x0,TEST_FAIL                   #not execute
  546. #bgeu
  547. BGEU_LABEL:
  548.     bgeu        x4,x3,TEST_FAIL
  549.     bgeu        x3,x4,BGEUE_LABEL
  550.     beq         x0,x0,TEST_FAIL                   #not execute
  551. BGEUE_LABEL:
  552.     bgeu        x3,x3,BLTU_LABEL
  553.     beq         x0,x0,TEST_FAIL                   #not execute
  554. #bltu
  555. BLTU_LABEL:
  556.     bltu        x4,x0,TEST_FAIL
  557.     bltu        x4,x4,TEST_FAIL
  558.     bltu        x0,x4,J_LABEL
  559.     beq         x0,x0,TEST_FAIL                   #not execute
  560. J_LABEL:
  561.     jalr        x1,x1,0x0                 #jump to A
  562. B:
  563.     jal         x0,TEST_PASS
  564.      
  565. JREG_LABEL:
  566.     jalr        x0,x1,0x0                 #jr  jump to B
  567. #---------------------------------------#
  568. #exit
  569. #---------------------------------------#
  570. TEST_PASS:
  571.     la          a0, 0xC0000
  572.     la          a1, 0x54     // 'T'
  573.     sw          a1, (a0)
  574.     la          a1, 0x65     // 'e'
  575.     sw          a1, (a0)
  576.     la          a1, 0x73     // 's'
  577.     sw          a1, (a0)
  578.     la          a1, 0x74     // 't'
  579.     sw          a1, (a0)
  580.     la          a1, 0x20     // ' '
  581.     sw          a1, (a0)
  582.     la          a1, 0x70     // 'p'
  583.     sw          a1, (a0)
  584.     la          a1, 0x61     // 'a'
  585.     sw          a1, (a0)
  586.     la          a1, 0x73     // 's'
  587.     sw          a1, (a0)
  588.     la          a1, 0x73     // 's'
  589.     sw          a1, (a0)
  590.     la          a1, 0x21     // '!'
  591.     sw          a1, (a0)
  592.     la          a1, 0x0a     // '\n'
  593.     sw          a1, (a0)
  594. 1:
  595.     j 1b
  596. #---------------------------------------#
  597. #fail
  598. #---------------------------------------#
  599. TEST_FAIL:
  600.     la          a0, 0xC0000
  601.     la          a1, 0x54     // 'T'
  602.     sw          a1, (a0)
  603.     la          a1, 0x65     // 'e'
  604.     sw          a1, (a0)
  605.     la          a1, 0x73     // 's'
  606.     sw          a1, (a0)
  607.     la          a1, 0x74     // 't'
  608.     sw          a1, (a0)
  609.     la          a1, 0x20     // ' '
  610.     sw          a1, (a0)
  611.     la          a1, 0x66     // 'f'
  612.     sw          a1, (a0)
  613.     la          a1, 0x61     // 'a'
  614.     sw          a1, (a0)
  615.     la          a1, 0x6a     // 'i'
  616.     sw          a1, (a0)
  617.     la          a1, 0x6c     // 'l'
  618.     sw          a1, (a0)
  619.     la          a1, 0x21     // '!'
  620.     sw          a1, (a0)
  621.     la          a1, 0x0a     // '\n'
  622.     sw          a1, (a0)
  623. 1:
  624.     j 1b
复制代码
上述测试指令泉源于平头哥的玄铁E902的冒烟测试用例,对其做了大量修改,删去了压缩指令集部门。在全部指令都实行正确后,会跳转到TEST_PASS代码段,并在终端上打印"Test pass!",然后期待仿真竣事。在举行指令测试时,恣意指令实行错误,都会跳转到TEST_FAIL代码段,并在终端上打印"Test fail!",然后期待竣事仿真。
4.链接脚本

  1. OUTPUT_ARCH( "riscv" )
  2. ENTRY(_start)
  3. SECTIONS
  4. {
  5.   . = 0x00000000;
  6.   .text.init : { *(.text.init) }
  7.   . = ALIGN(0x1000);
  8.   .tohost : { *(.tohost) }
  9.   . = ALIGN(0x1000);
  10.   .text : { *(.text) }
  11.   . = ALIGN(0x1000);
  12.   .data : { *(.data) }
  13.   .bss : { *(.bss) }
  14.   _end = .;
  15. }
复制代码
5.编译脚本

  1. # -------------------------------------------------------------------------------------------------
  2. # Copyright 2024 Kearn Chen, kearn.chen@aliyun.com
  3. #
  4. # Licensed under the Apache License, Version 2.0 (the "License");
  5. # you may not use this file except in compliance with the License.
  6. # You may obtain a copy of the License at
  7. #
  8. #     http://www.apache.org/licenses/LICENSE-2.0
  9. #
  10. # Unless required by applicable law or agreed to in writing, software
  11. # distributed under the License is distributed on an "AS IS" BASIS,
  12. # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13. # See the License for the specific language governing permissions and
  14. # limitations under the License.
  15. # -------------------------------------------------------------------------------------------------
  16. PREFIX := riscv-none-embed-
  17. LINKER := link.ld
  18. OBJECT += instr_smoke.o
  19. CFLAGS := -march=rv32e -mabi=ilp32e
  20. LFLAGS := -march=rv32e -mabi=ilp32e -T$(LINKER) -nostartfiles -nostdlib
  21. TARGET := $(notdir $(shell pwd))
  22. all : $(TARGET).asm $(TARGET).bin
  23. %.bin : %.elf
  24.         $(PREFIX)objcopy -Obinary $< $@
  25. %.asm : %.elf
  26.         $(PREFIX)objdump -D $< > $@
  27. %.elf : $(OBJECT)
  28.         $(PREFIX)gcc $(LFLAGS) -o $@ $^
  29. %.o : %.S
  30.         $(PREFIX)gcc $(CFLAGS) -c -o $@ $<
  31. clean :
  32.         @rm -rf *.o *.elf *.asm *.bin
  33. .PHONY: clean all
  34. .SECONDARY:
复制代码
6.仿真效果

6.1 复位竣事


6.2 运行乐成


6.3 终端打印

  1. *Verdi* : Create FSDB file 'novas.fsdb'
  2. *Verdi* : Begin traversing the scopes, layer (0).
  3. *Verdi* : End of traversing.
  4. [MCU_INFO] : Test pass!
  5. $finish called from file "../env/test_top.v", line 78.
  6. $finish at simulation time              1001000
复制代码
7.总结

本文先容了指令集的验证流程以及一个根本的指令冒烟用例,通过经心操持的指令码,可以大概有用地支持主动比对功能的实现。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!qidao123.com:ToB企服之家,中国第一个企服评测及软件市场,开放入驻,技术点评得现金

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表