桁数が決まっていて、その桁に対するbitmaskを作成するプログラムをverilogで作った。
module bitmask(
input clk,
input reset_n,
input [5:0] val,
output reg [31:0] out_val
);
reg [5:0] index = 6'h0;
always @(posedge clk, negedge reset_n) begin
if (!reset_n) begin
out_val = 32'h0;
end else begin
out_val = 32'h1;
for(index=1;index<val;index=index+1) begin
out_val = (out_val<<1) | 1;
end
end
end
パラメータの説明だ。
- val 桁数
- out_val 桁数から作ったbitmaskだ。
forを使わずに、テーブル引きでも良いような気がするが。。。どっちがいいだろう。。。。
以下、valとout_valの組み合わせです。
1 1
2 3
3 7
4 f
5 1f
6 3f
7 7f
8 ff
9 1ff
10 3ff
11 7ff
12 fff
13 1fff
14 3fff
15 7fff
16 ffff
17 1ffff
18 3ffff
19 7ffff
20 fffff
21 1fffff
22 3fffff
23 7fffff
24 ffffff
25 1ffffff
26 3ffffff
27 7ffffff
28 fffffff
29 1fffffff
30 3fffffff
31 7fffffff
32 ffffffff
次は、verilator用のテストコードだ。
#include <iostream>
#include <verilated.h>
#include "Vbitmask.h"
#include <verilated_fst_c.h>
#include <math.h>
int time_counter = 0;
int main(int argc, char** argv) {
Verilated::commandArgs(argc, argv);
// Instantiate DUT
Vbitmask *dut = new Vbitmask();
// Trace DUMP ON
Verilated::traceEverOn(true);
VerilatedFstC* tfp = new VerilatedFstC;
dut->trace(tfp, 100); // Trace 100 levels of hierarchy
tfp->open("simx.fst");
// Format
dut->reset_n = 0;
dut->clk = 0;
// Reset Time
while (time_counter < 10) {
dut->eval();
tfp->dump(time_counter); // 波形ダンプ用の記述を追加
time_counter++;
}
// Release reset
dut->reset_n = 1;
dut->val=0;
while (time_counter < 74 && !Verilated::gotFinish()) {
dut->clk = !dut->clk; // Toggle clock
if (dut->clk)
dut->val++;
// Evaluate DUT
dut->eval();
if (dut->clk) {
printf("%d %x\n", dut->val, dut->out_val);
}
tfp->dump(time_counter); // 波形ダンプ用の記述を追加
time_counter++;
}
dut->final();
tfp->close();
}
作成したモジュールは、ここにおいている