VScodeで自分独自のスニペット登録したら便利だった


このエントリーをはてなブックマークに追加

自分でオリジナルのsnippetsを登録する

  • How to edit existing VS Code Snippets - Stack Overflow
  • Snippets in Visual Studio Code
  • メニューバーのCode –> Preferences –> User Snippets
    • 自分のものを登録したい場合は new
    • なにか言語のやつを登録したい場合はそれのjsonファイル
      • 例えばVerilogに登録したい場合は
      • verilog.json
      • に登録していく
  • 例えば・・・Verilog書くときのmoduleのsnippetなのだがデフォルトのextensionのやつだと, modで入力してtabキーすると
1
2
3
4
5
module (
);
endmodule //


  • と入力されるが、個人的には
1
2
3
module ();
endmodule;


  • と入力されるだけで十分
  • なので、verilog.jsonに下記を登録してやると

verilog.json

1
2
3
4
5
6
7
8
9
10
11
{
"module addition": {
"prefix": "module",
"body": [
"module $1();",
"\t$2",
"endmodule"
],
"description": "module snippets"
}
}
  • moduleと入力してtab補完してやると、のぞみ通りの動きになる
  • ちなみにこのsnippetのjsonの書き方は、下記を参考に
    • Snippets in Visual Studio Code
    • documentよくわからんが・・・
    • ひとまずjson中の \t は、タブを挿入するという意味で
    • $1 というのは、カーソルがそこにいくというやつで, $2 とかにすると、tabキーを2度押しするとそこに行く(2回なので$2 )


  • 例えば下記をjsonで登録するとどうなるかためしてみるとよい
1
2
3
4
5
6
7
8
9
10
11
12
13
{
"module addition": {
"prefix": "module",
"body": [
"module $1();",
"\t$2",
"\t$3",
"\t$4",
"endmodule"
],
"description": "module snippets"
}
}

このエントリーをはてなブックマークに追加

Verilogでtildaと!の違い


このエントリーをはてなブックマークに追加
  • boolean logic - What is the difference between Verilog ! and ~? - Stack Overflow
  • エクスクラメーションマーク exclamation mark !を使う場合
    • 例えば !xだと
    • xがゼロ以外の場合は !xはゼロまたはfalseになる
    • xがゼロの場合は 1(one) または trueになる
    • つまりエクスクラメーションマークはbooleanの論理否定になる
  • チルダ tilda ~を使う場合
    • 例えば16bitの x == 0xA5A5 があった場合
    • !x == 0x5A5A となる
    • つまり、チルダはビット反転になる
  • おそらく、2進数だとどちらも結果は変わらないが、2進数より大きい進数のときに違いが出てくる(たぶん)

このエントリーをはてなブックマークに追加

Verilogで半加算器、Icarusでシミュレート


このエントリーをはてなブックマークに追加
  • Icarus VerilogでシミュレートとVerilogの勉強
  • Full Adderってのが出てきてそもそもなんなのか調べてた
    • 日本語だと全加算器のことらしい
  • その前に、半加算器というのがあるっぽい
    • が、単純すぎて例がなかったのでコード書いてみた
    • できた、よかった


Full Adder

  • Full Adder in Digital Logic - GeeksforGeeks
  • 全加算器のこと
  • 半加算器と全加算器 Chap9
  • セレクタ
    • マルチプレクサとも呼ばれる
    • 多数の入力から、1つの入力を選択して出力する回路
    • 入力の選択は、通常2進数に対応するセレクト入力により決定される
    • 下記が視覚的にわかりやすい
    • データを選ぶ(セレクトする)からデータセレクタかなるほど
    • 状態によって、選べるデータが変えられるということだから・・・
      • たとえばAに値する部分を、暗闇センサーとかにしておいて
      • 入力信号を、エアコンのスイッチとかにしておけば
      • IoTが作れるのかなぁ~
    • あれか、キーボードの英語入力と日本語入力切り替えるみたいなイメージもかな
    • 反対に、一つの入力に対して複数の出力があって、制御信号によって1つの出力が選択されるやつはデマルチプレクサと呼ばれる
  • というか本題の半加算器と全加算器
    • 半加算器
      • 1bit と 1bit の加算を行う回路
      • 入力は2つ、出力はそのビット出力(Sum)と桁上り(Carry)の2つ
    • 全加算器
      • 1bit と 1bit の加算を行うのは一緒
      • ただし、入力が3つある
  • ふむ・・・
    • 半加算器
    • part10.pdf
    • 半加算器は、2つの入力で2つの出力
      • 繰り上がり
      • 加算結果
    • が出力可能
    • しかし、これだと何桁もの計算というのはできない
      • 何桁もやろうとすると、それぞれで生じた繰り上がりを再び処理する必要があるため
  • 半加算器をVerilogで実装してみる, さらにicarus verilogでシミュレートしてみる
  • Verilog HDLによる組合せ論理回路の設計(授業用) - Qiita
    • carryは英語で桁上りのことをあらわす
    • 桁上り部分の出力なので carry out, cout
    • あとは加算結果なので A (answer?)


