-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathindex.html
1625 lines (1111 loc) · 80 KB
/
index.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
<!DOCTYPE html>
<html lang="zh">
<head><meta name="generator" content="Hexo 3.8.0">
<meta name="baidu-site-verification" content="5NJSOR3owM">
<meta name="msvalidate.01" content="151864C0926CAD18FEA3D03EA31DCEB6">
<meta charset="utf-8">
<title>马車同学</title>
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
<meta property="og:type" content="website">
<meta property="og:title" content="马車同学">
<meta property="og:url" content="https://jijingg.github.io/index.html">
<meta property="og:site_name" content="马車同学">
<meta property="og:locale" content="zh-CN">
<meta property="og:image" content="https://jijingg.github.io/images/og_image.png">
<meta name="twitter:card" content="summary">
<meta name="twitter:title" content="马車同学">
<meta name="twitter:image" content="https://jijingg.github.io/images/og_image.png">
<link rel="icon" href="/favicon.ico">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/[email protected]/css/bulma.css">
<link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.4.1/css/all.css">
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Ubuntu:400,600|Source+Code+Pro">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/[email protected]/styles/atom-one-light.css">
<style>body>.footer,body>.navbar,body>.section{opacity:0}</style>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/[email protected]/dist/css/lightgallery.min.css">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/[email protected]/dist/css/justifiedGallery.min.css">
<link rel="stylesheet" href="/css/back-to-top.css">
<link rel="stylesheet" href="/css/progressbar.css">
<script src="https://cdn.jsdelivr.net/npm/[email protected]/pace.min.js"></script>
<link rel="stylesheet" href="/css/style.css">
</head>
<body class="is-2-column">
<nav class="navbar navbar-main">
<div class="container">
<div class="navbar-brand is-flex-center">
<a class="navbar-item navbar-logo" href="/">
<img src="/images/logo.svg" alt="马車同学" height="28">
</a>
</div>
<div class="navbar-menu">
<div class="navbar-start">
<a class="navbar-item is-active" href="/">文章</a>
<a class="navbar-item" href="/main/">目录</a>
<a class="navbar-item" href="/spinalhdl/">SpinalHDL</a>
<a class="navbar-item" href="/topic/">主题</a>
<a class="navbar-item" href="/categories/">分类</a>
<a class="navbar-item" href="/tags/">标签</a>
<a class="navbar-item" href="/archives/">时间轴</a>
<a class="navbar-item" href="/about/">关于</a>
</div>
<div class="navbar-end">
<a class="navbar-item" target="_blank" title="Download on GitHub" href="http://github.com/jijingg">
<i class="fab fa-github"></i>
</a>
<a class="navbar-item search" title="搜索" href="javascript:;">
<i class="fas fa-search"></i>
</a>
</div>
</div>
</div>
</nav>
<section class="section">
<div class="container">
<div class="columns">
<div class="column is-9 has-order-2 column-main">
<div class="card">
<div class="card-content article ">
<div class="level article-meta is-size-7 is-uppercase is-mobile is-overflow-x-auto">
<div class="level-left">
<time class="level-item has-text-grey" datetime="2019-04-11T12:48:53.000Z">2019-04-11</time>
<span class="level-item has-text-grey">
4 分钟 读完 (大约 640 个字)
</span>
</div>
</div>
<h1 class="title is-size-4 is-size-4-mobile has-text-weight-normal">
<a class="has-link-black-ter" href="/top-index.html">索引置顶</a>
</h1>
<div class="content">
<h4 id="SpinalHDL开发"><a href="#SpinalHDL开发" class="headerlink" title="SpinalHDL开发"></a>SpinalHDL开发</h4><ul>
<li>2020-07-30: <a href="/spinal/spinal9.html">SpinalHDL(九):不变应万变-Mem接口适配</a> </li>
<li>2020-05-16: <a href="/spinal/spinal8.html">SpinalHDL(八):开发仿真测试一条龙</a> </li>
<li>2020-01-25: <a href="/spinal/spinal-single-object.html">Scala单例模式的几个有趣的应用</a> </li>
<li>2020-01-01: <a href="/spinal/spinal-bootcamp.html">Spinal-BootCamp</a> </li>
<li>2020-12-05: <a href="/spinal/spinal7.html">SpinalHDL(七):逢山开路-寄存器接口</a> </li>
<li>2019-11-14: <a href="/spinal/spinal6.html">SpinalHDL(六):定点化-饱和截位</a> </li>
<li>2019-11-04: <a href="/spinal/spinal5.html">SpinalHDL(五):时钟和时钟域</a> </li>
<li>2019-10-31: <a href="/spinal/spinal4.html">SpinalHDL(四):一窥总线四两拨千斤</a> </li>
<li>2019-10-22: <a href="/spinal/spinal3.html">SpinalHDL(三):一行代码生成SOC</a> </li>
<li>2019-10-20: <a href="/spinal/spinal1.html">SpinalHDL(一):此CHISEL非彼Chisel</a> </li>
<li>2019-10-28: <a href="/spinalhdl/spinalhdl-ppt.html">SpinalHDL参数化设计</a> </li>
</ul>
<h4 id="Lambda演算python实现"><a href="#Lambda演算python实现" class="headerlink" title="Lambda演算python实现"></a>Lambda演算python实现</h4><ul>
<li>2019-04-19: <a href="/sicp/lambda_02_number.html">lambda演算python实现.(二)之数字和运算</a></li>
<li>2019-04-19: <a href="/sicp/lambda_03_bool_branch.html">lambda演算python实现.(三)之Bool值和逻辑运算</a></li>
</ul>
<h4 id="函数式编程"><a href="#函数式编程" class="headerlink" title="函数式编程"></a>函数式编程</h4><ul>
<li>2019-10-25: <a href="/sicp/20191025_the-root-of-lisp.html">Lisp之根</a></li>
<li>2019-04-29: <a href="/sicp/20190429_cps.html">CPS变化/尾调用/尾递归</a></li>
<li>2019-04-21: <a href="/sicp/whyfp.html">为什么要FP</a></li>
<li>2019-04-11: <a href="/sicp/python-fp.html">Python lambda Y组合子(Y算子)实现</a></li>
</ul>
<h4 id="Scala-笔记"><a href="#Scala-笔记" class="headerlink" title="Scala 笔记"></a>Scala 笔记</h4><ul>
<li>2019-03-08: <a href="/scala/20190308_scala_main.html">SCALA 程序初探.一(main函数)</a></li>
<li>2019-03-08: <a href="/scala/20190308_scala_package.html">SCALA 程序初探.二(package组织方式)</a></li>
<li>2019-03-08: <a href="/scala/20190308_scala_sbt1.html">SCALA 程序初探.三(sbt组织scala代码1)</a></li>
<li>2019-03-08: <a href="/scala/20190308_scala_sbt2.html">SCALA 程序初探.四(sbt组织scala代码2)</a></li>
<li>2019-11-21: <a href="/scala/20191121_scala3_Tasty.html">Scala3 Macro系统Tasty进展</a></li>
</ul>
<h4 id="RISCV-开发调试"><a href="#RISCV-开发调试" class="headerlink" title="RISCV 开发调试"></a>RISCV 开发调试</h4><ul>
<li>2018-11-28: <a href="/riscv/20181130_idea_scala_config.html">IDEA scala chisel环境配置</a></li>
<li>2018-11-28: <a href="/riscv/20181128_makefile_acc.html">Makefile使用笔记</a></li>
<li>2018-11-27: <a href="/riscv/20181127_riscv_link.html">RISC-V 编译链接脚本</a></li>
<li>2018-11-20: <a href="/riscv/20181120_riscv_c_dev_setp.html">RISC-V C代码编译调试笔记</a></li>
<li>2018-11-16: <a href="/riscv/20181116_RISCV_inst_test.html">RISC-V 汇编指令调试、立即数浅尝</a></li>
<li>2018-11-15: <a href="/riscv/20181221_riscv_verctor.html">RISCV-Vector介绍</a></li>
<li>2019-04-28: <a href="/riscv/20190428_function_call.html">C函数调用汇编代码分析</a></li>
</ul>
<h4 id="Chisel-笔记"><a href="#Chisel-笔记" class="headerlink" title="Chisel 笔记"></a>Chisel 笔记</h4><ul>
<li>2018-12-05: <a href="/chisel/20181205_chisel_learning.html">Chisel 示例问题汇总</a></li>
<li>2019-03-21: <a href="/chisel/20190321_chisel_comb_reg.html">chisel 组合逻辑,时序逻辑写法</a></li>
<li>2019-04-01: <a href="/chisel/20190401_chisel_keep_name.html">chisel Keep变量名</a></li>
<li>2019-04-11: <a href="/chisel/20190411_chisel_version.html">chisel 版本问题</a></li>
<li>2019-03-20: <a href="/chisel/20190320_verilog_case_ifelse.html">Chisel-Verilog 查找表优先级问题讨论</a></li>
</ul>
<h4 id="EDA工具"><a href="#EDA工具" class="headerlink" title="EDA工具"></a>EDA工具</h4><ul>
<li><a href="/eda/how_to_send_param2tb">如何从shell中传递变量给verilog文件</a></li>
<li><a href="/eda/eda_option">EDA仿真环境Makefile配置(vcs,verdi)</a></li>
<li><a href="/eda/timing_analysis">时序分析回顾</a></li>
<li><a href="/chisel/20190322_chisel_module_confilict">Moudle名冲突解决办法</a></li>
<li><a href="/eda/verilog_simu_0delay.html">仿真不打拍</a></li>
</ul>
<h4 id="通信"><a href="#通信" class="headerlink" title="通信"></a>通信</h4><ul>
<li><a href="/tech_acc/rv_verctor">AGC调整</a></li>
</ul>
<h4 id="想法"><a href="#想法" class="headerlink" title="想法"></a>想法</h4><ul>
<li><a href="/thought/why-simple-so-complex.html">为什么“简单”如此复杂</a> </li>
</ul>
<h4 id="其他"><a href="#其他" class="headerlink" title="其他"></a>其他</h4><ul>
<li><a href="/others/terminal_FAQ.html">Terminal Shell 常见配置问题</a></li>
<li><a href="/others/RISCV_notes_todo.html">RISCV ISA todo list</a></li>
<li><a href="/others/markdown_guid.html">Markdown 使用手册</a></li>
<li><a href="/others/crystals-pll-vco.html">晶振,PLL,VCO初识</a></li>
<li><a href="/others/lsb_hsb.html">计算机大小端详解</a></li>
<li><a href="/sicp/ipc_msg_communication.html">进程通信,消息队列</a> </li>
<li><a href="/others/revealjs2pdf.html">revealjs导出PDF</a></li>
</ul>
</div>
</div>
</div>
<div class="card">
<div class="card-image">
<a href="/spinal/spinal9.html" class="image is-7by1">
<img class="thumbnail" src="http://source.jijing.site/thumbnails/busy4.jpg" alt="SpinalHDL(九):不变应万变-MemWrap适配">
</a>
</div>
<div class="card-content article ">
<div class="level article-meta is-size-7 is-uppercase is-mobile is-overflow-x-auto">
<div class="level-left">
<time class="level-item has-text-grey" datetime="2020-07-29T16:00:00.000Z">2020-07-30</time>
<div class="level-item">
<a class="has-link-grey -link" href="/categories/spinal/">spinal</a>
</div>
<span class="level-item has-text-grey">
14 分钟 读完 (大约 2084 个字)
</span>
</div>
</div>
<h1 class="title is-size-4 is-size-4-mobile has-text-weight-normal">
<a class="has-link-black-ter" href="/spinal/spinal9.html">SpinalHDL(九):不变应万变-MemWrap适配</a>
</h1>
<div class="content">
<p>对于IC开发工程师我们可能都有这样的痛苦经历,经常需要手动为不同工艺库替换Mem。有些团队的MemWrapper可能是有专门的脚本来生成,内部会用宏来区分不同工艺,相对来说还比较省事一点,即便这样MemWrpper的集成也是需要你手动连线。但是如果你是IP提供商,不同的团队或者公司的MemWrapper的信号命名也各不相同。同样替换Mem是一件极其无聊并且容易出错的事情。</p>
<p><img src="https://pic3.zhimg.com/80/v2-7442a8cd6e06ef578fcdaa73d9806254_720w.jpg" alt="1"></p>
<p>另外我发现SpinalHDL自带的mem类型并不适合直接拿来做例化,所以需要为此创建一个新的解决方案来满足IC设计中这种常见的需求。spinal的mem模型我会放到Blackbox内部做为行为模型,这样在仿真的时候你可以clearBox来使用mem参考模型来仿真,不需要真正的去包含一个memwrap.v文件,这样在前期设计中非常方便。</p>
<p>因此对于设计者来讲,我本来只需要关心这地方例化的Mem类型(双口,真双口,单口),数据位宽,mem深度即可。除此之外工艺相关的事情对设计者应该是透明的。</p>
<p>可以总结为两点诉求</p>
<ul>
<li><strong>MemWrap替换不应修改HDL代码, 对开发者透明</strong></li>
<li><strong>添加新的Vendor memWrap不应修改Spinal源码,保持前向兼容</strong></li>
</ul>
<p><img src="https://picb.zhimg.com/80/v2-e13bfaaac29a1ff083355331cda982fa_720w.jpg" alt="2"></p>
<p>因此,对于开发者来讲,只需要知道统一的RAM例化接口,为此为Spinal设计常见的3种MEM类型.<br></p>
</div>
<div class="level is-mobile">
<div class="level-start">
<div class="level-item">
<a class="button is-size-7 is-light" href="/spinal/spinal9.html#more">阅读更多</a>
</div>
</div>
</div>
</div>
</div>
<div class="card">
<div class="card-image">
<a href="/spinal/spinal8.html" class="image is-7by1">
<img class="thumbnail" src="http://source.jijing.site/thumbnails/chisel1.jpg" alt="SpinalHDL(八):开发仿真测试一条龙">
</a>
</div>
<div class="card-content article ">
<div class="level article-meta is-size-7 is-uppercase is-mobile is-overflow-x-auto">
<div class="level-left">
<time class="level-item has-text-grey" datetime="2020-05-15T16:00:00.000Z">2020-05-16</time>
<div class="level-item">
<a class="has-link-grey -link" href="/categories/spinal/">spinal</a>
</div>
<span class="level-item has-text-grey">
27 分钟 读完 (大约 4021 个字)
</span>
</div>
</div>
<h1 class="title is-size-4 is-size-4-mobile has-text-weight-normal">
<a class="has-link-black-ter" href="/spinal/spinal8.html">SpinalHDL(八):开发仿真测试一条龙</a>
</h1>
<div class="content">
<p>鉴于被chisel的peek poke test愚弄以后,我一度对Scala上的仿真环境不是特别有信心,当看到spinal.sim的时候觉得可能只是一个能work的demo而已,并没有足够重视。</p>
<p>我用Spinal开发的前几个模块依然走的传统的验证流程,先生成Verilog,然后再用scala生成激励,最后打包丢到Linux服务器上, 用Verilog/SV编写tesbech, 搭建测试比对环境,仿真工具不是VCS就是NcSim这些老牌商业软件。</p>
<p>直到一个偶然的机会,有一些很零碎的模块需要测试,不想再为此搭建一整套仿真环境,我想干脆用spinal.sim 简单做个测试,不测不知道,一测一发不可收拾。</p>
<p><strong>SpinalHDL就是这样的汉子,一次又一次的轻视它,但它又不时的给你惊喜。</strong></p>
<ul>
<li>不同于iotest的peak poke, 它的后台是verilator, verilator非常强大,性能比起商业软件VCS、NC毫不逊色。</li>
<li>spinal.sim 通过包装verilator提供的VPI,能够很方便灵活,实时的跟dut交互通信, 加上Scala本身语言的灵活性,它能做的不比UVM少。</li>
</ul>
<blockquote>
<p>今年chisel貌似后知后觉的回过神了,摒弃iotest,重新设计iotester2, iotester2和spinal.sim的思路很类似了, 后台是verilator, 有兴趣的可以自己试试</p>
</blockquote>
<p>接下来我主要借助通信基带的两个模块来介绍一些如何使用SpinalHDL进行仿真测试,以及如何构建组织管理回归你的测试CASE。</p>
<p>对于spinal.sim的基础操作和使用请浏览官方文档Spinal-sim,这里不再赘述。<br></p>
</div>
<div class="level is-mobile">
<div class="level-start">
<div class="level-item">
<a class="button is-size-7 is-light" href="/spinal/spinal8.html#more">阅读更多</a>
</div>
</div>
</div>
</div>
</div>
<div class="card">
<div class="card-image">
<a href="/scala/20200221_maven_windows.html" class="image is-7by1">
<img class="thumbnail" src="http://source.jijing.site/thumbnails/led2.jpg" alt="Maven Windows 配置">
</a>
</div>
<div class="card-content article ">
<div class="level article-meta is-size-7 is-uppercase is-mobile is-overflow-x-auto">
<div class="level-left">
<time class="level-item has-text-grey" datetime="2020-02-19T16:00:00.000Z">2020-02-20</time>
<div class="level-item">
<a class="has-link-grey -link" href="/categories/scala/">scala</a>
</div>
<span class="level-item has-text-grey">
5 分钟 读完 (大约 688 个字)
</span>
</div>
</div>
<h1 class="title is-size-4 is-size-4-mobile has-text-weight-normal">
<a class="has-link-black-ter" href="/scala/20200221_maven_windows.html">Maven Windows 配置</a>
</h1>
<div class="content">
<h3 id="Maven-仓库timeOut-问题"><a href="#Maven-仓库timeOut-问题" class="headerlink" title="Maven 仓库timeOut 问题"></a>Maven 仓库timeOut 问题</h3><h4 id="Scala-工程打包发布依赖"><a href="#Scala-工程打包发布依赖" class="headerlink" title="Scala 工程打包发布依赖"></a>Scala 工程打包发布依赖</h4><p>repo1.maven.org\maven2\org\scalaz\scalaz-core_2.12\7.2.14<br></p>
</div>
<div class="level is-mobile">
<div class="level-start">
<div class="level-item">
<a class="button is-size-7 is-light" href="/scala/20200221_maven_windows.html#more">阅读更多</a>
</div>
</div>
</div>
</div>
</div>
<div class="card">
<div class="card-image">
<a href="/scala/20200119_scala_single_object.html" class="image is-7by1">
<img class="thumbnail" src="http://source.jijing.site/thumbnails/toy3.jpg" alt="Scala 单例对象的三个应用">
</a>
</div>
<div class="card-content article ">
<div class="level article-meta is-size-7 is-uppercase is-mobile is-overflow-x-auto">
<div class="level-left">
<time class="level-item has-text-grey" datetime="2020-01-18T16:00:00.000Z">2020-01-19</time>
<div class="level-item">
<a class="has-link-grey -link" href="/categories/scala/">scala</a>
</div>
<span class="level-item has-text-grey">
9 分钟 读完 (大约 1336 个字)
</span>
</div>
</div>
<h1 class="title is-size-4 is-size-4-mobile has-text-weight-normal">
<a class="has-link-black-ter" href="/scala/20200119_scala_single_object.html">Scala 单例对象的三个应用</a>
</h1>
<div class="content">
<h3 id="一-进度条"><a href="#一-进度条" class="headerlink" title="一 进度条"></a>一 进度条</h3><p>有时候我们在编写代码时希望能够查看运行时间,最简单的方法:</p>
<figure class="highlight scala hljs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">main</span></span>(args: <span class="hljs-type">Array</span>[<span class="hljs-type">String</span>]) {</span><br><span class="line"> <span class="hljs-keyword">val</span> startTime: <span class="hljs-type">Long</span> = <span class="hljs-type">System</span>.currentTimeMillis</span><br><span class="line"> 待测试的代码块</span><br><span class="line"> <span class="hljs-keyword">val</span> endTime: <span class="hljs-type">Long</span> = <span class="hljs-type">System</span>.currentTimeMillis</span><br><span class="line"> <span class="hljs-type">System</span>.out.println(<span class="hljs-string">"程序运行时间: "</span> + (endTime - startTime) + <span class="hljs-string">"ms"</span>)</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
<p>但这个方法显然不是那么优雅。如果你在使用Scala的时候注意运行log,你会发下进度条更漂亮直观的。</p>
<figure class="highlight shell hljs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">[Runtime] SpinalHDL v1.3.9 git head : a4cb4aadf0820174c1b48023bfcd3e9981de1d4a</span><br><span class="line">[Runtime] JVM max memory : 1820.5MiB</span><br><span class="line">[Runtime] Current date : 2020.01.23 10:44:55</span><br><span class="line">[Progress] at 0.000 : Elaborate components</span><br><span class="line">[Progress] at 0.513 : Checks and transforms</span><br><span class="line">[Progress] at 0.705 : Generate Verilog</span><br><span class="line">[Done] at 0.806</span><br></pre></td></tr></table></figure>
<p>实现非常简单,首先得创建一个单例对象,单例对象一旦被实例化以后,startTime就会确定,不管Driver后面被调用多少次只会用到第一次被实例化的对象,startTime也不会改变。</p>
</div>
<div class="level is-mobile">
<div class="level-start">
<div class="level-item">
<a class="button is-size-7 is-light" href="/scala/20200119_scala_single_object.html#more">阅读更多</a>
</div>
</div>
</div>
</div>
</div>
<div class="card">
<div class="card-image">
<a href="/eda/install_verilator_on_windows.html" class="image is-7by1">
<img class="thumbnail" src="http://source.jijing.site/thumbnails/tools6.jpg" alt="Spinal-sim Verilator install on Windows">
</a>
</div>
<div class="card-content article ">
<div class="level article-meta is-size-7 is-uppercase is-mobile is-overflow-x-auto">
<div class="level-left">
<time class="level-item has-text-grey" datetime="2020-01-09T16:00:00.000Z">2020-01-10</time>
<div class="level-item">
<a class="has-link-grey -link" href="/categories/eda/">eda</a>
</div>
<span class="level-item has-text-grey">
7 分钟 读完 (大约 1017 个字)
</span>
</div>
</div>
<h1 class="title is-size-4 is-size-4-mobile has-text-weight-normal">
<a class="has-link-black-ter" href="/eda/install_verilator_on_windows.html">Spinal-sim Verilator install on Windows</a>
</h1>
<div class="content">
<h2 id="Verilator-install-on-Windows"><a href="#Verilator-install-on-Windows" class="headerlink" title="Verilator install on Windows"></a>Verilator install on Windows</h2><h3 id="Step1-install-MSYS32"><a href="#Step1-install-MSYS32" class="headerlink" title="Step1 : install MSYS32"></a>Step1 : install MSYS32</h3><p>到官网<a href="https://www.msys2.org/" target="_blank" rel="noopener">https://www.msys2.org/</a> 下载最近安装文件 msys2-x86_64-20190524.exe</p>
<p>运行安装到<code>d:/msys64</code>,安装完毕后打开 mingw64.exe</p>
<p>在命令行输入 <code>pacman -Suyy</code></p>
<p>如果遇到以下异常<br><figure class="highlight plain hljs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"># pacman -Syuu</span><br><span class="line">错误:无法初始化事务处理 (无法锁定数据库)</span><br><span class="line">错误:无法锁定数据库:File exists</span><br><span class="line"> 如果你确认软件包管理器没有在运行,</span><br><span class="line"> 你可以删除 /var/lib/pacman/db.lck。</span><br></pre></td></tr></table></figure></p>
<p>解决办法,删掉之前的文件: /var/lib/pacman/db.lck<br>出现错误的原因是,之前同步的时候,由于异常中断,导致之前进程锁文件未被释放。</p>
<h3 id="Step2-Change-mirrors-for-China-user"><a href="#Step2-Change-mirrors-for-China-user" class="headerlink" title="Step2 Change mirrors for China user"></a>Step2 Change mirrors for China user</h3><p>如果更新库很慢导致失败<br><figure class="highlight plain hljs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"># pacman -Syuu</span><br><span class="line">:: 正在同步软件包数据库...</span><br><span class="line">错误:无法从 repo.msys2.org : Operation too slow. Less than 1 bytes/sec transferred the last 10 seconds 获取文件 'mingw32.db'] 49%</span><br><span class="line">错误:无法从 sourceforge.net : Operation too slow. Less than 1 bytes/sec transferred the last 10 seconds 获取文件 'mingw32.db' 3%</span><br><span class="line">错误:无法从 www2.futureware.at : Operation too slow. Less than 1 bytes/sec transferred the last 10 seconds 获取文件 'mingw32.db'7%</span><br><span class="line">错误:无法从 mirror.yandex.ru : Operation too slow. Less than 1 bytes/sec transferred the last 10 seconds 获取文件 'mingw32.db' 10%</span><br><span class="line">错误:无法升级 mingw32 (下载数据库出错)</span><br></pre></td></tr></table></figure></p>
<p>请更新 <a href="https://mirrors.tuna.tsinghua.edu.cn/help/msys2/" target="_blank" rel="noopener">清华镜像</a></p>
<p>编辑 /etc/pacman.d/mirrorlist.mingw32 ,在文件开头添加:<br><figure class="highlight shell hljs"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">Server = https://mirrors.tuna.tsinghua.edu.cn/msys2/mingw/i686</span><br></pre></td></tr></table></figure></p>
<p>编辑 /etc/pacman.d/mirrorlist.mingw64 ,在文件开头添加:<br><figure class="highlight shell hljs"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">Server = https://mirrors.tuna.tsinghua.edu.cn/msys2/mingw/x86_64</span><br></pre></td></tr></table></figure></p>
<p>编辑 /etc/pacman.d/mirrorlist.msys ,在文件开头添加:<br><figure class="highlight shell hljs"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">Server = https://mirrors.tuna.tsinghua.edu.cn/msys2/msys/$arch</span><br></pre></td></tr></table></figure></p>
<p>然后执行 <code>pacman -Sy</code> 刷新软件包数据即可。</p>
<h3 id="Step3-Install-Verilator"><a href="#Step3-Install-Verilator" class="headerlink" title="Step3: Install Verilator"></a>Step3: Install Verilator</h3><figure class="highlight shell hljs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">pacman -Syuu</span><br><span class="line"><span class="hljs-meta">#</span><span class="hljs-bash">Close the MSYS2 shell once you<span class="hljs-string">'re asked to</span></span></span><br><span class="line">pacman -Syuu</span><br><span class="line">pacman -S --needed base-devel mingw-w64-x86_64-toolchain \</span><br><span class="line"> git flex\</span><br><span class="line"> mingw-w64-x86_64-cmake</span><br></pre></td></tr></table></figure>
<figure class="highlight shell hljs"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">pacman -S mingw-w64-x86_64-verilator</span><br></pre></td></tr></table></figure>
<h3 id="Step4-Add-to-ENV"><a href="#Step4-Add-to-ENV" class="headerlink" title="Step4: Add to ENV"></a>Step4: Add to ENV</h3><p>Add <code>D:\msys64\usr\bin;D:\msys64\mingw64\bin</code> to you windows PATH</p>
<h3 id="Step4-Spinal-simulation-by-verialtor"><a href="#Step4-Spinal-simulation-by-verialtor" class="headerlink" title="Step4: Spinal simulation by verialtor"></a>Step4: Spinal simulation by verialtor</h3><figure class="highlight shell hljs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line">[Progress] Verilator compilation started</span><br><span class="line">VDFT2Cell.mk:67: /mingw64/share/verilator/include/verilated.mk: No such file or directory</span><br><span class="line">make: *** No rule to make target '/mingw64/share/verilator/include/verilated.mk'. Stop.</span><br><span class="line">Exception in thread "main" java.lang.AssertionError: assertion failed: Verilator C++ model compilation failed</span><br><span class="line"> at scala.Predef$.assert(Predef.scala:170)</span><br><span class="line"> at spinal.sim.VerilatorBackend.compileVerilator(VerilatorBackend.scala:376)</span><br><span class="line"> at spinal.sim.VerilatorBackend.<init>(VerilatorBackend.scala:429)</span><br><span class="line"> at spinal.core.sim.SpinalVerilatorBackend$.apply(SimBootstraps.scala:120)</span><br><span class="line"> at spinal.core.sim.SpinalSimConfig.compile(SimBootstraps.scala:400)</span><br><span class="line"> at spinal.core.sim.SpinalSimConfig.compile(SimBootstraps.scala:364)</span><br><span class="line"> at FFT.DFT2CellTest$.main(FFTsim.scala:27)</span><br><span class="line"> at FFT.DFT2CellTest.main(FFTsim.scala)</span><br></pre></td></tr></table></figure>
<p>显示verilated.mk路径找不到,我忍为应该是VERILATOR_ROOT目录设置有误, 查找verilated.mk的目录所在地,<br>然后在windows Env 中添加系统变量 <code>VERILATOR_ROOT</code>= <code>/d/msys64/mingw64/share/verilator</code> </p>
<p>任然遇到问题<br><figure class="highlight plain hljs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">x86_64-w64-mingw32-g++.exe: error: /d/msys64/mingw64/share/verilator/include/verilated.cpp: No such file or directory</span><br><span class="line">x86_64-w64-mingw32-g++.exe: fatal error: no input files</span><br><span class="line">compilation terminated.</span><br><span class="line">make: *** [/d/msys64/mingw64/share/verilator/include/verilated.mk:192: verilated.o] Error 1</span><br><span class="line">make: *** Waiting for unfinished jobs....</span><br><span class="line">x86_64-w64-mingw32-g++.exe: error: /d/msys64/mingw64/share/verilator/include/verilated_vcd_c.cpp: No such file or directory</span><br><span class="line">x86_64-w64-mingw32-g++.exe: fatal error: no input files</span><br><span class="line">compilation terminated.</span><br><span class="line">Exception in thread "main" java.lang.AssertionError: assertion failed: Verilator C++ model compilation failed</span><br></pre></td></tr></table></figure></p>
<p>x86_64-w64-mingw32-g++.exe 不能访问/d/myss64/….,后来重新安装MSYS2到 C盘,并且将系统变量删除 <code>VERILATOR_ROOT</code></p>
<p>任然遇到问题:<br>检查环境变量Paht的值为<code>C:\Users\Administrator\.babun\cygwin\bin;D:\Program\emacs-26.2\bin;C:\Users\Administrator\.babun;C:\Users\Administrator\AppData\Roaming\npm;%IntelliJ IDEA Community Edition%;C:\Users\Administrator\AppData\Local\Pandoc\;c:\msys64\usr\bin\;c:\msys64\mingw64\bin\</code> 发现很乱 ,删除一些不用的<br><code>D:\Program\emacs-26.2\bin;C:\Users\Administrator\.babun;C:\Users\Administrator\AppData\Local\Pandoc\;c:\msys64\usr\bin\;c:\msys64\mingw64\bin\;</code><br>更新PATH</p>
<p>重新开启Project , 运行Spinal-sim ,Wow 居然成了, 非常痛苦, 饶了一大圈,居然是PATH变量的问题。总算是解决了</p>
<h3 id="最后:"><a href="#最后:" class="headerlink" title="最后:"></a>最后:</h3><p>特别注意:</p>
<p>尽量把MSYS2安装到C盘 在环境变量Path末尾追加C:\msys64\usr\bin;C:\msys64\mingw64\bin</p>
<p>不要多此一举设置VERILATOR_ROOT, Spinal会默认识别到 /mingw64/share/verilator</p>
<p>如果运行不成功,请检查你的PATH,设置是不是非常杂乱,请删除不用的,尽量保持干净。</p>
</div>
</div>
</div>
<div class="card">
<div class="card-image">
<a href="/others/float_trap.html" class="image is-7by1">
<img class="thumbnail" src="http://source.jijing.site/thumbnails/fail1.jpg" alt="浮点避坑">
</a>
</div>
<div class="card-content article ">
<div class="level article-meta is-size-7 is-uppercase is-mobile is-overflow-x-auto">
<div class="level-left">
<time class="level-item has-text-grey" datetime="2020-01-02T16:00:00.000Z">2020-01-03</time>
<div class="level-item">
<a class="has-link-grey -link" href="/categories/others/">others</a>
</div>
<span class="level-item has-text-grey">
5 分钟 读完 (大约 749 个字)
</span>
</div>
</div>
<h1 class="title is-size-4 is-size-4-mobile has-text-weight-normal">
<a class="has-link-black-ter" href="/others/float_trap.html">浮点避坑</a>
</h1>
<div class="content">
<h3 id="浮点数相加"><a href="#浮点数相加" class="headerlink" title="浮点数相加"></a>浮点数相加</h3><p>我们知道浮点数尽量避免不同量纲的数相加<br><figure class="highlight scala hljs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">> <span class="hljs-number">1023</span> + <span class="hljs-number">0.00000000000001</span></span><br><span class="line"><span class="hljs-type">Double</span> = <span class="hljs-number">1023.0</span></span><br></pre></td></tr></table></figure></p>
<h3 id="浮点数除法"><a href="#浮点数除法" class="headerlink" title="浮点数除法"></a>浮点数除法</h3><p>不同量纲之间的除法也会得到不一样的结果<br><figure class="highlight scala hljs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">> <span class="hljs-number">1.023</span>/<span class="hljs-number">2.047</span></span><br><span class="line"><span class="hljs-type">Double</span> = <span class="hljs-number">0.49975574010747426</span></span><br><span class="line">> <span class="hljs-number">1023.0</span>/<span class="hljs-number">2047.0</span></span><br><span class="line"><span class="hljs-type">Double</span> = <span class="hljs-number">0.49975574010747437</span></span><br></pre></td></tr></table></figure></p>
<p>因此对于有些应用可能引入意向不到的结果<br>比如<br><figure class="highlight scala hljs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">> <span class="hljs-number">1023.0</span>/<span class="hljs-number">2047.0</span>*<span class="hljs-number">2.047</span> == <span class="hljs-number">1.023</span></span><br><span class="line"><span class="hljs-type">Boolean</span> = <span class="hljs-literal">false</span></span><br><span class="line">> <span class="hljs-number">1023.0</span>/<span class="hljs-number">2047.0</span>*<span class="hljs-number">2047</span> == <span class="hljs-number">1023</span></span><br><span class="line"><span class="hljs-type">Boolean</span> = <span class="hljs-literal">true</span></span><br></pre></td></tr></table></figure></p>
<p>避免不同量纲的数做加减法,还要注意不同量纲的数做乘除法带来的意外结果</p>
<h3 id="典型的例子"><a href="#典型的例子" class="headerlink" title="典型的例子"></a>典型的例子</h3><figure class="highlight plain hljs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">0.3 - 0.1</span><br><span class="line">floor( 0.3*10 - 0.1 *10 ) //2.0</span><br><span class="line">floor((0.3 - 0.1)*10 ) //1.0</span><br></pre></td></tr></table></figure>
<h2 id="Double-Eps-精度"><a href="#Double-Eps-精度" class="headerlink" title="Double Eps 精度"></a>Double Eps 精度</h2><figure class="highlight plain hljs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">Float (B=2 / p=24): Eps = 2^(-24) = 5.9604644775390625E-8</span><br><span class="line">Double (B=2 / p=53): Eps = 2^(-53) = 1.1102230246251565E-16</span><br></pre></td></tr></table></figure>
<p>也就是说计算机能表示的最小绝对值<br><figure class="highlight plain hljs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">0+1E-16 = E-16</span><br><span class="line">1+1E-16 = 1.0</span><br></pre></td></tr></table></figure></p>
<p>他的精度跟指数位有关,总共E-16次方的误差范围,指数位占n位,那么误差就等与E(-16+n)<br><figure class="highlight plain hljs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">1000+1e-16= 1000.0</span><br><span class="line">1000+1e-15= 1000.0</span><br><span class="line">1000+1e-14= 1000.0</span><br><span class="line">1000+1e-13= 1000.0000000000001</span><br></pre></td></tr></table></figure></p>
<p>只要指数位和分数位之和不要超过16,都可以表示<br><figure class="highlight plain hljs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">1E10+1E-6 = 1.0000000000000002E10 //能表示1E-6不能表示</span><br><span class="line"></span><br><span class="line">1E10+1E-7 = 1.0E10 //误差1E-7不能表示</span><br><span class="line">1E8+1E-7 = 1.000000000000001E8 //指数位8,误差1E-7可以表示</span><br><span class="line">1000000 +1E-10 = 100000.0000000001 //可以表示1E-10</span><br><span class="line">10000000 +1E-10 = 10000000.0 //不能表示1E-10误差,指数位占了7</span><br><span class="line">1E18 + 13 = 1e18</span><br></pre></td></tr></table></figure></p>
<p>所以你在用浮点计算的时候,要看数的量纲,量纲越大,Eps要设置的大一些, 否则就失去了意义</p>
<p><a href="https://github.com/scala/bug/issues/3791#issuecomment-292385589" target="_blank" rel="noopener">Scala EPS</a></p>
<p>所以在判断一个数是否为0是, 不能 <code>a == 0</code> 而是要 <code>abs(a) <= Eps</code> ,<br>同样在比较两个数是否相等时,不能 <code>a == b</code> 而是要 <code>abs(a - b) <= Eps</code></p>
<h2 id="BigDecimal"><a href="#BigDecimal" class="headerlink" title="BigDecimal"></a>BigDecimal</h2><p>Double的问题是精度有限<br><figure class="highlight plain hljs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">val a = 0.02</span><br><span class="line">val b = 0.03</span><br><span class="line">val c = b - a</span><br></pre></td></tr></table></figure></p>
<p>c的结果不是0.01,而是c: Double = 0.009999999999999998<br>因此有些系统设计中不能用double,不如金融银行金额计算<br>为什么会这样呢? 因为float和double都是浮点数, 都有取值范围, 都有精度范围. 浮点数与通常使用的小数不同, 使用中, 往往难以确定.<br>常见的问题是定义了一个浮点数, 经过一系列的计算, 它本来应该等于某个确定值, 但实际上并不是!<br>double相减会转换成二进制,因double有效位数为 16位这就会出现存储小数位数不够的情况,这种情况下就会出现误差,解决方法就是使用BigDecimal,它的有效长度足够长可存储小数位数。<br>因此可代替double来进行加减乘除, 金额必须是完全精确的计算, 故不能使用double或者float, 而应该采用java.math.BigDecimal.<br><figure class="highlight plain hljs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">val a = BigDecimal(0.02)</span><br><span class="line">val b = BigDecimal(0.03)</span><br><span class="line">val c = b - a</span><br></pre></td></tr></table></figure></p>
<p>c的结果得到0.01</p>
<figure class="highlight plain hljs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">val a = BigInt("1234567890123456").toLong</span><br><span class="line">val b = 0.001</span><br><span class="line">val c = a + b</span><br></pre></td></tr></table></figure>
<p>c的值为1234567890123456,0.01丢失<br><figure class="highlight plain hljs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">val a = BigDecimal("1234567890123456")</span><br><span class="line">val b = BigDecimal(0.001)</span><br><span class="line">val c = a + b</span><br></pre></td></tr></table></figure></p>
<p>c的值为1234567890123456.001,精度并不会丢失</p>
<p>BigDecimal(value), value可以用数字初始化,太大的值只能用字符串初始化如“123456789012345678”</p>
<figure class="highlight plain hljs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">val a = BigDecimal("1234567890123456001")</span><br><span class="line">val b = BigDecimal(0.1231)</span><br><span class="line">val c = a * b </span><br><span class="line">c.precision</span><br><span class="line">c.rounded</span><br><span class="line">c.scale</span><br><span class="line">c.pow(2)</span><br></pre></td></tr></table></figure>
<figure class="highlight plain hljs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">val c= BigDecimal("1234.5000")</span><br><span class="line">c.doubleValue</span><br><span class="line">c.round(new java.math.MathContext(4, java.math.RoundingMode.HALF_UP))</span><br></pre></td></tr></table></figure>
</div>
</div>
</div>
<div class="card">
<div class="card-image">
<a href="/spinal/spinal-bootcamp.html" class="image is-7by1">
<img class="thumbnail" src="http://source.jijing.site/thumbnails/book1.jpg" alt="Spinal-Bootcamp 在线新手教程">
</a>
</div>
<div class="card-content article ">
<div class="level article-meta is-size-7 is-uppercase is-mobile is-overflow-x-auto">
<div class="level-left">
<time class="level-item has-text-grey" datetime="2019-12-31T16:00:00.000Z">2020-01-01</time>
<div class="level-item">
<a class="has-link-grey -link" href="/categories/spinal/">spinal</a>
</div>
<span class="level-item has-text-grey">
1 分钟 读完 (大约 211 个字)
</span>
</div>
</div>
<h1 class="title is-size-4 is-size-4-mobile has-text-weight-normal">
<a class="has-link-black-ter" href="/spinal/spinal-bootcamp.html">Spinal-Bootcamp 在线新手教程</a>
</h1>
<div class="content">
<p>最近花了点时间基于Jupyter-notebook做了一个SpinalHDL教程.<br>方便立即运行查看一个Spinal用法和对应生成的verilog代码,大多数例子来源于SpinalHDL的官方文档,也新增了一些实例和Scala的高级用法,这些可以帮助你理解SpinalHDL如何工作。</p>
<p>目前可以直接点击<a href="https://mybinder.org/v2/gh/jijingg/Spinal-bootcamp/binder" target="_blank" rel="noopener"><img src="https://mybinder.org/badge_logo.svg" alt="Binder"></a>运行,国内访问Binder速度有点慢,也可以<br>clone到本地运行。</p>
<p>为什么做这个事情</p>
<ul>
<li>提供一个SpinalHDL的在线环境,方便测试功能用法,直接查看verilog,而不用新建工程</li>
<li>提供一个Scala的在线环境,方便你测试一些Scala的用法</li>
</ul>
<p><img src="https://github.com/jijingg/Spinal-bootcamp/raw/dev/source/jupyter.png" alt="spinal-bootcamp"></p>
</div>
</div>
</div>
<div class="card">
<div class="card-image">
<a href="/spinal/spinal7.html" class="image is-7by1">
<img class="thumbnail" src="http://source.jijing.site/thumbnails/dirty2.jpg" alt="SpinalHDL(七):逢山开路-寄存器接口">
</a>
</div>
<div class="card-content article ">
<div class="level article-meta is-size-7 is-uppercase is-mobile is-overflow-x-auto">
<div class="level-left">
<time class="level-item has-text-grey" datetime="2019-12-04T16:00:00.000Z">2019-12-05</time>
<div class="level-item">
<a class="has-link-grey -link" href="/categories/spinal/">spinal</a>
</div>
<span class="level-item has-text-grey">
10 分钟 读完 (大约 1547 个字)
</span>
</div>
</div>
<h1 class="title is-size-4 is-size-4-mobile has-text-weight-normal">
<a class="has-link-black-ter" href="/spinal/spinal7.html">SpinalHDL(七):逢山开路-寄存器接口</a>
</h1>
<div class="content">
<p>目前大量存在手写寄存器接口的情况,对于几十个甚至几百个寄存器的IP,即便你有体力,也不能保证不犯错。<br><img src="https://pic4.zhimg.com/80/v2-e64f024ce11ee749a67a662238c2ccfd_hd.png" alt="70"></p>
<h3 id="存在的问题"><a href="#存在的问题" class="headerlink" title="存在的问题"></a>存在的问题</h3><ul>
<li>纯体力活,工作量繁重</li>
<li>容易引入错误,增加验证工作量</li>
<li>文档和代码不同步,增加软件调试工作量</li>
</ul>
<p>在这类问题上耗费测试debug时间非常不值当,只要你手写寄存器必然会遇到这了问题,软件调了好半天,最后发现文档跟代码不一致,<br>人是懒惰的,谁能完全保证代码更文档能同步更新,也肯定会犯错的,所以只能通过验证和测试来覆盖,如果问题能够越早发现,成本越低</p>
<p>这里分享二张图:</p>
<p>一张是某软件产品在各个阶段bug的成本<br><img src="https://pic3.zhimg.com/80/v2-079c46f56cc4b3f47ddea0a25b0ee9ae_hd.png" alt="71"></p>
<p>另外一张是IC开发各个阶段bug的成本<br><img src="https://pic3.zhimg.com/80/v2-bdd64827d05a463690a4155bcf96f879_hd.png" alt="72"></p>
<p>所以尽可能的在前期解决问题,第一次把事情做对,就是节约成本。</p>
</div>
<div class="level is-mobile">
<div class="level-start">
<div class="level-item">
<a class="button is-size-7 is-light" href="/spinal/spinal7.html#more">阅读更多</a>
</div>
</div>
</div>
</div>
</div>
<div class="card">
<div class="card-image">
<a href="/scala/20191121_scala3_Tasty.html" class="image is-7by1">
<img class="thumbnail" src="http://source.jijing.site/thumbnails/boxing1.jpg" alt="Scala3-Macro系统Tasty进展">
</a>
</div>
<div class="card-content article ">
<div class="level article-meta is-size-7 is-uppercase is-mobile is-overflow-x-auto">
<div class="level-left">
<time class="level-item has-text-grey" datetime="2019-11-20T16:00:00.000Z">2019-11-21</time>
<div class="level-item">
<a class="has-link-grey -link" href="/categories/scala/">scala</a>
</div>
<span class="level-item has-text-grey">
20 分钟 读完 (大约 3026 个字)
</span>
</div>
</div>
<h1 class="title is-size-4 is-size-4-mobile has-text-weight-normal">
<a class="has-link-black-ter" href="/scala/20191121_scala3_Tasty.html">Scala3-Macro系统Tasty进展</a>
</h1>
<div class="content">
<p>Scala3 重新设计Macro系统,这是官网<a href="https://www.scala-lang.org/blog/2018/04/30/in-a-nutshell.html" target="_blank" rel="noopener">英文原文</a>。<br>翻译的很烂,全当学习笔记而已,仅供参考</p>
<h2 id="Or-Scala-in-a-Tasty-Nutshell"><a href="#Or-Scala-in-a-Tasty-Nutshell" class="headerlink" title="Or: Scala in a (Tasty) Nutshell"></a>Or: Scala in a (Tasty) Nutshell</h2><p>如何迁移到 <a href="https://www.scala-lang.org/blog/2018/04/19/scala-3.html" target="_blank" rel="noopener">Scala 3</a>这篇博文中提到最大的一个问题是关于宏的问题。<br>目前我们正在努力将Tasty和macros对齐,接下来谈一谈我们的想法.</p>
<h2 id="What-is-Tasty"><a href="#What-is-Tasty" class="headerlink" title="What is Tasty?"></a>What is Tasty?</h2><p>Tasty是Scala3的高级交换格式。它基于类型化的抽象语法树<br>这些树在某种意义上包含了Scala程序中的所有信息。<br>它们表示程序的语法结构,还包含有关类型和位置的完整信息.<br>Tasty在语法检查之后(这样所有的类型都显式的知道了,并且隐式的东西都已经解释过了)给代码做一个快照,<br>但是在快照之前不会经过任何转换,因此所有的信息都不会丢失。<br>放语法树的文件为了紧凑会压缩优化(有点像javascript的压缩),这意味着我们可以在任何编译器运行期间<br>生成完整的Tasty语法树,即便是单独编译也不依赖任何其他东西。<br></p>
</div>
<div class="level is-mobile">
<div class="level-start">
<div class="level-item">
<a class="button is-size-7 is-light" href="/scala/20191121_scala3_Tasty.html#more">阅读更多</a>
</div>
</div>
</div>
</div>
</div>
<div class="card card-transparent">
<nav class="pagination is-centered" role="navigation" aria-label="pagination">
<div class="pagination-previous is-invisible is-hidden-mobile">
<a class="is-flex-grow has-text-black-ter" href="/page/0/">上一页</a>
</div>
<div class="pagination-next">
<a class="is-flex-grow has-text-black-ter" href="/page/2/">下一页</a>
</div>
<ul class="pagination-list is-hidden-mobile">
<li><a class="pagination-link is-current" href="/">1</a></li>
<li><a class="pagination-link has-text-black-ter" href="/page/2/">2</a></li>
<li><span class="pagination-ellipsis has-text-black-ter">…</span></li>
<li><a class="pagination-link has-text-black-ter" href="/page/6/">6</a></li>
</ul>
</nav>
</div>
</div>
<div class="column is-3-tablet is-3-desktop is-3-widescreen has-order-3 column-right ">
<div class="card widget">
<div class="card-content">
<div class="menu">
<h3 class="menu-label">
分类
</h3>
<ul class="menu-list">
<li>
<a class="level is-marginless" href="/categories/chisel/">
<span class="level-start">
<span class="level-item">chisel</span>
</span>
<span class="level-end">
<span class="level-item tag">8</span>
</span>
</a></li><li>
<a class="level is-marginless" href="/categories/eda/">
<span class="level-start">
<span class="level-item">eda</span>
</span>
<span class="level-end">
<span class="level-item tag">6</span>
</span>
</a></li><li>
<a class="level is-marginless" href="/categories/others/">
<span class="level-start">
<span class="level-item">others</span>
</span>
<span class="level-end">
<span class="level-item tag">7</span>
</span>
</a></li><li>
<a class="level is-marginless" href="/categories/riscv/">
<span class="level-start">
<span class="level-item">riscv</span>
</span>
<span class="level-end">
<span class="level-item tag">9</span>
</span>
</a></li><li>
<a class="level is-marginless" href="/categories/scala/">
<span class="level-start">
<span class="level-item">scala</span>
</span>
<span class="level-end">
<span class="level-item tag">8</span>
</span>
</a></li><li>
<a class="level is-marginless" href="/categories/sicp/">
<span class="level-start">
<span class="level-item">sicp</span>
</span>
<span class="level-end">
<span class="level-item tag">9</span>
</span>
</a></li><li>
<a class="level is-marginless" href="/categories/spinal/">
<span class="level-start">
<span class="level-item">spinal</span>
</span>
<span class="level-end">
<span class="level-item tag">9</span>
</span>
</a></li>
</ul>
</div>
</div>
</div>
<div class="card widget">
<div class="card-content">
<h3 class="menu-label">
最新文章
</h3>
<article class="media">
<a href="/spinal/spinal9.html" class="media-left">
<p class="image is-64x64">
<img class="thumbnail" src="http://source.jijing.site/thumbnails/busy4.jpg" alt="SpinalHDL(九):不变应万变-MemWrap适配">
</p>
</a>
<div class="media-content">
<div class="content">
<div><time class="has-text-grey is-size-7 is-uppercase" datetime="2020-07-29T16:00:00.000Z">2020-07-30</time></div>
<a href="/spinal/spinal9.html" class="has-link-black-ter is-size-6">SpinalHDL(九):不变应万变-MemWrap适配</a>
<p class="is-size-7 is-uppercase">
<a class="has-link-grey -link" href="/categories/spinal/">spinal</a>
</p>
</div>
</div>
</article>
<article class="media">
<a href="/spinal/spinal8.html" class="media-left">
<p class="image is-64x64">
<img class="thumbnail" src="http://source.jijing.site/thumbnails/chisel1.jpg" alt="SpinalHDL(八):开发仿真测试一条龙">