halfadder.v

1
2
3
4
5
6
7
8
9
10
11
module halfadder(
input x,
input y,
output A,
output cout
);
assign cout = x & y;
assign A = x ^ y;
endmodule // halfadder


halfadder_test.v

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
`timescale 1ns/1ns
module halfadder_test();
reg input1;
reg input2;
wire out;
wire carryout;
halfadder uut(
.x(input1),
.y(input2),
.A(out),
.cout(carryout)
);
initial begin
input1 = 0;
input2 = 0;
end
initial begin
forever begin
#5 input1 = $random;
end
end
initial begin
forever begin
#5 input2 = $random;
end
end
initial begin
#100 $finish();
end
initial begin
$monitor("time=%2d, IN1=%1b, IN2=%1b, CarryOut=%1b, OUT=%1b", $time, input1, input2, carryout, out);
$dumpfile("halfadder.vcd");
$dumpvars(0, halfadder_test);
end
endmodule

このエントリーをはてなブックマークに追加

Verilogで自作のprimitiveを定義する


このエントリーをはてなブックマークに追加

user define primitive


  • Verilogにおいてprimitiveとは
  • どうやら、基本ゲートやスイッチのことっぽい
    • AND, NAND, OR, XOR, XNORなどそのへんが含まれる
    • スイッチもなので、cmosとかそのへんも含まれる
    • らしい


  • で、Verilogではプリミティブは自分でも定義?することができるっぽい
  • 定義する際は、primitive endprimitive で囲う

myprimitivexnor.v

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
`timescale 1ns/1ns
module udpcomparator(
input x,
input y,
output z
);
udpcompare c0(z, x, y);
endmodule
primitive udpcompare(out, in1, in2);
output out;
input in1, in2;
// define XNOR Gate
table
// in1 in2 : out
0 0 : 1;
0 1 : 0;
1 0 : 0;
1 1 : 1;
endtable
endprimitive


myprimitivexnor_test.v

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
`timescale 1ns/1ns
module udptest();
reg x;
reg y;
wire z;
// instantiate the unit under test(uut)
udpcomparator uut (
.x(x),
.y(y),
.z(z)
);
initial begin
x = 0;
y = 0;
end
initial begin
#100;
#50 x = 1;
#60 y = 1;
#70 y = 1;
#80 x = 0;
end
initial begin
$monitor("x=%d, y=%d, z=%d \n", x,y,z);
$dumpfile("udpcomparator.vcd");
$dumpvars(0, udptest);
end
endmodule
  • ちなみにtableで使用できるsymbolは 0 1 だけじゃなくて色々あるっぽい

このエントリーをはてなブックマークに追加

icarus verilogでGate Level Modeling


このエントリーをはてなブックマークに追加

gate level modeling

gatelevel.v

1
2
3
4
5
6
7
8
9
10
11
12
13
module gates (
input a_input,
input b_input,
output c_and,
output d_or,
output e_xor
);
and (c_and, a_input, b_input); // c is the output, a and b are inputs
or (d_or, a_input, b_input); // d is the output, a and b are inputs
xor (e_xor, a_input, b_input); // e is the output, a and b are inputs
endmodule


gatelevel_test.v

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
module gatelevel();
//input
reg a;
reg b;
// output
wire c;
wire d;
wire e;
gates uut (
.a_input(a),
.b_input(b),
.c_and(c),
.d_or(d),
.e_xor(e)
);
integer i;
initial begin
a = 0;
b = 0;
end
initial begin
for (i=0; i<20; i=i+1) begin
#1 a <= $random;
b <= $random;
end
end
initial begin
// #200 $finish();
$monitor("t=%0t, a=%0b, c=%0b, c(and)=%0b, d(or)=%0b, e(xor)=%0b \n", $time, a, b, c, d, e);
$dumpfile("gatelevel.vcd");
$dumpvars(0, gatelevel);
end
endmodule // gate

このエントリーをはてなブックマークに追加

Verilogでシンプルなforeverループ


このエントリーをはてなブックマークに追加
  • Icarus Verilogで単純なループ処理
  • もとのコードは下記チュートリアルをやってみて、ループさせるとどんなものかみたかった
  • Verilog Tutorial with ICarus| Verification

comparator.v

1
2
3
4
5
6
7
8
9
module comparator(
input x,
input y,
output z
);
assign z = (-x & -y) | (x & y);
endmodule


comparator_test.v

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
`timescale 1ns / 1ns
module stimulus();
// input
reg x;
reg y;
// output
wire z;
// instantiate the unit under test (uut)
comparator uut (
.x(x),
.y(y),
.z(z)
);
integer period;
initial begin
x = 0;
y = 0;
period = 10;
end
initial begin
forever begin
#(period/3) x=~x;
#(period/3) x=~x;
end
end
initial begin
forever begin
#(period/2) y=~y;
#(period/2) y=~y;
end
end
initial begin
#100 $finish();
end
initial begin
$monitor("x=%d, y=%d, z=%d \n", x, y, z);
$dumpfile("comparatorsecond.vcd");
$dumpvars(0, stimulus);
end
endmodule // stimulus

このエントリーをはてなブックマークに追加

入門mruby Cからmruby APIを使いこなす p22 mrb_fixnum_plusではなく mrb_num_plus


このエントリーをはてなブックマークに追加

Yamanekkoさんの入門mrubyの本読んでる
『入門mruby Cからmruby APIを使いこなす』(Yamanekko 著) - 達人出版会BOOTH支店 - BOOTH

p22のplus.c

13行目にmrb_fixnum_plus(mrb, n1, n2); が使われているが mrb_fixnum_plusは最新のmrubyではつかわれておらず

mrb_num_plusに変わったらしい

Make unused functions private. · mruby/mruby@237a57b

というわけで足し算は下記でできる

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <mruby.h>
#include <mruby/compile.h>
#include <mruby/numeric.h>
int main(void){
mrb_value val;
mrb_state *mrb = mrb_open();
mrb_value n1;
mrb_value n2;
mrb_int a = 12;
mrb_int b = 24;
n1 = mrb_fixnum_value(a);
n2 = mrb_fixnum_value(b);
val = mrb_num_plus(mrb, n1, n2);
mrb_p(mrb, val);
mrb_close(mrb);
return 0;
}

割り算の mrb_num_divもなくなったっぽいが、わからないのでとりあえず省略した


このエントリーをはてなブックマークに追加

Icarus Verilog でFizzBuzz


このエントリーをはてなブックマークに追加
  • Icarus Verilogをやってみた
  • FizzBuzzっぽいものをかいてみた
  • こんな感じか?


mytest.v

1
2
3
4
5
6
module mytest(fizz,buzz);
input fizz, buzz;
output out, fizzbuzz;
assign out = ~fizz & ~buzz;
assign fizzbuzz = fizz & buzz;
endmodule


mytest_test.v

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
module top();
wire out;
reg a,b;
mytest mytest_instance(a,b);
initial begin
a = 0;
forever begin
#2 a=~a;
#1 a=~a;
end
end
initial begin
b = 0;
forever begin
#4 b=~b;
#1 b=~b;
end
end
initial begin
#100 $finish();
end
initial begin
$dumpfile("mytest_test.vcd");
$dumpvars(0, mytest_instance);
end
endmodule

このエントリーをはてなブックマークに追加