diff --git a/README.md b/README.md index f41259c6..48089142 100644 --- a/README.md +++ b/README.md @@ -69,8 +69,8 @@ sudo apt install iverilog - Jinja2: 2.10 or later - pytest: 3.2 or later - pytest-pythonpath: 0.7 or later -- Pyverilog: 1.1.2 or later -- IPgen: 1.0.0 or later +- Pyverilog: 1.1.3 or later +- IPgen: 1.0.1 or later ``` pip3 install jinja2 pytest pytest-pythonpath pyverilog ipgen diff --git a/README.rst b/README.rst index ed9a3db6..e944b87a 100644 --- a/README.rst +++ b/README.rst @@ -74,8 +74,8 @@ Requirements - Jinja2: 2.10 or later - pytest: 3.2 or later - pytest-pythonpath: 0.7 or later -- Pyverilog: 1.1.2 or later -- IPgen: 1.0.0 or later +- Pyverilog: 1.1.3 or later +- IPgen: 1.0.1 or later :: diff --git a/setup.py b/setup.py index 1ab64293..7d17e978 100644 --- a/setup.py +++ b/setup.py @@ -5,7 +5,7 @@ def read(filename): - return open(os.path.join(os.path.dirname(__file__), filename)).read() + return open(os.path.join(os.path.dirname(__file__), filename), encoding='utf8').read() m = re.search(r'(\d+\.\d+\.\d+(-.+)?)', @@ -23,7 +23,7 @@ def read(filename): packages=find_packages(), package_data={'veriloggen.utils': ['VERSION'], 'veriloggen.simulation': ['*.cpp'], }, - install_requires=['pyverilog>=1.1.2', 'ipgen>=1.0.0', 'Jinja2>=2.10'], + install_requires=['pyverilog>=1.1.3', 'ipgen>=1.0.1', 'Jinja2>=2.10'], extras_require={ 'graph': ['pygraphviz>=1.3.1'], 'test': ['pytest>=3.2', 'pytest-pythonpath>=0.7'], diff --git a/tests/extension/thread_/fixed_const/test_thread_fixed_const.py b/tests/extension/thread_/fixed_const/test_thread_fixed_const.py index a6850ff0..e534e88a 100644 --- a/tests/extension/thread_/fixed_const/test_thread_fixed_const.py +++ b/tests/extension/thread_/fixed_const/test_thread_fixed_const.py @@ -110,7 +110,7 @@ end end th_blink_5: begin - _th_blink_next_val_1 <= _th_blink_next_val_1 + 256; + _th_blink_next_val_1 <= _th_blink_next_val_1 + 'sd128; th_blink <= th_blink_6; end th_blink_6: begin diff --git a/tests/extension/thread_/fixed_const/thread_fixed_const.py b/tests/extension/thread_/fixed_const/thread_fixed_const.py index 3fc0b820..40531ad5 100644 --- a/tests/extension/thread_/fixed_const/thread_fixed_const.py +++ b/tests/extension/thread_/fixed_const/thread_fixed_const.py @@ -29,8 +29,8 @@ def blink(times): led.value = 0 next_val = vthread.fixed.FixedConst(0, 8) for i in range(times): - next_val = next_val + 1 - led.value = next_val + next_val = next_val + vthread.fixed.FixedConst(0.5, 8) + led.value = next_val.int_part print("led = ", led) th = vthread.Thread(m, 'th_blink', clk, rst, blink) diff --git a/tests/extension/thread_/ram_initval/Makefile b/tests/extension/thread_/fixed_ram_initvals/Makefile similarity index 100% rename from tests/extension/thread_/ram_initval/Makefile rename to tests/extension/thread_/fixed_ram_initvals/Makefile diff --git a/tests/extension/thread_/fixed_ram_initvals/test_thread_fixed_ram_initvals.py b/tests/extension/thread_/fixed_ram_initvals/test_thread_fixed_ram_initvals.py new file mode 100644 index 00000000..c71a7f0d --- /dev/null +++ b/tests/extension/thread_/fixed_ram_initvals/test_thread_fixed_ram_initvals.py @@ -0,0 +1,1398 @@ +from __future__ import absolute_import +from __future__ import print_function +import veriloggen +import thread_fixed_ram_initvals + +expected_verilog = """ +module test; + + reg CLK; + reg RST; + + blinkled + uut + ( + .CLK(CLK), + .RST(RST) + ); + + + initial begin + $dumpfile("uut.vcd"); + $dumpvars(0, uut); + end + + + initial begin + CLK = 0; + forever begin + #5 CLK = !CLK; + end + end + + + initial begin + RST = 0; + #100; + RST = 1; + #100; + RST = 0; + #10000; + $finish; + end + + +endmodule + + + +module blinkled +( + input CLK, + input RST +); + + reg [10-1:0] myram_0_addr; + wire [32-1:0] myram_0_rdata; + reg [32-1:0] myram_0_wdata; + reg myram_0_wenable; + + myram + inst_myram + ( + .CLK(CLK), + .myram_0_addr(myram_0_addr), + .myram_0_rdata(myram_0_rdata), + .myram_0_wdata(myram_0_wdata), + .myram_0_wenable(myram_0_wenable) + ); + + reg [32-1:0] th_blink; + localparam th_blink_init = 0; + reg signed [32-1:0] _th_blink_times_0; + reg signed [32-1:0] _th_blink_i_1; + reg _tmp_0; + reg _myram_cond_0_1; + reg _myram_cond_1_1; + reg _myram_cond_1_2; + reg signed [32-1:0] _tmp_1; + wire signed [32-1:0] _tmp_fixed_0; + assign _tmp_fixed_0 = _tmp_1; + reg signed [32-1:0] _th_blink_rdata_2; + reg _tmp_2; + reg _myram_cond_2_1; + reg _myram_cond_3_1; + reg _myram_cond_3_2; + reg signed [32-1:0] _tmp_3; + wire signed [32-1:0] _tmp_fixed_1; + assign _tmp_fixed_1 = _tmp_3; + reg signed [32-1:0] _th_blink_b_3; + reg signed [33-1:0] _th_blink_wdata_4; + reg _myram_cond_4_1; + reg signed [32-1:0] _th_blink_sum_5; + reg _tmp_4; + reg _myram_cond_5_1; + reg _myram_cond_6_1; + reg _myram_cond_6_2; + reg signed [32-1:0] _tmp_5; + wire signed [32-1:0] _tmp_fixed_2; + assign _tmp_fixed_2 = _tmp_5; + + always @(posedge CLK) begin + if(RST) begin + myram_0_addr <= 0; + _myram_cond_0_1 <= 0; + _tmp_0 <= 0; + _myram_cond_1_1 <= 0; + _myram_cond_1_2 <= 0; + _myram_cond_2_1 <= 0; + _tmp_2 <= 0; + _myram_cond_3_1 <= 0; + _myram_cond_3_2 <= 0; + myram_0_wdata <= 0; + myram_0_wenable <= 0; + _myram_cond_4_1 <= 0; + _myram_cond_5_1 <= 0; + _tmp_4 <= 0; + _myram_cond_6_1 <= 0; + _myram_cond_6_2 <= 0; + end else begin + if(_myram_cond_1_2) begin + _tmp_0 <= 0; + end + if(_myram_cond_3_2) begin + _tmp_2 <= 0; + end + if(_myram_cond_6_2) begin + _tmp_4 <= 0; + end + if(_myram_cond_0_1) begin + _tmp_0 <= 1; + end + _myram_cond_1_2 <= _myram_cond_1_1; + if(_myram_cond_2_1) begin + _tmp_2 <= 1; + end + _myram_cond_3_2 <= _myram_cond_3_1; + if(_myram_cond_4_1) begin + myram_0_wenable <= 0; + end + if(_myram_cond_5_1) begin + _tmp_4 <= 1; + end + _myram_cond_6_2 <= _myram_cond_6_1; + if(th_blink == 3) begin + myram_0_addr <= _th_blink_i_1; + end + _myram_cond_0_1 <= th_blink == 3; + _myram_cond_1_1 <= th_blink == 3; + if(th_blink == 9) begin + myram_0_addr <= _th_blink_i_1; + end + _myram_cond_2_1 <= th_blink == 9; + _myram_cond_3_1 <= th_blink == 9; + if(th_blink == 13) begin + myram_0_addr <= _th_blink_i_1; + myram_0_wdata <= _th_blink_wdata_4; + myram_0_wenable <= 1; + end + _myram_cond_4_1 <= th_blink == 13; + if(th_blink == 19) begin + myram_0_addr <= _th_blink_i_1; + end + _myram_cond_5_1 <= th_blink == 19; + _myram_cond_6_1 <= th_blink == 19; + end + end + + localparam th_blink_1 = 1; + localparam th_blink_2 = 2; + localparam th_blink_3 = 3; + localparam th_blink_4 = 4; + localparam th_blink_5 = 5; + localparam th_blink_6 = 6; + localparam th_blink_7 = 7; + localparam th_blink_8 = 8; + localparam th_blink_9 = 9; + localparam th_blink_10 = 10; + localparam th_blink_11 = 11; + localparam th_blink_12 = 12; + localparam th_blink_13 = 13; + localparam th_blink_14 = 14; + localparam th_blink_15 = 15; + localparam th_blink_16 = 16; + localparam th_blink_17 = 17; + localparam th_blink_18 = 18; + localparam th_blink_19 = 19; + localparam th_blink_20 = 20; + localparam th_blink_21 = 21; + localparam th_blink_22 = 22; + localparam th_blink_23 = 23; + localparam th_blink_24 = 24; + localparam th_blink_25 = 25; + + always @(posedge CLK) begin + if(RST) begin + th_blink <= th_blink_init; + _th_blink_times_0 <= 0; + _th_blink_i_1 <= 0; + _tmp_1 <= 0; + _tmp_3 <= 0; + _tmp_5 <= 0; + end else begin + case(th_blink) + th_blink_init: begin + _th_blink_times_0 <= 10; + th_blink <= th_blink_1; + end + th_blink_1: begin + _th_blink_i_1 <= 0; + th_blink <= th_blink_2; + end + th_blink_2: begin + if(_th_blink_i_1 < _th_blink_times_0) begin + th_blink <= th_blink_3; + end else begin + th_blink <= th_blink_7; + end + end + th_blink_3: begin + if(_tmp_0) begin + _tmp_1 <= myram_0_rdata; + end + if(_tmp_0) begin + th_blink <= th_blink_4; + end + end + th_blink_4: begin + _th_blink_rdata_2 <= _tmp_fixed_0; + th_blink <= th_blink_5; + end + th_blink_5: begin + $display("rdata = %f", ($itor(_th_blink_rdata_2) / 256.0)); + th_blink <= th_blink_6; + end + th_blink_6: begin + _th_blink_i_1 <= _th_blink_i_1 + 1; + th_blink <= th_blink_2; + end + th_blink_7: begin + _th_blink_i_1 <= 0; + th_blink <= th_blink_8; + end + th_blink_8: begin + if(_th_blink_i_1 < _th_blink_times_0) begin + th_blink <= th_blink_9; + end else begin + th_blink <= th_blink_16; + end + end + th_blink_9: begin + if(_tmp_2) begin + _tmp_3 <= myram_0_rdata; + end + if(_tmp_2) begin + th_blink <= th_blink_10; + end + end + th_blink_10: begin + _th_blink_rdata_2 <= _tmp_fixed_1; + th_blink <= th_blink_11; + end + th_blink_11: begin + _th_blink_b_3 <= 'sd64; + th_blink <= th_blink_12; + end + th_blink_12: begin + _th_blink_wdata_4 <= _th_blink_rdata_2 + _th_blink_b_3; + th_blink <= th_blink_13; + end + th_blink_13: begin + th_blink <= th_blink_14; + end + th_blink_14: begin + $display("wdata = %f", ($itor(_th_blink_wdata_4) / 256.0)); + th_blink <= th_blink_15; + end + th_blink_15: begin + _th_blink_i_1 <= _th_blink_i_1 + 1; + th_blink <= th_blink_8; + end + th_blink_16: begin + _th_blink_sum_5 <= 'sd0; + th_blink <= th_blink_17; + end + th_blink_17: begin + _th_blink_i_1 <= 0; + th_blink <= th_blink_18; + end + th_blink_18: begin + if(_th_blink_i_1 < _th_blink_times_0) begin + th_blink <= th_blink_19; + end else begin + th_blink <= th_blink_24; + end + end + th_blink_19: begin + if(_tmp_4) begin + _tmp_5 <= myram_0_rdata; + end + if(_tmp_4) begin + th_blink <= th_blink_20; + end + end + th_blink_20: begin + _th_blink_rdata_2 <= _tmp_fixed_2; + th_blink <= th_blink_21; + end + th_blink_21: begin + $display("rdata = %f", ($itor(_th_blink_rdata_2) / 256.0)); + th_blink <= th_blink_22; + end + th_blink_22: begin + _th_blink_sum_5 <= _th_blink_sum_5 + _th_blink_rdata_2; + th_blink <= th_blink_23; + end + th_blink_23: begin + _th_blink_i_1 <= _th_blink_i_1 + 1; + th_blink <= th_blink_18; + end + th_blink_24: begin + $display("sum = %f", ($itor(_th_blink_sum_5) / 256.0)); + th_blink <= th_blink_25; + end + endcase + end + end + + +endmodule + + + +module myram +( + input CLK, + input [10-1:0] myram_0_addr, + output [32-1:0] myram_0_rdata, + input [32-1:0] myram_0_wdata, + input myram_0_wenable +); + + reg [10-1:0] myram_0_daddr; + reg [32-1:0] mem [0:1024-1]; + + initial begin + mem[0] = 32'ha00; + mem[1] = 32'ha80; + mem[2] = 32'hb00; + mem[3] = 32'hb80; + mem[4] = 32'hc00; + mem[5] = 32'hc80; + mem[6] = 32'hd00; + mem[7] = 32'hd80; + mem[8] = 32'he00; + mem[9] = 32'he80; + mem[10] = 32'hf00; + mem[11] = 32'hf80; + mem[12] = 32'h1000; + mem[13] = 32'h1080; + mem[14] = 32'h1100; + mem[15] = 32'h1180; + mem[16] = 32'h1200; + mem[17] = 32'h1280; + mem[18] = 32'h1300; + mem[19] = 32'h1380; + mem[20] = 32'h1400; + mem[21] = 32'h1480; + mem[22] = 32'h1500; + mem[23] = 32'h1580; + mem[24] = 32'h1600; + mem[25] = 32'h1680; + mem[26] = 32'h1700; + mem[27] = 32'h1780; + mem[28] = 32'h1800; + mem[29] = 32'h1880; + mem[30] = 32'h1900; + mem[31] = 32'h1980; + mem[32] = 32'h1a00; + mem[33] = 32'h1a80; + mem[34] = 32'h1b00; + mem[35] = 32'h1b80; + mem[36] = 32'h1c00; + mem[37] = 32'h1c80; + mem[38] = 32'h1d00; + mem[39] = 32'h1d80; + mem[40] = 32'h1e00; + mem[41] = 32'h1e80; + mem[42] = 32'h1f00; + mem[43] = 32'h1f80; + mem[44] = 32'h2000; + mem[45] = 32'h2080; + mem[46] = 32'h2100; + mem[47] = 32'h2180; + mem[48] = 32'h2200; + mem[49] = 32'h2280; + mem[50] = 32'h2300; + mem[51] = 32'h2380; + mem[52] = 32'h2400; + mem[53] = 32'h2480; + mem[54] = 32'h2500; + mem[55] = 32'h2580; + mem[56] = 32'h2600; + mem[57] = 32'h2680; + mem[58] = 32'h2700; + mem[59] = 32'h2780; + mem[60] = 32'h2800; + mem[61] = 32'h2880; + mem[62] = 32'h2900; + mem[63] = 32'h2980; + mem[64] = 32'h2a00; + mem[65] = 32'h2a80; + mem[66] = 32'h2b00; + mem[67] = 32'h2b80; + mem[68] = 32'h2c00; + mem[69] = 32'h2c80; + mem[70] = 32'h2d00; + mem[71] = 32'h2d80; + mem[72] = 32'h2e00; + mem[73] = 32'h2e80; + mem[74] = 32'h2f00; + mem[75] = 32'h2f80; + mem[76] = 32'h3000; + mem[77] = 32'h3080; + mem[78] = 32'h3100; + mem[79] = 32'h3180; + mem[80] = 32'h3200; + mem[81] = 32'h3280; + mem[82] = 32'h3300; + mem[83] = 32'h3380; + mem[84] = 32'h3400; + mem[85] = 32'h3480; + mem[86] = 32'h3500; + mem[87] = 32'h3580; + mem[88] = 32'h3600; + mem[89] = 32'h3680; + mem[90] = 32'h3700; + mem[91] = 32'h3780; + mem[92] = 32'h3800; + mem[93] = 32'h3880; + mem[94] = 32'h3900; + mem[95] = 32'h3980; + mem[96] = 32'h3a00; + mem[97] = 32'h3a80; + mem[98] = 32'h3b00; + mem[99] = 32'h3b80; + mem[100] = 32'h3c00; + mem[101] = 32'h3c80; + mem[102] = 32'h3d00; + mem[103] = 32'h3d80; + mem[104] = 32'h3e00; + mem[105] = 32'h3e80; + mem[106] = 32'h3f00; + mem[107] = 32'h3f80; + mem[108] = 32'h4000; + mem[109] = 32'h4080; + mem[110] = 32'h4100; + mem[111] = 32'h4180; + mem[112] = 32'h4200; + mem[113] = 32'h4280; + mem[114] = 32'h4300; + mem[115] = 32'h4380; + mem[116] = 32'h4400; + mem[117] = 32'h4480; + mem[118] = 32'h4500; + mem[119] = 32'h4580; + mem[120] = 32'h4600; + mem[121] = 32'h4680; + mem[122] = 32'h4700; + mem[123] = 32'h4780; + mem[124] = 32'h4800; + mem[125] = 32'h4880; + mem[126] = 32'h4900; + mem[127] = 32'h4980; + mem[128] = 32'h4a00; + mem[129] = 32'h4a80; + mem[130] = 32'h4b00; + mem[131] = 32'h4b80; + mem[132] = 32'h4c00; + mem[133] = 32'h4c80; + mem[134] = 32'h4d00; + mem[135] = 32'h4d80; + mem[136] = 32'h4e00; + mem[137] = 32'h4e80; + mem[138] = 32'h4f00; + mem[139] = 32'h4f80; + mem[140] = 32'h5000; + mem[141] = 32'h5080; + mem[142] = 32'h5100; + mem[143] = 32'h5180; + mem[144] = 32'h5200; + mem[145] = 32'h5280; + mem[146] = 32'h5300; + mem[147] = 32'h5380; + mem[148] = 32'h5400; + mem[149] = 32'h5480; + mem[150] = 32'h5500; + mem[151] = 32'h5580; + mem[152] = 32'h5600; + mem[153] = 32'h5680; + mem[154] = 32'h5700; + mem[155] = 32'h5780; + mem[156] = 32'h5800; + mem[157] = 32'h5880; + mem[158] = 32'h5900; + mem[159] = 32'h5980; + mem[160] = 32'h5a00; + mem[161] = 32'h5a80; + mem[162] = 32'h5b00; + mem[163] = 32'h5b80; + mem[164] = 32'h5c00; + mem[165] = 32'h5c80; + mem[166] = 32'h5d00; + mem[167] = 32'h5d80; + mem[168] = 32'h5e00; + mem[169] = 32'h5e80; + mem[170] = 32'h5f00; + mem[171] = 32'h5f80; + mem[172] = 32'h6000; + mem[173] = 32'h6080; + mem[174] = 32'h6100; + mem[175] = 32'h6180; + mem[176] = 32'h6200; + mem[177] = 32'h6280; + mem[178] = 32'h6300; + mem[179] = 32'h6380; + mem[180] = 32'h6400; + mem[181] = 32'h6480; + mem[182] = 32'h6500; + mem[183] = 32'h6580; + mem[184] = 32'h6600; + mem[185] = 32'h6680; + mem[186] = 32'h6700; + mem[187] = 32'h6780; + mem[188] = 32'h6800; + mem[189] = 32'h6880; + mem[190] = 32'h6900; + mem[191] = 32'h6980; + mem[192] = 32'h6a00; + mem[193] = 32'h6a80; + mem[194] = 32'h6b00; + mem[195] = 32'h6b80; + mem[196] = 32'h6c00; + mem[197] = 32'h6c80; + mem[198] = 32'h6d00; + mem[199] = 32'h6d80; + mem[200] = 32'h6e00; + mem[201] = 32'h6e80; + mem[202] = 32'h6f00; + mem[203] = 32'h6f80; + mem[204] = 32'h7000; + mem[205] = 32'h7080; + mem[206] = 32'h7100; + mem[207] = 32'h7180; + mem[208] = 32'h7200; + mem[209] = 32'h7280; + mem[210] = 32'h7300; + mem[211] = 32'h7380; + mem[212] = 32'h7400; + mem[213] = 32'h7480; + mem[214] = 32'h7500; + mem[215] = 32'h7580; + mem[216] = 32'h7600; + mem[217] = 32'h7680; + mem[218] = 32'h7700; + mem[219] = 32'h7780; + mem[220] = 32'h7800; + mem[221] = 32'h7880; + mem[222] = 32'h7900; + mem[223] = 32'h7980; + mem[224] = 32'h7a00; + mem[225] = 32'h7a80; + mem[226] = 32'h7b00; + mem[227] = 32'h7b80; + mem[228] = 32'h7c00; + mem[229] = 32'h7c80; + mem[230] = 32'h7d00; + mem[231] = 32'h7d80; + mem[232] = 32'h7e00; + mem[233] = 32'h7e80; + mem[234] = 32'h7f00; + mem[235] = 32'h7f80; + mem[236] = 32'h8000; + mem[237] = 32'h8080; + mem[238] = 32'h8100; + mem[239] = 32'h8180; + mem[240] = 32'h8200; + mem[241] = 32'h8280; + mem[242] = 32'h8300; + mem[243] = 32'h8380; + mem[244] = 32'h8400; + mem[245] = 32'h8480; + mem[246] = 32'h8500; + mem[247] = 32'h8580; + mem[248] = 32'h8600; + mem[249] = 32'h8680; + mem[250] = 32'h8700; + mem[251] = 32'h8780; + mem[252] = 32'h8800; + mem[253] = 32'h8880; + mem[254] = 32'h8900; + mem[255] = 32'h8980; + mem[256] = 32'h8a00; + mem[257] = 32'h8a80; + mem[258] = 32'h8b00; + mem[259] = 32'h8b80; + mem[260] = 32'h8c00; + mem[261] = 32'h8c80; + mem[262] = 32'h8d00; + mem[263] = 32'h8d80; + mem[264] = 32'h8e00; + mem[265] = 32'h8e80; + mem[266] = 32'h8f00; + mem[267] = 32'h8f80; + mem[268] = 32'h9000; + mem[269] = 32'h9080; + mem[270] = 32'h9100; + mem[271] = 32'h9180; + mem[272] = 32'h9200; + mem[273] = 32'h9280; + mem[274] = 32'h9300; + mem[275] = 32'h9380; + mem[276] = 32'h9400; + mem[277] = 32'h9480; + mem[278] = 32'h9500; + mem[279] = 32'h9580; + mem[280] = 32'h9600; + mem[281] = 32'h9680; + mem[282] = 32'h9700; + mem[283] = 32'h9780; + mem[284] = 32'h9800; + mem[285] = 32'h9880; + mem[286] = 32'h9900; + mem[287] = 32'h9980; + mem[288] = 32'h9a00; + mem[289] = 32'h9a80; + mem[290] = 32'h9b00; + mem[291] = 32'h9b80; + mem[292] = 32'h9c00; + mem[293] = 32'h9c80; + mem[294] = 32'h9d00; + mem[295] = 32'h9d80; + mem[296] = 32'h9e00; + mem[297] = 32'h9e80; + mem[298] = 32'h9f00; + mem[299] = 32'h9f80; + mem[300] = 32'ha000; + mem[301] = 32'ha080; + mem[302] = 32'ha100; + mem[303] = 32'ha180; + mem[304] = 32'ha200; + mem[305] = 32'ha280; + mem[306] = 32'ha300; + mem[307] = 32'ha380; + mem[308] = 32'ha400; + mem[309] = 32'ha480; + mem[310] = 32'ha500; + mem[311] = 32'ha580; + mem[312] = 32'ha600; + mem[313] = 32'ha680; + mem[314] = 32'ha700; + mem[315] = 32'ha780; + mem[316] = 32'ha800; + mem[317] = 32'ha880; + mem[318] = 32'ha900; + mem[319] = 32'ha980; + mem[320] = 32'haa00; + mem[321] = 32'haa80; + mem[322] = 32'hab00; + mem[323] = 32'hab80; + mem[324] = 32'hac00; + mem[325] = 32'hac80; + mem[326] = 32'had00; + mem[327] = 32'had80; + mem[328] = 32'hae00; + mem[329] = 32'hae80; + mem[330] = 32'haf00; + mem[331] = 32'haf80; + mem[332] = 32'hb000; + mem[333] = 32'hb080; + mem[334] = 32'hb100; + mem[335] = 32'hb180; + mem[336] = 32'hb200; + mem[337] = 32'hb280; + mem[338] = 32'hb300; + mem[339] = 32'hb380; + mem[340] = 32'hb400; + mem[341] = 32'hb480; + mem[342] = 32'hb500; + mem[343] = 32'hb580; + mem[344] = 32'hb600; + mem[345] = 32'hb680; + mem[346] = 32'hb700; + mem[347] = 32'hb780; + mem[348] = 32'hb800; + mem[349] = 32'hb880; + mem[350] = 32'hb900; + mem[351] = 32'hb980; + mem[352] = 32'hba00; + mem[353] = 32'hba80; + mem[354] = 32'hbb00; + mem[355] = 32'hbb80; + mem[356] = 32'hbc00; + mem[357] = 32'hbc80; + mem[358] = 32'hbd00; + mem[359] = 32'hbd80; + mem[360] = 32'hbe00; + mem[361] = 32'hbe80; + mem[362] = 32'hbf00; + mem[363] = 32'hbf80; + mem[364] = 32'hc000; + mem[365] = 32'hc080; + mem[366] = 32'hc100; + mem[367] = 32'hc180; + mem[368] = 32'hc200; + mem[369] = 32'hc280; + mem[370] = 32'hc300; + mem[371] = 32'hc380; + mem[372] = 32'hc400; + mem[373] = 32'hc480; + mem[374] = 32'hc500; + mem[375] = 32'hc580; + mem[376] = 32'hc600; + mem[377] = 32'hc680; + mem[378] = 32'hc700; + mem[379] = 32'hc780; + mem[380] = 32'hc800; + mem[381] = 32'hc880; + mem[382] = 32'hc900; + mem[383] = 32'hc980; + mem[384] = 32'hca00; + mem[385] = 32'hca80; + mem[386] = 32'hcb00; + mem[387] = 32'hcb80; + mem[388] = 32'hcc00; + mem[389] = 32'hcc80; + mem[390] = 32'hcd00; + mem[391] = 32'hcd80; + mem[392] = 32'hce00; + mem[393] = 32'hce80; + mem[394] = 32'hcf00; + mem[395] = 32'hcf80; + mem[396] = 32'hd000; + mem[397] = 32'hd080; + mem[398] = 32'hd100; + mem[399] = 32'hd180; + mem[400] = 32'hd200; + mem[401] = 32'hd280; + mem[402] = 32'hd300; + mem[403] = 32'hd380; + mem[404] = 32'hd400; + mem[405] = 32'hd480; + mem[406] = 32'hd500; + mem[407] = 32'hd580; + mem[408] = 32'hd600; + mem[409] = 32'hd680; + mem[410] = 32'hd700; + mem[411] = 32'hd780; + mem[412] = 32'hd800; + mem[413] = 32'hd880; + mem[414] = 32'hd900; + mem[415] = 32'hd980; + mem[416] = 32'hda00; + mem[417] = 32'hda80; + mem[418] = 32'hdb00; + mem[419] = 32'hdb80; + mem[420] = 32'hdc00; + mem[421] = 32'hdc80; + mem[422] = 32'hdd00; + mem[423] = 32'hdd80; + mem[424] = 32'hde00; + mem[425] = 32'hde80; + mem[426] = 32'hdf00; + mem[427] = 32'hdf80; + mem[428] = 32'he000; + mem[429] = 32'he080; + mem[430] = 32'he100; + mem[431] = 32'he180; + mem[432] = 32'he200; + mem[433] = 32'he280; + mem[434] = 32'he300; + mem[435] = 32'he380; + mem[436] = 32'he400; + mem[437] = 32'he480; + mem[438] = 32'he500; + mem[439] = 32'he580; + mem[440] = 32'he600; + mem[441] = 32'he680; + mem[442] = 32'he700; + mem[443] = 32'he780; + mem[444] = 32'he800; + mem[445] = 32'he880; + mem[446] = 32'he900; + mem[447] = 32'he980; + mem[448] = 32'hea00; + mem[449] = 32'hea80; + mem[450] = 32'heb00; + mem[451] = 32'heb80; + mem[452] = 32'hec00; + mem[453] = 32'hec80; + mem[454] = 32'hed00; + mem[455] = 32'hed80; + mem[456] = 32'hee00; + mem[457] = 32'hee80; + mem[458] = 32'hef00; + mem[459] = 32'hef80; + mem[460] = 32'hf000; + mem[461] = 32'hf080; + mem[462] = 32'hf100; + mem[463] = 32'hf180; + mem[464] = 32'hf200; + mem[465] = 32'hf280; + mem[466] = 32'hf300; + mem[467] = 32'hf380; + mem[468] = 32'hf400; + mem[469] = 32'hf480; + mem[470] = 32'hf500; + mem[471] = 32'hf580; + mem[472] = 32'hf600; + mem[473] = 32'hf680; + mem[474] = 32'hf700; + mem[475] = 32'hf780; + mem[476] = 32'hf800; + mem[477] = 32'hf880; + mem[478] = 32'hf900; + mem[479] = 32'hf980; + mem[480] = 32'hfa00; + mem[481] = 32'hfa80; + mem[482] = 32'hfb00; + mem[483] = 32'hfb80; + mem[484] = 32'hfc00; + mem[485] = 32'hfc80; + mem[486] = 32'hfd00; + mem[487] = 32'hfd80; + mem[488] = 32'hfe00; + mem[489] = 32'hfe80; + mem[490] = 32'hff00; + mem[491] = 32'hff80; + mem[492] = 32'h10000; + mem[493] = 32'h10080; + mem[494] = 32'h10100; + mem[495] = 32'h10180; + mem[496] = 32'h10200; + mem[497] = 32'h10280; + mem[498] = 32'h10300; + mem[499] = 32'h10380; + mem[500] = 32'h10400; + mem[501] = 32'h10480; + mem[502] = 32'h10500; + mem[503] = 32'h10580; + mem[504] = 32'h10600; + mem[505] = 32'h10680; + mem[506] = 32'h10700; + mem[507] = 32'h10780; + mem[508] = 32'h10800; + mem[509] = 32'h10880; + mem[510] = 32'h10900; + mem[511] = 32'h10980; + mem[512] = 32'h10a00; + mem[513] = 32'h10a80; + mem[514] = 32'h10b00; + mem[515] = 32'h10b80; + mem[516] = 32'h10c00; + mem[517] = 32'h10c80; + mem[518] = 32'h10d00; + mem[519] = 32'h10d80; + mem[520] = 32'h10e00; + mem[521] = 32'h10e80; + mem[522] = 32'h10f00; + mem[523] = 32'h10f80; + mem[524] = 32'h11000; + mem[525] = 32'h11080; + mem[526] = 32'h11100; + mem[527] = 32'h11180; + mem[528] = 32'h11200; + mem[529] = 32'h11280; + mem[530] = 32'h11300; + mem[531] = 32'h11380; + mem[532] = 32'h11400; + mem[533] = 32'h11480; + mem[534] = 32'h11500; + mem[535] = 32'h11580; + mem[536] = 32'h11600; + mem[537] = 32'h11680; + mem[538] = 32'h11700; + mem[539] = 32'h11780; + mem[540] = 32'h11800; + mem[541] = 32'h11880; + mem[542] = 32'h11900; + mem[543] = 32'h11980; + mem[544] = 32'h11a00; + mem[545] = 32'h11a80; + mem[546] = 32'h11b00; + mem[547] = 32'h11b80; + mem[548] = 32'h11c00; + mem[549] = 32'h11c80; + mem[550] = 32'h11d00; + mem[551] = 32'h11d80; + mem[552] = 32'h11e00; + mem[553] = 32'h11e80; + mem[554] = 32'h11f00; + mem[555] = 32'h11f80; + mem[556] = 32'h12000; + mem[557] = 32'h12080; + mem[558] = 32'h12100; + mem[559] = 32'h12180; + mem[560] = 32'h12200; + mem[561] = 32'h12280; + mem[562] = 32'h12300; + mem[563] = 32'h12380; + mem[564] = 32'h12400; + mem[565] = 32'h12480; + mem[566] = 32'h12500; + mem[567] = 32'h12580; + mem[568] = 32'h12600; + mem[569] = 32'h12680; + mem[570] = 32'h12700; + mem[571] = 32'h12780; + mem[572] = 32'h12800; + mem[573] = 32'h12880; + mem[574] = 32'h12900; + mem[575] = 32'h12980; + mem[576] = 32'h12a00; + mem[577] = 32'h12a80; + mem[578] = 32'h12b00; + mem[579] = 32'h12b80; + mem[580] = 32'h12c00; + mem[581] = 32'h12c80; + mem[582] = 32'h12d00; + mem[583] = 32'h12d80; + mem[584] = 32'h12e00; + mem[585] = 32'h12e80; + mem[586] = 32'h12f00; + mem[587] = 32'h12f80; + mem[588] = 32'h13000; + mem[589] = 32'h13080; + mem[590] = 32'h13100; + mem[591] = 32'h13180; + mem[592] = 32'h13200; + mem[593] = 32'h13280; + mem[594] = 32'h13300; + mem[595] = 32'h13380; + mem[596] = 32'h13400; + mem[597] = 32'h13480; + mem[598] = 32'h13500; + mem[599] = 32'h13580; + mem[600] = 32'h13600; + mem[601] = 32'h13680; + mem[602] = 32'h13700; + mem[603] = 32'h13780; + mem[604] = 32'h13800; + mem[605] = 32'h13880; + mem[606] = 32'h13900; + mem[607] = 32'h13980; + mem[608] = 32'h13a00; + mem[609] = 32'h13a80; + mem[610] = 32'h13b00; + mem[611] = 32'h13b80; + mem[612] = 32'h13c00; + mem[613] = 32'h13c80; + mem[614] = 32'h13d00; + mem[615] = 32'h13d80; + mem[616] = 32'h13e00; + mem[617] = 32'h13e80; + mem[618] = 32'h13f00; + mem[619] = 32'h13f80; + mem[620] = 32'h14000; + mem[621] = 32'h14080; + mem[622] = 32'h14100; + mem[623] = 32'h14180; + mem[624] = 32'h14200; + mem[625] = 32'h14280; + mem[626] = 32'h14300; + mem[627] = 32'h14380; + mem[628] = 32'h14400; + mem[629] = 32'h14480; + mem[630] = 32'h14500; + mem[631] = 32'h14580; + mem[632] = 32'h14600; + mem[633] = 32'h14680; + mem[634] = 32'h14700; + mem[635] = 32'h14780; + mem[636] = 32'h14800; + mem[637] = 32'h14880; + mem[638] = 32'h14900; + mem[639] = 32'h14980; + mem[640] = 32'h14a00; + mem[641] = 32'h14a80; + mem[642] = 32'h14b00; + mem[643] = 32'h14b80; + mem[644] = 32'h14c00; + mem[645] = 32'h14c80; + mem[646] = 32'h14d00; + mem[647] = 32'h14d80; + mem[648] = 32'h14e00; + mem[649] = 32'h14e80; + mem[650] = 32'h14f00; + mem[651] = 32'h14f80; + mem[652] = 32'h15000; + mem[653] = 32'h15080; + mem[654] = 32'h15100; + mem[655] = 32'h15180; + mem[656] = 32'h15200; + mem[657] = 32'h15280; + mem[658] = 32'h15300; + mem[659] = 32'h15380; + mem[660] = 32'h15400; + mem[661] = 32'h15480; + mem[662] = 32'h15500; + mem[663] = 32'h15580; + mem[664] = 32'h15600; + mem[665] = 32'h15680; + mem[666] = 32'h15700; + mem[667] = 32'h15780; + mem[668] = 32'h15800; + mem[669] = 32'h15880; + mem[670] = 32'h15900; + mem[671] = 32'h15980; + mem[672] = 32'h15a00; + mem[673] = 32'h15a80; + mem[674] = 32'h15b00; + mem[675] = 32'h15b80; + mem[676] = 32'h15c00; + mem[677] = 32'h15c80; + mem[678] = 32'h15d00; + mem[679] = 32'h15d80; + mem[680] = 32'h15e00; + mem[681] = 32'h15e80; + mem[682] = 32'h15f00; + mem[683] = 32'h15f80; + mem[684] = 32'h16000; + mem[685] = 32'h16080; + mem[686] = 32'h16100; + mem[687] = 32'h16180; + mem[688] = 32'h16200; + mem[689] = 32'h16280; + mem[690] = 32'h16300; + mem[691] = 32'h16380; + mem[692] = 32'h16400; + mem[693] = 32'h16480; + mem[694] = 32'h16500; + mem[695] = 32'h16580; + mem[696] = 32'h16600; + mem[697] = 32'h16680; + mem[698] = 32'h16700; + mem[699] = 32'h16780; + mem[700] = 32'h16800; + mem[701] = 32'h16880; + mem[702] = 32'h16900; + mem[703] = 32'h16980; + mem[704] = 32'h16a00; + mem[705] = 32'h16a80; + mem[706] = 32'h16b00; + mem[707] = 32'h16b80; + mem[708] = 32'h16c00; + mem[709] = 32'h16c80; + mem[710] = 32'h16d00; + mem[711] = 32'h16d80; + mem[712] = 32'h16e00; + mem[713] = 32'h16e80; + mem[714] = 32'h16f00; + mem[715] = 32'h16f80; + mem[716] = 32'h17000; + mem[717] = 32'h17080; + mem[718] = 32'h17100; + mem[719] = 32'h17180; + mem[720] = 32'h17200; + mem[721] = 32'h17280; + mem[722] = 32'h17300; + mem[723] = 32'h17380; + mem[724] = 32'h17400; + mem[725] = 32'h17480; + mem[726] = 32'h17500; + mem[727] = 32'h17580; + mem[728] = 32'h17600; + mem[729] = 32'h17680; + mem[730] = 32'h17700; + mem[731] = 32'h17780; + mem[732] = 32'h17800; + mem[733] = 32'h17880; + mem[734] = 32'h17900; + mem[735] = 32'h17980; + mem[736] = 32'h17a00; + mem[737] = 32'h17a80; + mem[738] = 32'h17b00; + mem[739] = 32'h17b80; + mem[740] = 32'h17c00; + mem[741] = 32'h17c80; + mem[742] = 32'h17d00; + mem[743] = 32'h17d80; + mem[744] = 32'h17e00; + mem[745] = 32'h17e80; + mem[746] = 32'h17f00; + mem[747] = 32'h17f80; + mem[748] = 32'h18000; + mem[749] = 32'h18080; + mem[750] = 32'h18100; + mem[751] = 32'h18180; + mem[752] = 32'h18200; + mem[753] = 32'h18280; + mem[754] = 32'h18300; + mem[755] = 32'h18380; + mem[756] = 32'h18400; + mem[757] = 32'h18480; + mem[758] = 32'h18500; + mem[759] = 32'h18580; + mem[760] = 32'h18600; + mem[761] = 32'h18680; + mem[762] = 32'h18700; + mem[763] = 32'h18780; + mem[764] = 32'h18800; + mem[765] = 32'h18880; + mem[766] = 32'h18900; + mem[767] = 32'h18980; + mem[768] = 32'h18a00; + mem[769] = 32'h18a80; + mem[770] = 32'h18b00; + mem[771] = 32'h18b80; + mem[772] = 32'h18c00; + mem[773] = 32'h18c80; + mem[774] = 32'h18d00; + mem[775] = 32'h18d80; + mem[776] = 32'h18e00; + mem[777] = 32'h18e80; + mem[778] = 32'h18f00; + mem[779] = 32'h18f80; + mem[780] = 32'h19000; + mem[781] = 32'h19080; + mem[782] = 32'h19100; + mem[783] = 32'h19180; + mem[784] = 32'h19200; + mem[785] = 32'h19280; + mem[786] = 32'h19300; + mem[787] = 32'h19380; + mem[788] = 32'h19400; + mem[789] = 32'h19480; + mem[790] = 32'h19500; + mem[791] = 32'h19580; + mem[792] = 32'h19600; + mem[793] = 32'h19680; + mem[794] = 32'h19700; + mem[795] = 32'h19780; + mem[796] = 32'h19800; + mem[797] = 32'h19880; + mem[798] = 32'h19900; + mem[799] = 32'h19980; + mem[800] = 32'h19a00; + mem[801] = 32'h19a80; + mem[802] = 32'h19b00; + mem[803] = 32'h19b80; + mem[804] = 32'h19c00; + mem[805] = 32'h19c80; + mem[806] = 32'h19d00; + mem[807] = 32'h19d80; + mem[808] = 32'h19e00; + mem[809] = 32'h19e80; + mem[810] = 32'h19f00; + mem[811] = 32'h19f80; + mem[812] = 32'h1a000; + mem[813] = 32'h1a080; + mem[814] = 32'h1a100; + mem[815] = 32'h1a180; + mem[816] = 32'h1a200; + mem[817] = 32'h1a280; + mem[818] = 32'h1a300; + mem[819] = 32'h1a380; + mem[820] = 32'h1a400; + mem[821] = 32'h1a480; + mem[822] = 32'h1a500; + mem[823] = 32'h1a580; + mem[824] = 32'h1a600; + mem[825] = 32'h1a680; + mem[826] = 32'h1a700; + mem[827] = 32'h1a780; + mem[828] = 32'h1a800; + mem[829] = 32'h1a880; + mem[830] = 32'h1a900; + mem[831] = 32'h1a980; + mem[832] = 32'h1aa00; + mem[833] = 32'h1aa80; + mem[834] = 32'h1ab00; + mem[835] = 32'h1ab80; + mem[836] = 32'h1ac00; + mem[837] = 32'h1ac80; + mem[838] = 32'h1ad00; + mem[839] = 32'h1ad80; + mem[840] = 32'h1ae00; + mem[841] = 32'h1ae80; + mem[842] = 32'h1af00; + mem[843] = 32'h1af80; + mem[844] = 32'h1b000; + mem[845] = 32'h1b080; + mem[846] = 32'h1b100; + mem[847] = 32'h1b180; + mem[848] = 32'h1b200; + mem[849] = 32'h1b280; + mem[850] = 32'h1b300; + mem[851] = 32'h1b380; + mem[852] = 32'h1b400; + mem[853] = 32'h1b480; + mem[854] = 32'h1b500; + mem[855] = 32'h1b580; + mem[856] = 32'h1b600; + mem[857] = 32'h1b680; + mem[858] = 32'h1b700; + mem[859] = 32'h1b780; + mem[860] = 32'h1b800; + mem[861] = 32'h1b880; + mem[862] = 32'h1b900; + mem[863] = 32'h1b980; + mem[864] = 32'h1ba00; + mem[865] = 32'h1ba80; + mem[866] = 32'h1bb00; + mem[867] = 32'h1bb80; + mem[868] = 32'h1bc00; + mem[869] = 32'h1bc80; + mem[870] = 32'h1bd00; + mem[871] = 32'h1bd80; + mem[872] = 32'h1be00; + mem[873] = 32'h1be80; + mem[874] = 32'h1bf00; + mem[875] = 32'h1bf80; + mem[876] = 32'h1c000; + mem[877] = 32'h1c080; + mem[878] = 32'h1c100; + mem[879] = 32'h1c180; + mem[880] = 32'h1c200; + mem[881] = 32'h1c280; + mem[882] = 32'h1c300; + mem[883] = 32'h1c380; + mem[884] = 32'h1c400; + mem[885] = 32'h1c480; + mem[886] = 32'h1c500; + mem[887] = 32'h1c580; + mem[888] = 32'h1c600; + mem[889] = 32'h1c680; + mem[890] = 32'h1c700; + mem[891] = 32'h1c780; + mem[892] = 32'h1c800; + mem[893] = 32'h1c880; + mem[894] = 32'h1c900; + mem[895] = 32'h1c980; + mem[896] = 32'h1ca00; + mem[897] = 32'h1ca80; + mem[898] = 32'h1cb00; + mem[899] = 32'h1cb80; + mem[900] = 32'h1cc00; + mem[901] = 32'h1cc80; + mem[902] = 32'h1cd00; + mem[903] = 32'h1cd80; + mem[904] = 32'h1ce00; + mem[905] = 32'h1ce80; + mem[906] = 32'h1cf00; + mem[907] = 32'h1cf80; + mem[908] = 32'h1d000; + mem[909] = 32'h1d080; + mem[910] = 32'h1d100; + mem[911] = 32'h1d180; + mem[912] = 32'h1d200; + mem[913] = 32'h1d280; + mem[914] = 32'h1d300; + mem[915] = 32'h1d380; + mem[916] = 32'h1d400; + mem[917] = 32'h1d480; + mem[918] = 32'h1d500; + mem[919] = 32'h1d580; + mem[920] = 32'h1d600; + mem[921] = 32'h1d680; + mem[922] = 32'h1d700; + mem[923] = 32'h1d780; + mem[924] = 32'h0; + mem[925] = 32'h0; + mem[926] = 32'h0; + mem[927] = 32'h0; + mem[928] = 32'h0; + mem[929] = 32'h0; + mem[930] = 32'h0; + mem[931] = 32'h0; + mem[932] = 32'h0; + mem[933] = 32'h0; + mem[934] = 32'h0; + mem[935] = 32'h0; + mem[936] = 32'h0; + mem[937] = 32'h0; + mem[938] = 32'h0; + mem[939] = 32'h0; + mem[940] = 32'h0; + mem[941] = 32'h0; + mem[942] = 32'h0; + mem[943] = 32'h0; + mem[944] = 32'h0; + mem[945] = 32'h0; + mem[946] = 32'h0; + mem[947] = 32'h0; + mem[948] = 32'h0; + mem[949] = 32'h0; + mem[950] = 32'h0; + mem[951] = 32'h0; + mem[952] = 32'h0; + mem[953] = 32'h0; + mem[954] = 32'h0; + mem[955] = 32'h0; + mem[956] = 32'h0; + mem[957] = 32'h0; + mem[958] = 32'h0; + mem[959] = 32'h0; + mem[960] = 32'h0; + mem[961] = 32'h0; + mem[962] = 32'h0; + mem[963] = 32'h0; + mem[964] = 32'h0; + mem[965] = 32'h0; + mem[966] = 32'h0; + mem[967] = 32'h0; + mem[968] = 32'h0; + mem[969] = 32'h0; + mem[970] = 32'h0; + mem[971] = 32'h0; + mem[972] = 32'h0; + mem[973] = 32'h0; + mem[974] = 32'h0; + mem[975] = 32'h0; + mem[976] = 32'h0; + mem[977] = 32'h0; + mem[978] = 32'h0; + mem[979] = 32'h0; + mem[980] = 32'h0; + mem[981] = 32'h0; + mem[982] = 32'h0; + mem[983] = 32'h0; + mem[984] = 32'h0; + mem[985] = 32'h0; + mem[986] = 32'h0; + mem[987] = 32'h0; + mem[988] = 32'h0; + mem[989] = 32'h0; + mem[990] = 32'h0; + mem[991] = 32'h0; + mem[992] = 32'h0; + mem[993] = 32'h0; + mem[994] = 32'h0; + mem[995] = 32'h0; + mem[996] = 32'h0; + mem[997] = 32'h0; + mem[998] = 32'h0; + mem[999] = 32'h0; + mem[1000] = 32'h0; + mem[1001] = 32'h0; + mem[1002] = 32'h0; + mem[1003] = 32'h0; + mem[1004] = 32'h0; + mem[1005] = 32'h0; + mem[1006] = 32'h0; + mem[1007] = 32'h0; + mem[1008] = 32'h0; + mem[1009] = 32'h0; + mem[1010] = 32'h0; + mem[1011] = 32'h0; + mem[1012] = 32'h0; + mem[1013] = 32'h0; + mem[1014] = 32'h0; + mem[1015] = 32'h0; + mem[1016] = 32'h0; + mem[1017] = 32'h0; + mem[1018] = 32'h0; + mem[1019] = 32'h0; + mem[1020] = 32'h0; + mem[1021] = 32'h0; + mem[1022] = 32'h0; + mem[1023] = 32'h0; + end + + + always @(posedge CLK) begin + if(myram_0_wenable) begin + mem[myram_0_addr] <= myram_0_wdata; + end + myram_0_daddr <= myram_0_addr; + end + + assign myram_0_rdata = mem[myram_0_daddr]; + +endmodule +""" + + +def test(): + veriloggen.reset() + test_module = thread_fixed_ram_initvals.mkTest() + code = test_module.to_verilog() + + from pyverilog.vparser.parser import VerilogParser + from pyverilog.ast_code_generator.codegen import ASTCodeGenerator + parser = VerilogParser() + expected_ast = parser.parse(expected_verilog) + codegen = ASTCodeGenerator() + expected_code = codegen.visit(expected_ast) + + assert(expected_code == code) diff --git a/tests/extension/thread_/fixed_ram_initvals/thread_fixed_ram_initvals.py b/tests/extension/thread_/fixed_ram_initvals/thread_fixed_ram_initvals.py new file mode 100644 index 00000000..6b03ec2d --- /dev/null +++ b/tests/extension/thread_/fixed_ram_initvals/thread_fixed_ram_initvals.py @@ -0,0 +1,89 @@ +from __future__ import absolute_import +from __future__ import print_function +import sys +import os + +# the next line can be removed after installation +sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.dirname( + os.path.dirname(os.path.dirname(os.path.abspath(__file__))))))) + +from veriloggen import * +import veriloggen.thread as vthread + + +def mkLed(): + m = Module('blinkled') + clk = m.Input('CLK') + rst = m.Input('RST') + + datawidth = 32 + addrwidth = 10 + numports = 1 + initvals = [i * 0.5 + 10 for i in range(2 ** addrwidth - 100)] + myram = vthread.FixedRAM(m, 'myram', clk, rst, datawidth, addrwidth, + point=8, numports=numports, initvals=initvals) + + def blink(times): + for i in range(times): + rdata = myram.read(i) + print('rdata = %f' % rdata) + + for i in range(times): + rdata = myram.read(i) + + b = vthread.fixed.FixedConst(0.25, 8) + wdata = rdata + b + myram.write(i, wdata) + print('wdata = %f' % wdata) + + sum = vthread.fixed.FixedConst(0, 8) + for i in range(times): + rdata = myram.read(i) + print('rdata = %f' % rdata) + sum += rdata + + print('sum = %f' % sum) + + th = vthread.Thread(m, 'th_blink', clk, rst, blink) + fsm = th.start(10) + + return m + + +def mkTest(): + m = Module('test') + + # target instance + led = mkLed() + + # copy paras and ports + params = m.copy_params(led) + ports = m.copy_sim_ports(led) + + clk = ports['CLK'] + rst = ports['RST'] + + uut = m.Instance(led, 'uut', + params=m.connect_params(led), + ports=m.connect_ports(led)) + + simulation.setup_waveform(m, uut) + simulation.setup_clock(m, clk, hperiod=5) + init = simulation.setup_reset(m, rst, m.make_reset(), period=100) + + init.add( + Delay(10000), + Systask('finish'), + ) + + return m + + +if __name__ == '__main__': + test = mkTest() + verilog = test.to_verilog('tmp.v') + print(verilog) + + sim = simulation.Simulator(test) + rslt = sim.run() + print(rslt) diff --git a/tests/extension/thread_/fixed_read/thread_fixed_read.py b/tests/extension/thread_/fixed_read/thread_fixed_read.py index 551386cf..26d07234 100644 --- a/tests/extension/thread_/fixed_read/thread_fixed_read.py +++ b/tests/extension/thread_/fixed_read/thread_fixed_read.py @@ -28,7 +28,7 @@ def mkLed(): def blink(times): led.value = 0 for i in range(times): - led.value = count + led.value = count.int_part print("led = ", led) th = vthread.Thread(m, 'th_blink', clk, rst, blink) diff --git a/tests/extension/thread_/fixed_tmp_variable/thread_fixed_tmp_variable.py b/tests/extension/thread_/fixed_tmp_variable/thread_fixed_tmp_variable.py index a2336a01..17ee1ea1 100644 --- a/tests/extension/thread_/fixed_tmp_variable/thread_fixed_tmp_variable.py +++ b/tests/extension/thread_/fixed_tmp_variable/thread_fixed_tmp_variable.py @@ -29,7 +29,7 @@ def blink(times): led.value = 0 for i in range(times): next_val = count + 3 - led.value = next_val + led.value = next_val.int_part print("led = ", led) th = vthread.Thread(m, 'th_blink', clk, rst, blink) diff --git a/tests/extension/thread_/ram_initvals/Makefile b/tests/extension/thread_/ram_initvals/Makefile new file mode 100644 index 00000000..13c4fb29 --- /dev/null +++ b/tests/extension/thread_/ram_initvals/Makefile @@ -0,0 +1,29 @@ +TARGET=$(shell ls *.py | grep -v test | grep -v parsetab.py) +ARGS= + +PYTHON=python3 +#PYTHON=python +#OPT=-m pdb +#OPT=-m cProfile -s time +#OPT=-m cProfile -o profile.rslt + +.PHONY: all +all: test + +.PHONY: run +run: + $(PYTHON) $(OPT) $(TARGET) $(ARGS) + +.PHONY: test +test: + $(PYTHON) -m pytest -vv + +.PHONY: check +check: + $(PYTHON) $(OPT) $(TARGET) $(ARGS) > tmp.v + iverilog -tnull -Wall tmp.v + rm -f tmp.v + +.PHONY: clean +clean: + rm -rf *.pyc __pycache__ parsetab.py .cache *.out *.png *.dot tmp.v uut.vcd diff --git a/tests/extension/thread_/ram_initval/test_thread_ram_initval.py b/tests/extension/thread_/ram_initvals/test_thread_ram_initvals.py similarity index 99% rename from tests/extension/thread_/ram_initval/test_thread_ram_initval.py rename to tests/extension/thread_/ram_initvals/test_thread_ram_initvals.py index f1582f80..28645a85 100644 --- a/tests/extension/thread_/ram_initval/test_thread_ram_initval.py +++ b/tests/extension/thread_/ram_initvals/test_thread_ram_initvals.py @@ -1,7 +1,7 @@ from __future__ import absolute_import from __future__ import print_function import veriloggen -import thread_ram_initval +import thread_ram_initvals expected_verilog = """ module test; @@ -1322,7 +1322,7 @@ def test(): veriloggen.reset() - test_module = thread_ram_initval.mkTest() + test_module = thread_ram_initvals.mkTest() code = test_module.to_verilog() from pyverilog.vparser.parser import VerilogParser diff --git a/tests/extension/thread_/ram_initval/thread_ram_initval.py b/tests/extension/thread_/ram_initvals/thread_ram_initvals.py similarity index 100% rename from tests/extension/thread_/ram_initval/thread_ram_initval.py rename to tests/extension/thread_/ram_initvals/thread_ram_initvals.py diff --git a/tests/extension/thread_/ram_initvals_nocheck/Makefile b/tests/extension/thread_/ram_initvals_nocheck/Makefile new file mode 100644 index 00000000..13c4fb29 --- /dev/null +++ b/tests/extension/thread_/ram_initvals_nocheck/Makefile @@ -0,0 +1,29 @@ +TARGET=$(shell ls *.py | grep -v test | grep -v parsetab.py) +ARGS= + +PYTHON=python3 +#PYTHON=python +#OPT=-m pdb +#OPT=-m cProfile -s time +#OPT=-m cProfile -o profile.rslt + +.PHONY: all +all: test + +.PHONY: run +run: + $(PYTHON) $(OPT) $(TARGET) $(ARGS) + +.PHONY: test +test: + $(PYTHON) -m pytest -vv + +.PHONY: check +check: + $(PYTHON) $(OPT) $(TARGET) $(ARGS) > tmp.v + iverilog -tnull -Wall tmp.v + rm -f tmp.v + +.PHONY: clean +clean: + rm -rf *.pyc __pycache__ parsetab.py .cache *.out *.png *.dot tmp.v uut.vcd diff --git a/tests/extension/thread_/ram_initvals_nocheck/test_thread_ram_initvals_nocheck.py b/tests/extension/thread_/ram_initvals_nocheck/test_thread_ram_initvals_nocheck.py new file mode 100644 index 00000000..ed49809e --- /dev/null +++ b/tests/extension/thread_/ram_initvals_nocheck/test_thread_ram_initvals_nocheck.py @@ -0,0 +1,1335 @@ +from __future__ import absolute_import +from __future__ import print_function +import veriloggen +import thread_ram_initvals_nocheck + +expected_verilog = """ +module test; + + reg CLK; + reg RST; + + blinkled + uut + ( + .CLK(CLK), + .RST(RST) + ); + + + initial begin + $dumpfile("uut.vcd"); + $dumpvars(0, uut); + end + + + initial begin + CLK = 0; + forever begin + #5 CLK = !CLK; + end + end + + + initial begin + RST = 0; + #100; + RST = 1; + #100; + RST = 0; + #10000; + $finish; + end + + +endmodule + + + +module blinkled +( + input CLK, + input RST +); + + reg [10-1:0] myram_0_addr; + wire [32-1:0] myram_0_rdata; + reg [32-1:0] myram_0_wdata; + reg myram_0_wenable; + + myram + inst_myram + ( + .CLK(CLK), + .myram_0_addr(myram_0_addr), + .myram_0_rdata(myram_0_rdata), + .myram_0_wdata(myram_0_wdata), + .myram_0_wenable(myram_0_wenable) + ); + + reg [32-1:0] th_blink; + localparam th_blink_init = 0; + reg signed [32-1:0] _th_blink_times_0; + reg signed [32-1:0] _th_blink_i_1; + reg _tmp_0; + reg _myram_cond_0_1; + reg _myram_cond_1_1; + reg _myram_cond_1_2; + reg signed [32-1:0] _tmp_1; + reg signed [32-1:0] _th_blink_rdata_2; + reg signed [32-1:0] _th_blink_wdata_3; + reg _myram_cond_2_1; + reg signed [32-1:0] _th_blink_sum_4; + reg _tmp_2; + reg _myram_cond_3_1; + reg _myram_cond_4_1; + reg _myram_cond_4_2; + reg signed [32-1:0] _tmp_3; + + always @(posedge CLK) begin + if(RST) begin + myram_0_addr <= 0; + _myram_cond_0_1 <= 0; + _tmp_0 <= 0; + _myram_cond_1_1 <= 0; + _myram_cond_1_2 <= 0; + myram_0_wdata <= 0; + myram_0_wenable <= 0; + _myram_cond_2_1 <= 0; + _myram_cond_3_1 <= 0; + _tmp_2 <= 0; + _myram_cond_4_1 <= 0; + _myram_cond_4_2 <= 0; + end else begin + if(_myram_cond_1_2) begin + _tmp_0 <= 0; + end + if(_myram_cond_4_2) begin + _tmp_2 <= 0; + end + if(_myram_cond_0_1) begin + _tmp_0 <= 1; + end + _myram_cond_1_2 <= _myram_cond_1_1; + if(_myram_cond_2_1) begin + myram_0_wenable <= 0; + end + if(_myram_cond_3_1) begin + _tmp_2 <= 1; + end + _myram_cond_4_2 <= _myram_cond_4_1; + if(th_blink == 3) begin + myram_0_addr <= _th_blink_i_1; + end + _myram_cond_0_1 <= th_blink == 3; + _myram_cond_1_1 <= th_blink == 3; + if(th_blink == 7) begin + myram_0_addr <= _th_blink_i_1; + myram_0_wdata <= _th_blink_wdata_3; + myram_0_wenable <= 1; + end + _myram_cond_2_1 <= th_blink == 7; + if(th_blink == 13) begin + myram_0_addr <= _th_blink_i_1; + end + _myram_cond_3_1 <= th_blink == 13; + _myram_cond_4_1 <= th_blink == 13; + end + end + + localparam th_blink_1 = 1; + localparam th_blink_2 = 2; + localparam th_blink_3 = 3; + localparam th_blink_4 = 4; + localparam th_blink_5 = 5; + localparam th_blink_6 = 6; + localparam th_blink_7 = 7; + localparam th_blink_8 = 8; + localparam th_blink_9 = 9; + localparam th_blink_10 = 10; + localparam th_blink_11 = 11; + localparam th_blink_12 = 12; + localparam th_blink_13 = 13; + localparam th_blink_14 = 14; + localparam th_blink_15 = 15; + localparam th_blink_16 = 16; + localparam th_blink_17 = 17; + localparam th_blink_18 = 18; + localparam th_blink_19 = 19; + + always @(posedge CLK) begin + if(RST) begin + th_blink <= th_blink_init; + _th_blink_times_0 <= 0; + _th_blink_i_1 <= 0; + _tmp_1 <= 0; + _th_blink_rdata_2 <= 0; + _th_blink_wdata_3 <= 0; + _th_blink_sum_4 <= 0; + _tmp_3 <= 0; + end else begin + case(th_blink) + th_blink_init: begin + _th_blink_times_0 <= 10; + th_blink <= th_blink_1; + end + th_blink_1: begin + _th_blink_i_1 <= 0; + th_blink <= th_blink_2; + end + th_blink_2: begin + if(_th_blink_i_1 < _th_blink_times_0) begin + th_blink <= th_blink_3; + end else begin + th_blink <= th_blink_10; + end + end + th_blink_3: begin + if(_tmp_0) begin + _tmp_1 <= myram_0_rdata; + end + if(_tmp_0) begin + th_blink <= th_blink_4; + end + end + th_blink_4: begin + _th_blink_rdata_2 <= _tmp_1; + th_blink <= th_blink_5; + end + th_blink_5: begin + $display("rdata = %d", _th_blink_rdata_2); + th_blink <= th_blink_6; + end + th_blink_6: begin + _th_blink_wdata_3 <= _th_blink_rdata_2 + 1; + th_blink <= th_blink_7; + end + th_blink_7: begin + th_blink <= th_blink_8; + end + th_blink_8: begin + $display("wdata = %d", _th_blink_wdata_3); + th_blink <= th_blink_9; + end + th_blink_9: begin + _th_blink_i_1 <= _th_blink_i_1 + 1; + th_blink <= th_blink_2; + end + th_blink_10: begin + _th_blink_sum_4 <= 0; + th_blink <= th_blink_11; + end + th_blink_11: begin + _th_blink_i_1 <= 0; + th_blink <= th_blink_12; + end + th_blink_12: begin + if(_th_blink_i_1 < _th_blink_times_0) begin + th_blink <= th_blink_13; + end else begin + th_blink <= th_blink_18; + end + end + th_blink_13: begin + if(_tmp_2) begin + _tmp_3 <= myram_0_rdata; + end + if(_tmp_2) begin + th_blink <= th_blink_14; + end + end + th_blink_14: begin + _th_blink_rdata_2 <= _tmp_3; + th_blink <= th_blink_15; + end + th_blink_15: begin + _th_blink_sum_4 <= _th_blink_sum_4 + _th_blink_rdata_2; + th_blink <= th_blink_16; + end + th_blink_16: begin + $display("rdata = %d", _th_blink_rdata_2); + th_blink <= th_blink_17; + end + th_blink_17: begin + _th_blink_i_1 <= _th_blink_i_1 + 1; + th_blink <= th_blink_12; + end + th_blink_18: begin + $display("sum = %d", _th_blink_sum_4); + th_blink <= th_blink_19; + end + endcase + end + end + + +endmodule + + + +module myram +( + input CLK, + input [10-1:0] myram_0_addr, + output [32-1:0] myram_0_rdata, + input [32-1:0] myram_0_wdata, + input myram_0_wenable +); + + reg [10-1:0] myram_0_daddr; + reg [32-1:0] mem [0:1024-1]; + + initial begin + mem[0] = { 16'd0, 12'd0, 4'd0 }; + mem[1] = { 16'd0, 12'd1, 4'd0 }; + mem[2] = { 16'd0, 12'd2, 4'd0 }; + mem[3] = { 16'd0, 12'd3, 4'd0 }; + mem[4] = { 16'd0, 12'd4, 4'd0 }; + mem[5] = { 16'd0, 12'd5, 4'd0 }; + mem[6] = { 16'd0, 12'd6, 4'd0 }; + mem[7] = { 16'd0, 12'd7, 4'd0 }; + mem[8] = { 16'd0, 12'd8, 4'd0 }; + mem[9] = { 16'd0, 12'd9, 4'd0 }; + mem[10] = { 16'd0, 12'd10, 4'd0 }; + mem[11] = { 16'd0, 12'd11, 4'd0 }; + mem[12] = { 16'd0, 12'd12, 4'd0 }; + mem[13] = { 16'd0, 12'd13, 4'd0 }; + mem[14] = { 16'd0, 12'd14, 4'd0 }; + mem[15] = { 16'd0, 12'd15, 4'd0 }; + mem[16] = { 16'd0, 12'd16, 4'd0 }; + mem[17] = { 16'd0, 12'd17, 4'd0 }; + mem[18] = { 16'd0, 12'd18, 4'd0 }; + mem[19] = { 16'd0, 12'd19, 4'd0 }; + mem[20] = { 16'd0, 12'd20, 4'd0 }; + mem[21] = { 16'd0, 12'd21, 4'd0 }; + mem[22] = { 16'd0, 12'd22, 4'd0 }; + mem[23] = { 16'd0, 12'd23, 4'd0 }; + mem[24] = { 16'd0, 12'd24, 4'd0 }; + mem[25] = { 16'd0, 12'd25, 4'd0 }; + mem[26] = { 16'd0, 12'd26, 4'd0 }; + mem[27] = { 16'd0, 12'd27, 4'd0 }; + mem[28] = { 16'd0, 12'd28, 4'd0 }; + mem[29] = { 16'd0, 12'd29, 4'd0 }; + mem[30] = { 16'd0, 12'd30, 4'd0 }; + mem[31] = { 16'd0, 12'd31, 4'd0 }; + mem[32] = { 16'd0, 12'd32, 4'd0 }; + mem[33] = { 16'd0, 12'd33, 4'd0 }; + mem[34] = { 16'd0, 12'd34, 4'd0 }; + mem[35] = { 16'd0, 12'd35, 4'd0 }; + mem[36] = { 16'd0, 12'd36, 4'd0 }; + mem[37] = { 16'd0, 12'd37, 4'd0 }; + mem[38] = { 16'd0, 12'd38, 4'd0 }; + mem[39] = { 16'd0, 12'd39, 4'd0 }; + mem[40] = { 16'd0, 12'd40, 4'd0 }; + mem[41] = { 16'd0, 12'd41, 4'd0 }; + mem[42] = { 16'd0, 12'd42, 4'd0 }; + mem[43] = { 16'd0, 12'd43, 4'd0 }; + mem[44] = { 16'd0, 12'd44, 4'd0 }; + mem[45] = { 16'd0, 12'd45, 4'd0 }; + mem[46] = { 16'd0, 12'd46, 4'd0 }; + mem[47] = { 16'd0, 12'd47, 4'd0 }; + mem[48] = { 16'd0, 12'd48, 4'd0 }; + mem[49] = { 16'd0, 12'd49, 4'd0 }; + mem[50] = { 16'd0, 12'd50, 4'd0 }; + mem[51] = { 16'd0, 12'd51, 4'd0 }; + mem[52] = { 16'd0, 12'd52, 4'd0 }; + mem[53] = { 16'd0, 12'd53, 4'd0 }; + mem[54] = { 16'd0, 12'd54, 4'd0 }; + mem[55] = { 16'd0, 12'd55, 4'd0 }; + mem[56] = { 16'd0, 12'd56, 4'd0 }; + mem[57] = { 16'd0, 12'd57, 4'd0 }; + mem[58] = { 16'd0, 12'd58, 4'd0 }; + mem[59] = { 16'd0, 12'd59, 4'd0 }; + mem[60] = { 16'd0, 12'd60, 4'd0 }; + mem[61] = { 16'd0, 12'd61, 4'd0 }; + mem[62] = { 16'd0, 12'd62, 4'd0 }; + mem[63] = { 16'd0, 12'd63, 4'd0 }; + mem[64] = { 16'd0, 12'd64, 4'd0 }; + mem[65] = { 16'd0, 12'd65, 4'd0 }; + mem[66] = { 16'd0, 12'd66, 4'd0 }; + mem[67] = { 16'd0, 12'd67, 4'd0 }; + mem[68] = { 16'd0, 12'd68, 4'd0 }; + mem[69] = { 16'd0, 12'd69, 4'd0 }; + mem[70] = { 16'd0, 12'd70, 4'd0 }; + mem[71] = { 16'd0, 12'd71, 4'd0 }; + mem[72] = { 16'd0, 12'd72, 4'd0 }; + mem[73] = { 16'd0, 12'd73, 4'd0 }; + mem[74] = { 16'd0, 12'd74, 4'd0 }; + mem[75] = { 16'd0, 12'd75, 4'd0 }; + mem[76] = { 16'd0, 12'd76, 4'd0 }; + mem[77] = { 16'd0, 12'd77, 4'd0 }; + mem[78] = { 16'd0, 12'd78, 4'd0 }; + mem[79] = { 16'd0, 12'd79, 4'd0 }; + mem[80] = { 16'd0, 12'd80, 4'd0 }; + mem[81] = { 16'd0, 12'd81, 4'd0 }; + mem[82] = { 16'd0, 12'd82, 4'd0 }; + mem[83] = { 16'd0, 12'd83, 4'd0 }; + mem[84] = { 16'd0, 12'd84, 4'd0 }; + mem[85] = { 16'd0, 12'd85, 4'd0 }; + mem[86] = { 16'd0, 12'd86, 4'd0 }; + mem[87] = { 16'd0, 12'd87, 4'd0 }; + mem[88] = { 16'd0, 12'd88, 4'd0 }; + mem[89] = { 16'd0, 12'd89, 4'd0 }; + mem[90] = { 16'd0, 12'd90, 4'd0 }; + mem[91] = { 16'd0, 12'd91, 4'd0 }; + mem[92] = { 16'd0, 12'd92, 4'd0 }; + mem[93] = { 16'd0, 12'd93, 4'd0 }; + mem[94] = { 16'd0, 12'd94, 4'd0 }; + mem[95] = { 16'd0, 12'd95, 4'd0 }; + mem[96] = { 16'd0, 12'd96, 4'd0 }; + mem[97] = { 16'd0, 12'd97, 4'd0 }; + mem[98] = { 16'd0, 12'd98, 4'd0 }; + mem[99] = { 16'd0, 12'd99, 4'd0 }; + mem[100] = { 16'd0, 12'd100, 4'd0 }; + mem[101] = { 16'd0, 12'd101, 4'd0 }; + mem[102] = { 16'd0, 12'd102, 4'd0 }; + mem[103] = { 16'd0, 12'd103, 4'd0 }; + mem[104] = { 16'd0, 12'd104, 4'd0 }; + mem[105] = { 16'd0, 12'd105, 4'd0 }; + mem[106] = { 16'd0, 12'd106, 4'd0 }; + mem[107] = { 16'd0, 12'd107, 4'd0 }; + mem[108] = { 16'd0, 12'd108, 4'd0 }; + mem[109] = { 16'd0, 12'd109, 4'd0 }; + mem[110] = { 16'd0, 12'd110, 4'd0 }; + mem[111] = { 16'd0, 12'd111, 4'd0 }; + mem[112] = { 16'd0, 12'd112, 4'd0 }; + mem[113] = { 16'd0, 12'd113, 4'd0 }; + mem[114] = { 16'd0, 12'd114, 4'd0 }; + mem[115] = { 16'd0, 12'd115, 4'd0 }; + mem[116] = { 16'd0, 12'd116, 4'd0 }; + mem[117] = { 16'd0, 12'd117, 4'd0 }; + mem[118] = { 16'd0, 12'd118, 4'd0 }; + mem[119] = { 16'd0, 12'd119, 4'd0 }; + mem[120] = { 16'd0, 12'd120, 4'd0 }; + mem[121] = { 16'd0, 12'd121, 4'd0 }; + mem[122] = { 16'd0, 12'd122, 4'd0 }; + mem[123] = { 16'd0, 12'd123, 4'd0 }; + mem[124] = { 16'd0, 12'd124, 4'd0 }; + mem[125] = { 16'd0, 12'd125, 4'd0 }; + mem[126] = { 16'd0, 12'd126, 4'd0 }; + mem[127] = { 16'd0, 12'd127, 4'd0 }; + mem[128] = { 16'd0, 12'd128, 4'd0 }; + mem[129] = { 16'd0, 12'd129, 4'd0 }; + mem[130] = { 16'd0, 12'd130, 4'd0 }; + mem[131] = { 16'd0, 12'd131, 4'd0 }; + mem[132] = { 16'd0, 12'd132, 4'd0 }; + mem[133] = { 16'd0, 12'd133, 4'd0 }; + mem[134] = { 16'd0, 12'd134, 4'd0 }; + mem[135] = { 16'd0, 12'd135, 4'd0 }; + mem[136] = { 16'd0, 12'd136, 4'd0 }; + mem[137] = { 16'd0, 12'd137, 4'd0 }; + mem[138] = { 16'd0, 12'd138, 4'd0 }; + mem[139] = { 16'd0, 12'd139, 4'd0 }; + mem[140] = { 16'd0, 12'd140, 4'd0 }; + mem[141] = { 16'd0, 12'd141, 4'd0 }; + mem[142] = { 16'd0, 12'd142, 4'd0 }; + mem[143] = { 16'd0, 12'd143, 4'd0 }; + mem[144] = { 16'd0, 12'd144, 4'd0 }; + mem[145] = { 16'd0, 12'd145, 4'd0 }; + mem[146] = { 16'd0, 12'd146, 4'd0 }; + mem[147] = { 16'd0, 12'd147, 4'd0 }; + mem[148] = { 16'd0, 12'd148, 4'd0 }; + mem[149] = { 16'd0, 12'd149, 4'd0 }; + mem[150] = { 16'd0, 12'd150, 4'd0 }; + mem[151] = { 16'd0, 12'd151, 4'd0 }; + mem[152] = { 16'd0, 12'd152, 4'd0 }; + mem[153] = { 16'd0, 12'd153, 4'd0 }; + mem[154] = { 16'd0, 12'd154, 4'd0 }; + mem[155] = { 16'd0, 12'd155, 4'd0 }; + mem[156] = { 16'd0, 12'd156, 4'd0 }; + mem[157] = { 16'd0, 12'd157, 4'd0 }; + mem[158] = { 16'd0, 12'd158, 4'd0 }; + mem[159] = { 16'd0, 12'd159, 4'd0 }; + mem[160] = { 16'd0, 12'd160, 4'd0 }; + mem[161] = { 16'd0, 12'd161, 4'd0 }; + mem[162] = { 16'd0, 12'd162, 4'd0 }; + mem[163] = { 16'd0, 12'd163, 4'd0 }; + mem[164] = { 16'd0, 12'd164, 4'd0 }; + mem[165] = { 16'd0, 12'd165, 4'd0 }; + mem[166] = { 16'd0, 12'd166, 4'd0 }; + mem[167] = { 16'd0, 12'd167, 4'd0 }; + mem[168] = { 16'd0, 12'd168, 4'd0 }; + mem[169] = { 16'd0, 12'd169, 4'd0 }; + mem[170] = { 16'd0, 12'd170, 4'd0 }; + mem[171] = { 16'd0, 12'd171, 4'd0 }; + mem[172] = { 16'd0, 12'd172, 4'd0 }; + mem[173] = { 16'd0, 12'd173, 4'd0 }; + mem[174] = { 16'd0, 12'd174, 4'd0 }; + mem[175] = { 16'd0, 12'd175, 4'd0 }; + mem[176] = { 16'd0, 12'd176, 4'd0 }; + mem[177] = { 16'd0, 12'd177, 4'd0 }; + mem[178] = { 16'd0, 12'd178, 4'd0 }; + mem[179] = { 16'd0, 12'd179, 4'd0 }; + mem[180] = { 16'd0, 12'd180, 4'd0 }; + mem[181] = { 16'd0, 12'd181, 4'd0 }; + mem[182] = { 16'd0, 12'd182, 4'd0 }; + mem[183] = { 16'd0, 12'd183, 4'd0 }; + mem[184] = { 16'd0, 12'd184, 4'd0 }; + mem[185] = { 16'd0, 12'd185, 4'd0 }; + mem[186] = { 16'd0, 12'd186, 4'd0 }; + mem[187] = { 16'd0, 12'd187, 4'd0 }; + mem[188] = { 16'd0, 12'd188, 4'd0 }; + mem[189] = { 16'd0, 12'd189, 4'd0 }; + mem[190] = { 16'd0, 12'd190, 4'd0 }; + mem[191] = { 16'd0, 12'd191, 4'd0 }; + mem[192] = { 16'd0, 12'd192, 4'd0 }; + mem[193] = { 16'd0, 12'd193, 4'd0 }; + mem[194] = { 16'd0, 12'd194, 4'd0 }; + mem[195] = { 16'd0, 12'd195, 4'd0 }; + mem[196] = { 16'd0, 12'd196, 4'd0 }; + mem[197] = { 16'd0, 12'd197, 4'd0 }; + mem[198] = { 16'd0, 12'd198, 4'd0 }; + mem[199] = { 16'd0, 12'd199, 4'd0 }; + mem[200] = { 16'd0, 12'd200, 4'd0 }; + mem[201] = { 16'd0, 12'd201, 4'd0 }; + mem[202] = { 16'd0, 12'd202, 4'd0 }; + mem[203] = { 16'd0, 12'd203, 4'd0 }; + mem[204] = { 16'd0, 12'd204, 4'd0 }; + mem[205] = { 16'd0, 12'd205, 4'd0 }; + mem[206] = { 16'd0, 12'd206, 4'd0 }; + mem[207] = { 16'd0, 12'd207, 4'd0 }; + mem[208] = { 16'd0, 12'd208, 4'd0 }; + mem[209] = { 16'd0, 12'd209, 4'd0 }; + mem[210] = { 16'd0, 12'd210, 4'd0 }; + mem[211] = { 16'd0, 12'd211, 4'd0 }; + mem[212] = { 16'd0, 12'd212, 4'd0 }; + mem[213] = { 16'd0, 12'd213, 4'd0 }; + mem[214] = { 16'd0, 12'd214, 4'd0 }; + mem[215] = { 16'd0, 12'd215, 4'd0 }; + mem[216] = { 16'd0, 12'd216, 4'd0 }; + mem[217] = { 16'd0, 12'd217, 4'd0 }; + mem[218] = { 16'd0, 12'd218, 4'd0 }; + mem[219] = { 16'd0, 12'd219, 4'd0 }; + mem[220] = { 16'd0, 12'd220, 4'd0 }; + mem[221] = { 16'd0, 12'd221, 4'd0 }; + mem[222] = { 16'd0, 12'd222, 4'd0 }; + mem[223] = { 16'd0, 12'd223, 4'd0 }; + mem[224] = { 16'd0, 12'd224, 4'd0 }; + mem[225] = { 16'd0, 12'd225, 4'd0 }; + mem[226] = { 16'd0, 12'd226, 4'd0 }; + mem[227] = { 16'd0, 12'd227, 4'd0 }; + mem[228] = { 16'd0, 12'd228, 4'd0 }; + mem[229] = { 16'd0, 12'd229, 4'd0 }; + mem[230] = { 16'd0, 12'd230, 4'd0 }; + mem[231] = { 16'd0, 12'd231, 4'd0 }; + mem[232] = { 16'd0, 12'd232, 4'd0 }; + mem[233] = { 16'd0, 12'd233, 4'd0 }; + mem[234] = { 16'd0, 12'd234, 4'd0 }; + mem[235] = { 16'd0, 12'd235, 4'd0 }; + mem[236] = { 16'd0, 12'd236, 4'd0 }; + mem[237] = { 16'd0, 12'd237, 4'd0 }; + mem[238] = { 16'd0, 12'd238, 4'd0 }; + mem[239] = { 16'd0, 12'd239, 4'd0 }; + mem[240] = { 16'd0, 12'd240, 4'd0 }; + mem[241] = { 16'd0, 12'd241, 4'd0 }; + mem[242] = { 16'd0, 12'd242, 4'd0 }; + mem[243] = { 16'd0, 12'd243, 4'd0 }; + mem[244] = { 16'd0, 12'd244, 4'd0 }; + mem[245] = { 16'd0, 12'd245, 4'd0 }; + mem[246] = { 16'd0, 12'd246, 4'd0 }; + mem[247] = { 16'd0, 12'd247, 4'd0 }; + mem[248] = { 16'd0, 12'd248, 4'd0 }; + mem[249] = { 16'd0, 12'd249, 4'd0 }; + mem[250] = { 16'd0, 12'd250, 4'd0 }; + mem[251] = { 16'd0, 12'd251, 4'd0 }; + mem[252] = { 16'd0, 12'd252, 4'd0 }; + mem[253] = { 16'd0, 12'd253, 4'd0 }; + mem[254] = { 16'd0, 12'd254, 4'd0 }; + mem[255] = { 16'd0, 12'd255, 4'd0 }; + mem[256] = { 16'd0, 12'd256, 4'd0 }; + mem[257] = { 16'd0, 12'd257, 4'd0 }; + mem[258] = { 16'd0, 12'd258, 4'd0 }; + mem[259] = { 16'd0, 12'd259, 4'd0 }; + mem[260] = { 16'd0, 12'd260, 4'd0 }; + mem[261] = { 16'd0, 12'd261, 4'd0 }; + mem[262] = { 16'd0, 12'd262, 4'd0 }; + mem[263] = { 16'd0, 12'd263, 4'd0 }; + mem[264] = { 16'd0, 12'd264, 4'd0 }; + mem[265] = { 16'd0, 12'd265, 4'd0 }; + mem[266] = { 16'd0, 12'd266, 4'd0 }; + mem[267] = { 16'd0, 12'd267, 4'd0 }; + mem[268] = { 16'd0, 12'd268, 4'd0 }; + mem[269] = { 16'd0, 12'd269, 4'd0 }; + mem[270] = { 16'd0, 12'd270, 4'd0 }; + mem[271] = { 16'd0, 12'd271, 4'd0 }; + mem[272] = { 16'd0, 12'd272, 4'd0 }; + mem[273] = { 16'd0, 12'd273, 4'd0 }; + mem[274] = { 16'd0, 12'd274, 4'd0 }; + mem[275] = { 16'd0, 12'd275, 4'd0 }; + mem[276] = { 16'd0, 12'd276, 4'd0 }; + mem[277] = { 16'd0, 12'd277, 4'd0 }; + mem[278] = { 16'd0, 12'd278, 4'd0 }; + mem[279] = { 16'd0, 12'd279, 4'd0 }; + mem[280] = { 16'd0, 12'd280, 4'd0 }; + mem[281] = { 16'd0, 12'd281, 4'd0 }; + mem[282] = { 16'd0, 12'd282, 4'd0 }; + mem[283] = { 16'd0, 12'd283, 4'd0 }; + mem[284] = { 16'd0, 12'd284, 4'd0 }; + mem[285] = { 16'd0, 12'd285, 4'd0 }; + mem[286] = { 16'd0, 12'd286, 4'd0 }; + mem[287] = { 16'd0, 12'd287, 4'd0 }; + mem[288] = { 16'd0, 12'd288, 4'd0 }; + mem[289] = { 16'd0, 12'd289, 4'd0 }; + mem[290] = { 16'd0, 12'd290, 4'd0 }; + mem[291] = { 16'd0, 12'd291, 4'd0 }; + mem[292] = { 16'd0, 12'd292, 4'd0 }; + mem[293] = { 16'd0, 12'd293, 4'd0 }; + mem[294] = { 16'd0, 12'd294, 4'd0 }; + mem[295] = { 16'd0, 12'd295, 4'd0 }; + mem[296] = { 16'd0, 12'd296, 4'd0 }; + mem[297] = { 16'd0, 12'd297, 4'd0 }; + mem[298] = { 16'd0, 12'd298, 4'd0 }; + mem[299] = { 16'd0, 12'd299, 4'd0 }; + mem[300] = { 16'd0, 12'd300, 4'd0 }; + mem[301] = { 16'd0, 12'd301, 4'd0 }; + mem[302] = { 16'd0, 12'd302, 4'd0 }; + mem[303] = { 16'd0, 12'd303, 4'd0 }; + mem[304] = { 16'd0, 12'd304, 4'd0 }; + mem[305] = { 16'd0, 12'd305, 4'd0 }; + mem[306] = { 16'd0, 12'd306, 4'd0 }; + mem[307] = { 16'd0, 12'd307, 4'd0 }; + mem[308] = { 16'd0, 12'd308, 4'd0 }; + mem[309] = { 16'd0, 12'd309, 4'd0 }; + mem[310] = { 16'd0, 12'd310, 4'd0 }; + mem[311] = { 16'd0, 12'd311, 4'd0 }; + mem[312] = { 16'd0, 12'd312, 4'd0 }; + mem[313] = { 16'd0, 12'd313, 4'd0 }; + mem[314] = { 16'd0, 12'd314, 4'd0 }; + mem[315] = { 16'd0, 12'd315, 4'd0 }; + mem[316] = { 16'd0, 12'd316, 4'd0 }; + mem[317] = { 16'd0, 12'd317, 4'd0 }; + mem[318] = { 16'd0, 12'd318, 4'd0 }; + mem[319] = { 16'd0, 12'd319, 4'd0 }; + mem[320] = { 16'd0, 12'd320, 4'd0 }; + mem[321] = { 16'd0, 12'd321, 4'd0 }; + mem[322] = { 16'd0, 12'd322, 4'd0 }; + mem[323] = { 16'd0, 12'd323, 4'd0 }; + mem[324] = { 16'd0, 12'd324, 4'd0 }; + mem[325] = { 16'd0, 12'd325, 4'd0 }; + mem[326] = { 16'd0, 12'd326, 4'd0 }; + mem[327] = { 16'd0, 12'd327, 4'd0 }; + mem[328] = { 16'd0, 12'd328, 4'd0 }; + mem[329] = { 16'd0, 12'd329, 4'd0 }; + mem[330] = { 16'd0, 12'd330, 4'd0 }; + mem[331] = { 16'd0, 12'd331, 4'd0 }; + mem[332] = { 16'd0, 12'd332, 4'd0 }; + mem[333] = { 16'd0, 12'd333, 4'd0 }; + mem[334] = { 16'd0, 12'd334, 4'd0 }; + mem[335] = { 16'd0, 12'd335, 4'd0 }; + mem[336] = { 16'd0, 12'd336, 4'd0 }; + mem[337] = { 16'd0, 12'd337, 4'd0 }; + mem[338] = { 16'd0, 12'd338, 4'd0 }; + mem[339] = { 16'd0, 12'd339, 4'd0 }; + mem[340] = { 16'd0, 12'd340, 4'd0 }; + mem[341] = { 16'd0, 12'd341, 4'd0 }; + mem[342] = { 16'd0, 12'd342, 4'd0 }; + mem[343] = { 16'd0, 12'd343, 4'd0 }; + mem[344] = { 16'd0, 12'd344, 4'd0 }; + mem[345] = { 16'd0, 12'd345, 4'd0 }; + mem[346] = { 16'd0, 12'd346, 4'd0 }; + mem[347] = { 16'd0, 12'd347, 4'd0 }; + mem[348] = { 16'd0, 12'd348, 4'd0 }; + mem[349] = { 16'd0, 12'd349, 4'd0 }; + mem[350] = { 16'd0, 12'd350, 4'd0 }; + mem[351] = { 16'd0, 12'd351, 4'd0 }; + mem[352] = { 16'd0, 12'd352, 4'd0 }; + mem[353] = { 16'd0, 12'd353, 4'd0 }; + mem[354] = { 16'd0, 12'd354, 4'd0 }; + mem[355] = { 16'd0, 12'd355, 4'd0 }; + mem[356] = { 16'd0, 12'd356, 4'd0 }; + mem[357] = { 16'd0, 12'd357, 4'd0 }; + mem[358] = { 16'd0, 12'd358, 4'd0 }; + mem[359] = { 16'd0, 12'd359, 4'd0 }; + mem[360] = { 16'd0, 12'd360, 4'd0 }; + mem[361] = { 16'd0, 12'd361, 4'd0 }; + mem[362] = { 16'd0, 12'd362, 4'd0 }; + mem[363] = { 16'd0, 12'd363, 4'd0 }; + mem[364] = { 16'd0, 12'd364, 4'd0 }; + mem[365] = { 16'd0, 12'd365, 4'd0 }; + mem[366] = { 16'd0, 12'd366, 4'd0 }; + mem[367] = { 16'd0, 12'd367, 4'd0 }; + mem[368] = { 16'd0, 12'd368, 4'd0 }; + mem[369] = { 16'd0, 12'd369, 4'd0 }; + mem[370] = { 16'd0, 12'd370, 4'd0 }; + mem[371] = { 16'd0, 12'd371, 4'd0 }; + mem[372] = { 16'd0, 12'd372, 4'd0 }; + mem[373] = { 16'd0, 12'd373, 4'd0 }; + mem[374] = { 16'd0, 12'd374, 4'd0 }; + mem[375] = { 16'd0, 12'd375, 4'd0 }; + mem[376] = { 16'd0, 12'd376, 4'd0 }; + mem[377] = { 16'd0, 12'd377, 4'd0 }; + mem[378] = { 16'd0, 12'd378, 4'd0 }; + mem[379] = { 16'd0, 12'd379, 4'd0 }; + mem[380] = { 16'd0, 12'd380, 4'd0 }; + mem[381] = { 16'd0, 12'd381, 4'd0 }; + mem[382] = { 16'd0, 12'd382, 4'd0 }; + mem[383] = { 16'd0, 12'd383, 4'd0 }; + mem[384] = { 16'd0, 12'd384, 4'd0 }; + mem[385] = { 16'd0, 12'd385, 4'd0 }; + mem[386] = { 16'd0, 12'd386, 4'd0 }; + mem[387] = { 16'd0, 12'd387, 4'd0 }; + mem[388] = { 16'd0, 12'd388, 4'd0 }; + mem[389] = { 16'd0, 12'd389, 4'd0 }; + mem[390] = { 16'd0, 12'd390, 4'd0 }; + mem[391] = { 16'd0, 12'd391, 4'd0 }; + mem[392] = { 16'd0, 12'd392, 4'd0 }; + mem[393] = { 16'd0, 12'd393, 4'd0 }; + mem[394] = { 16'd0, 12'd394, 4'd0 }; + mem[395] = { 16'd0, 12'd395, 4'd0 }; + mem[396] = { 16'd0, 12'd396, 4'd0 }; + mem[397] = { 16'd0, 12'd397, 4'd0 }; + mem[398] = { 16'd0, 12'd398, 4'd0 }; + mem[399] = { 16'd0, 12'd399, 4'd0 }; + mem[400] = { 16'd0, 12'd400, 4'd0 }; + mem[401] = { 16'd0, 12'd401, 4'd0 }; + mem[402] = { 16'd0, 12'd402, 4'd0 }; + mem[403] = { 16'd0, 12'd403, 4'd0 }; + mem[404] = { 16'd0, 12'd404, 4'd0 }; + mem[405] = { 16'd0, 12'd405, 4'd0 }; + mem[406] = { 16'd0, 12'd406, 4'd0 }; + mem[407] = { 16'd0, 12'd407, 4'd0 }; + mem[408] = { 16'd0, 12'd408, 4'd0 }; + mem[409] = { 16'd0, 12'd409, 4'd0 }; + mem[410] = { 16'd0, 12'd410, 4'd0 }; + mem[411] = { 16'd0, 12'd411, 4'd0 }; + mem[412] = { 16'd0, 12'd412, 4'd0 }; + mem[413] = { 16'd0, 12'd413, 4'd0 }; + mem[414] = { 16'd0, 12'd414, 4'd0 }; + mem[415] = { 16'd0, 12'd415, 4'd0 }; + mem[416] = { 16'd0, 12'd416, 4'd0 }; + mem[417] = { 16'd0, 12'd417, 4'd0 }; + mem[418] = { 16'd0, 12'd418, 4'd0 }; + mem[419] = { 16'd0, 12'd419, 4'd0 }; + mem[420] = { 16'd0, 12'd420, 4'd0 }; + mem[421] = { 16'd0, 12'd421, 4'd0 }; + mem[422] = { 16'd0, 12'd422, 4'd0 }; + mem[423] = { 16'd0, 12'd423, 4'd0 }; + mem[424] = { 16'd0, 12'd424, 4'd0 }; + mem[425] = { 16'd0, 12'd425, 4'd0 }; + mem[426] = { 16'd0, 12'd426, 4'd0 }; + mem[427] = { 16'd0, 12'd427, 4'd0 }; + mem[428] = { 16'd0, 12'd428, 4'd0 }; + mem[429] = { 16'd0, 12'd429, 4'd0 }; + mem[430] = { 16'd0, 12'd430, 4'd0 }; + mem[431] = { 16'd0, 12'd431, 4'd0 }; + mem[432] = { 16'd0, 12'd432, 4'd0 }; + mem[433] = { 16'd0, 12'd433, 4'd0 }; + mem[434] = { 16'd0, 12'd434, 4'd0 }; + mem[435] = { 16'd0, 12'd435, 4'd0 }; + mem[436] = { 16'd0, 12'd436, 4'd0 }; + mem[437] = { 16'd0, 12'd437, 4'd0 }; + mem[438] = { 16'd0, 12'd438, 4'd0 }; + mem[439] = { 16'd0, 12'd439, 4'd0 }; + mem[440] = { 16'd0, 12'd440, 4'd0 }; + mem[441] = { 16'd0, 12'd441, 4'd0 }; + mem[442] = { 16'd0, 12'd442, 4'd0 }; + mem[443] = { 16'd0, 12'd443, 4'd0 }; + mem[444] = { 16'd0, 12'd444, 4'd0 }; + mem[445] = { 16'd0, 12'd445, 4'd0 }; + mem[446] = { 16'd0, 12'd446, 4'd0 }; + mem[447] = { 16'd0, 12'd447, 4'd0 }; + mem[448] = { 16'd0, 12'd448, 4'd0 }; + mem[449] = { 16'd0, 12'd449, 4'd0 }; + mem[450] = { 16'd0, 12'd450, 4'd0 }; + mem[451] = { 16'd0, 12'd451, 4'd0 }; + mem[452] = { 16'd0, 12'd452, 4'd0 }; + mem[453] = { 16'd0, 12'd453, 4'd0 }; + mem[454] = { 16'd0, 12'd454, 4'd0 }; + mem[455] = { 16'd0, 12'd455, 4'd0 }; + mem[456] = { 16'd0, 12'd456, 4'd0 }; + mem[457] = { 16'd0, 12'd457, 4'd0 }; + mem[458] = { 16'd0, 12'd458, 4'd0 }; + mem[459] = { 16'd0, 12'd459, 4'd0 }; + mem[460] = { 16'd0, 12'd460, 4'd0 }; + mem[461] = { 16'd0, 12'd461, 4'd0 }; + mem[462] = { 16'd0, 12'd462, 4'd0 }; + mem[463] = { 16'd0, 12'd463, 4'd0 }; + mem[464] = { 16'd0, 12'd464, 4'd0 }; + mem[465] = { 16'd0, 12'd465, 4'd0 }; + mem[466] = { 16'd0, 12'd466, 4'd0 }; + mem[467] = { 16'd0, 12'd467, 4'd0 }; + mem[468] = { 16'd0, 12'd468, 4'd0 }; + mem[469] = { 16'd0, 12'd469, 4'd0 }; + mem[470] = { 16'd0, 12'd470, 4'd0 }; + mem[471] = { 16'd0, 12'd471, 4'd0 }; + mem[472] = { 16'd0, 12'd472, 4'd0 }; + mem[473] = { 16'd0, 12'd473, 4'd0 }; + mem[474] = { 16'd0, 12'd474, 4'd0 }; + mem[475] = { 16'd0, 12'd475, 4'd0 }; + mem[476] = { 16'd0, 12'd476, 4'd0 }; + mem[477] = { 16'd0, 12'd477, 4'd0 }; + mem[478] = { 16'd0, 12'd478, 4'd0 }; + mem[479] = { 16'd0, 12'd479, 4'd0 }; + mem[480] = { 16'd0, 12'd480, 4'd0 }; + mem[481] = { 16'd0, 12'd481, 4'd0 }; + mem[482] = { 16'd0, 12'd482, 4'd0 }; + mem[483] = { 16'd0, 12'd483, 4'd0 }; + mem[484] = { 16'd0, 12'd484, 4'd0 }; + mem[485] = { 16'd0, 12'd485, 4'd0 }; + mem[486] = { 16'd0, 12'd486, 4'd0 }; + mem[487] = { 16'd0, 12'd487, 4'd0 }; + mem[488] = { 16'd0, 12'd488, 4'd0 }; + mem[489] = { 16'd0, 12'd489, 4'd0 }; + mem[490] = { 16'd0, 12'd490, 4'd0 }; + mem[491] = { 16'd0, 12'd491, 4'd0 }; + mem[492] = { 16'd0, 12'd492, 4'd0 }; + mem[493] = { 16'd0, 12'd493, 4'd0 }; + mem[494] = { 16'd0, 12'd494, 4'd0 }; + mem[495] = { 16'd0, 12'd495, 4'd0 }; + mem[496] = { 16'd0, 12'd496, 4'd0 }; + mem[497] = { 16'd0, 12'd497, 4'd0 }; + mem[498] = { 16'd0, 12'd498, 4'd0 }; + mem[499] = { 16'd0, 12'd499, 4'd0 }; + mem[500] = { 16'd0, 12'd500, 4'd0 }; + mem[501] = { 16'd0, 12'd501, 4'd0 }; + mem[502] = { 16'd0, 12'd502, 4'd0 }; + mem[503] = { 16'd0, 12'd503, 4'd0 }; + mem[504] = { 16'd0, 12'd504, 4'd0 }; + mem[505] = { 16'd0, 12'd505, 4'd0 }; + mem[506] = { 16'd0, 12'd506, 4'd0 }; + mem[507] = { 16'd0, 12'd507, 4'd0 }; + mem[508] = { 16'd0, 12'd508, 4'd0 }; + mem[509] = { 16'd0, 12'd509, 4'd0 }; + mem[510] = { 16'd0, 12'd510, 4'd0 }; + mem[511] = { 16'd0, 12'd511, 4'd0 }; + mem[512] = { 16'd0, 12'd512, 4'd0 }; + mem[513] = { 16'd0, 12'd513, 4'd0 }; + mem[514] = { 16'd0, 12'd514, 4'd0 }; + mem[515] = { 16'd0, 12'd515, 4'd0 }; + mem[516] = { 16'd0, 12'd516, 4'd0 }; + mem[517] = { 16'd0, 12'd517, 4'd0 }; + mem[518] = { 16'd0, 12'd518, 4'd0 }; + mem[519] = { 16'd0, 12'd519, 4'd0 }; + mem[520] = { 16'd0, 12'd520, 4'd0 }; + mem[521] = { 16'd0, 12'd521, 4'd0 }; + mem[522] = { 16'd0, 12'd522, 4'd0 }; + mem[523] = { 16'd0, 12'd523, 4'd0 }; + mem[524] = { 16'd0, 12'd524, 4'd0 }; + mem[525] = { 16'd0, 12'd525, 4'd0 }; + mem[526] = { 16'd0, 12'd526, 4'd0 }; + mem[527] = { 16'd0, 12'd527, 4'd0 }; + mem[528] = { 16'd0, 12'd528, 4'd0 }; + mem[529] = { 16'd0, 12'd529, 4'd0 }; + mem[530] = { 16'd0, 12'd530, 4'd0 }; + mem[531] = { 16'd0, 12'd531, 4'd0 }; + mem[532] = { 16'd0, 12'd532, 4'd0 }; + mem[533] = { 16'd0, 12'd533, 4'd0 }; + mem[534] = { 16'd0, 12'd534, 4'd0 }; + mem[535] = { 16'd0, 12'd535, 4'd0 }; + mem[536] = { 16'd0, 12'd536, 4'd0 }; + mem[537] = { 16'd0, 12'd537, 4'd0 }; + mem[538] = { 16'd0, 12'd538, 4'd0 }; + mem[539] = { 16'd0, 12'd539, 4'd0 }; + mem[540] = { 16'd0, 12'd540, 4'd0 }; + mem[541] = { 16'd0, 12'd541, 4'd0 }; + mem[542] = { 16'd0, 12'd542, 4'd0 }; + mem[543] = { 16'd0, 12'd543, 4'd0 }; + mem[544] = { 16'd0, 12'd544, 4'd0 }; + mem[545] = { 16'd0, 12'd545, 4'd0 }; + mem[546] = { 16'd0, 12'd546, 4'd0 }; + mem[547] = { 16'd0, 12'd547, 4'd0 }; + mem[548] = { 16'd0, 12'd548, 4'd0 }; + mem[549] = { 16'd0, 12'd549, 4'd0 }; + mem[550] = { 16'd0, 12'd550, 4'd0 }; + mem[551] = { 16'd0, 12'd551, 4'd0 }; + mem[552] = { 16'd0, 12'd552, 4'd0 }; + mem[553] = { 16'd0, 12'd553, 4'd0 }; + mem[554] = { 16'd0, 12'd554, 4'd0 }; + mem[555] = { 16'd0, 12'd555, 4'd0 }; + mem[556] = { 16'd0, 12'd556, 4'd0 }; + mem[557] = { 16'd0, 12'd557, 4'd0 }; + mem[558] = { 16'd0, 12'd558, 4'd0 }; + mem[559] = { 16'd0, 12'd559, 4'd0 }; + mem[560] = { 16'd0, 12'd560, 4'd0 }; + mem[561] = { 16'd0, 12'd561, 4'd0 }; + mem[562] = { 16'd0, 12'd562, 4'd0 }; + mem[563] = { 16'd0, 12'd563, 4'd0 }; + mem[564] = { 16'd0, 12'd564, 4'd0 }; + mem[565] = { 16'd0, 12'd565, 4'd0 }; + mem[566] = { 16'd0, 12'd566, 4'd0 }; + mem[567] = { 16'd0, 12'd567, 4'd0 }; + mem[568] = { 16'd0, 12'd568, 4'd0 }; + mem[569] = { 16'd0, 12'd569, 4'd0 }; + mem[570] = { 16'd0, 12'd570, 4'd0 }; + mem[571] = { 16'd0, 12'd571, 4'd0 }; + mem[572] = { 16'd0, 12'd572, 4'd0 }; + mem[573] = { 16'd0, 12'd573, 4'd0 }; + mem[574] = { 16'd0, 12'd574, 4'd0 }; + mem[575] = { 16'd0, 12'd575, 4'd0 }; + mem[576] = { 16'd0, 12'd576, 4'd0 }; + mem[577] = { 16'd0, 12'd577, 4'd0 }; + mem[578] = { 16'd0, 12'd578, 4'd0 }; + mem[579] = { 16'd0, 12'd579, 4'd0 }; + mem[580] = { 16'd0, 12'd580, 4'd0 }; + mem[581] = { 16'd0, 12'd581, 4'd0 }; + mem[582] = { 16'd0, 12'd582, 4'd0 }; + mem[583] = { 16'd0, 12'd583, 4'd0 }; + mem[584] = { 16'd0, 12'd584, 4'd0 }; + mem[585] = { 16'd0, 12'd585, 4'd0 }; + mem[586] = { 16'd0, 12'd586, 4'd0 }; + mem[587] = { 16'd0, 12'd587, 4'd0 }; + mem[588] = { 16'd0, 12'd588, 4'd0 }; + mem[589] = { 16'd0, 12'd589, 4'd0 }; + mem[590] = { 16'd0, 12'd590, 4'd0 }; + mem[591] = { 16'd0, 12'd591, 4'd0 }; + mem[592] = { 16'd0, 12'd592, 4'd0 }; + mem[593] = { 16'd0, 12'd593, 4'd0 }; + mem[594] = { 16'd0, 12'd594, 4'd0 }; + mem[595] = { 16'd0, 12'd595, 4'd0 }; + mem[596] = { 16'd0, 12'd596, 4'd0 }; + mem[597] = { 16'd0, 12'd597, 4'd0 }; + mem[598] = { 16'd0, 12'd598, 4'd0 }; + mem[599] = { 16'd0, 12'd599, 4'd0 }; + mem[600] = { 16'd0, 12'd600, 4'd0 }; + mem[601] = { 16'd0, 12'd601, 4'd0 }; + mem[602] = { 16'd0, 12'd602, 4'd0 }; + mem[603] = { 16'd0, 12'd603, 4'd0 }; + mem[604] = { 16'd0, 12'd604, 4'd0 }; + mem[605] = { 16'd0, 12'd605, 4'd0 }; + mem[606] = { 16'd0, 12'd606, 4'd0 }; + mem[607] = { 16'd0, 12'd607, 4'd0 }; + mem[608] = { 16'd0, 12'd608, 4'd0 }; + mem[609] = { 16'd0, 12'd609, 4'd0 }; + mem[610] = { 16'd0, 12'd610, 4'd0 }; + mem[611] = { 16'd0, 12'd611, 4'd0 }; + mem[612] = { 16'd0, 12'd612, 4'd0 }; + mem[613] = { 16'd0, 12'd613, 4'd0 }; + mem[614] = { 16'd0, 12'd614, 4'd0 }; + mem[615] = { 16'd0, 12'd615, 4'd0 }; + mem[616] = { 16'd0, 12'd616, 4'd0 }; + mem[617] = { 16'd0, 12'd617, 4'd0 }; + mem[618] = { 16'd0, 12'd618, 4'd0 }; + mem[619] = { 16'd0, 12'd619, 4'd0 }; + mem[620] = { 16'd0, 12'd620, 4'd0 }; + mem[621] = { 16'd0, 12'd621, 4'd0 }; + mem[622] = { 16'd0, 12'd622, 4'd0 }; + mem[623] = { 16'd0, 12'd623, 4'd0 }; + mem[624] = { 16'd0, 12'd624, 4'd0 }; + mem[625] = { 16'd0, 12'd625, 4'd0 }; + mem[626] = { 16'd0, 12'd626, 4'd0 }; + mem[627] = { 16'd0, 12'd627, 4'd0 }; + mem[628] = { 16'd0, 12'd628, 4'd0 }; + mem[629] = { 16'd0, 12'd629, 4'd0 }; + mem[630] = { 16'd0, 12'd630, 4'd0 }; + mem[631] = { 16'd0, 12'd631, 4'd0 }; + mem[632] = { 16'd0, 12'd632, 4'd0 }; + mem[633] = { 16'd0, 12'd633, 4'd0 }; + mem[634] = { 16'd0, 12'd634, 4'd0 }; + mem[635] = { 16'd0, 12'd635, 4'd0 }; + mem[636] = { 16'd0, 12'd636, 4'd0 }; + mem[637] = { 16'd0, 12'd637, 4'd0 }; + mem[638] = { 16'd0, 12'd638, 4'd0 }; + mem[639] = { 16'd0, 12'd639, 4'd0 }; + mem[640] = { 16'd0, 12'd640, 4'd0 }; + mem[641] = { 16'd0, 12'd641, 4'd0 }; + mem[642] = { 16'd0, 12'd642, 4'd0 }; + mem[643] = { 16'd0, 12'd643, 4'd0 }; + mem[644] = { 16'd0, 12'd644, 4'd0 }; + mem[645] = { 16'd0, 12'd645, 4'd0 }; + mem[646] = { 16'd0, 12'd646, 4'd0 }; + mem[647] = { 16'd0, 12'd647, 4'd0 }; + mem[648] = { 16'd0, 12'd648, 4'd0 }; + mem[649] = { 16'd0, 12'd649, 4'd0 }; + mem[650] = { 16'd0, 12'd650, 4'd0 }; + mem[651] = { 16'd0, 12'd651, 4'd0 }; + mem[652] = { 16'd0, 12'd652, 4'd0 }; + mem[653] = { 16'd0, 12'd653, 4'd0 }; + mem[654] = { 16'd0, 12'd654, 4'd0 }; + mem[655] = { 16'd0, 12'd655, 4'd0 }; + mem[656] = { 16'd0, 12'd656, 4'd0 }; + mem[657] = { 16'd0, 12'd657, 4'd0 }; + mem[658] = { 16'd0, 12'd658, 4'd0 }; + mem[659] = { 16'd0, 12'd659, 4'd0 }; + mem[660] = { 16'd0, 12'd660, 4'd0 }; + mem[661] = { 16'd0, 12'd661, 4'd0 }; + mem[662] = { 16'd0, 12'd662, 4'd0 }; + mem[663] = { 16'd0, 12'd663, 4'd0 }; + mem[664] = { 16'd0, 12'd664, 4'd0 }; + mem[665] = { 16'd0, 12'd665, 4'd0 }; + mem[666] = { 16'd0, 12'd666, 4'd0 }; + mem[667] = { 16'd0, 12'd667, 4'd0 }; + mem[668] = { 16'd0, 12'd668, 4'd0 }; + mem[669] = { 16'd0, 12'd669, 4'd0 }; + mem[670] = { 16'd0, 12'd670, 4'd0 }; + mem[671] = { 16'd0, 12'd671, 4'd0 }; + mem[672] = { 16'd0, 12'd672, 4'd0 }; + mem[673] = { 16'd0, 12'd673, 4'd0 }; + mem[674] = { 16'd0, 12'd674, 4'd0 }; + mem[675] = { 16'd0, 12'd675, 4'd0 }; + mem[676] = { 16'd0, 12'd676, 4'd0 }; + mem[677] = { 16'd0, 12'd677, 4'd0 }; + mem[678] = { 16'd0, 12'd678, 4'd0 }; + mem[679] = { 16'd0, 12'd679, 4'd0 }; + mem[680] = { 16'd0, 12'd680, 4'd0 }; + mem[681] = { 16'd0, 12'd681, 4'd0 }; + mem[682] = { 16'd0, 12'd682, 4'd0 }; + mem[683] = { 16'd0, 12'd683, 4'd0 }; + mem[684] = { 16'd0, 12'd684, 4'd0 }; + mem[685] = { 16'd0, 12'd685, 4'd0 }; + mem[686] = { 16'd0, 12'd686, 4'd0 }; + mem[687] = { 16'd0, 12'd687, 4'd0 }; + mem[688] = { 16'd0, 12'd688, 4'd0 }; + mem[689] = { 16'd0, 12'd689, 4'd0 }; + mem[690] = { 16'd0, 12'd690, 4'd0 }; + mem[691] = { 16'd0, 12'd691, 4'd0 }; + mem[692] = { 16'd0, 12'd692, 4'd0 }; + mem[693] = { 16'd0, 12'd693, 4'd0 }; + mem[694] = { 16'd0, 12'd694, 4'd0 }; + mem[695] = { 16'd0, 12'd695, 4'd0 }; + mem[696] = { 16'd0, 12'd696, 4'd0 }; + mem[697] = { 16'd0, 12'd697, 4'd0 }; + mem[698] = { 16'd0, 12'd698, 4'd0 }; + mem[699] = { 16'd0, 12'd699, 4'd0 }; + mem[700] = { 16'd0, 12'd700, 4'd0 }; + mem[701] = { 16'd0, 12'd701, 4'd0 }; + mem[702] = { 16'd0, 12'd702, 4'd0 }; + mem[703] = { 16'd0, 12'd703, 4'd0 }; + mem[704] = { 16'd0, 12'd704, 4'd0 }; + mem[705] = { 16'd0, 12'd705, 4'd0 }; + mem[706] = { 16'd0, 12'd706, 4'd0 }; + mem[707] = { 16'd0, 12'd707, 4'd0 }; + mem[708] = { 16'd0, 12'd708, 4'd0 }; + mem[709] = { 16'd0, 12'd709, 4'd0 }; + mem[710] = { 16'd0, 12'd710, 4'd0 }; + mem[711] = { 16'd0, 12'd711, 4'd0 }; + mem[712] = { 16'd0, 12'd712, 4'd0 }; + mem[713] = { 16'd0, 12'd713, 4'd0 }; + mem[714] = { 16'd0, 12'd714, 4'd0 }; + mem[715] = { 16'd0, 12'd715, 4'd0 }; + mem[716] = { 16'd0, 12'd716, 4'd0 }; + mem[717] = { 16'd0, 12'd717, 4'd0 }; + mem[718] = { 16'd0, 12'd718, 4'd0 }; + mem[719] = { 16'd0, 12'd719, 4'd0 }; + mem[720] = { 16'd0, 12'd720, 4'd0 }; + mem[721] = { 16'd0, 12'd721, 4'd0 }; + mem[722] = { 16'd0, 12'd722, 4'd0 }; + mem[723] = { 16'd0, 12'd723, 4'd0 }; + mem[724] = { 16'd0, 12'd724, 4'd0 }; + mem[725] = { 16'd0, 12'd725, 4'd0 }; + mem[726] = { 16'd0, 12'd726, 4'd0 }; + mem[727] = { 16'd0, 12'd727, 4'd0 }; + mem[728] = { 16'd0, 12'd728, 4'd0 }; + mem[729] = { 16'd0, 12'd729, 4'd0 }; + mem[730] = { 16'd0, 12'd730, 4'd0 }; + mem[731] = { 16'd0, 12'd731, 4'd0 }; + mem[732] = { 16'd0, 12'd732, 4'd0 }; + mem[733] = { 16'd0, 12'd733, 4'd0 }; + mem[734] = { 16'd0, 12'd734, 4'd0 }; + mem[735] = { 16'd0, 12'd735, 4'd0 }; + mem[736] = { 16'd0, 12'd736, 4'd0 }; + mem[737] = { 16'd0, 12'd737, 4'd0 }; + mem[738] = { 16'd0, 12'd738, 4'd0 }; + mem[739] = { 16'd0, 12'd739, 4'd0 }; + mem[740] = { 16'd0, 12'd740, 4'd0 }; + mem[741] = { 16'd0, 12'd741, 4'd0 }; + mem[742] = { 16'd0, 12'd742, 4'd0 }; + mem[743] = { 16'd0, 12'd743, 4'd0 }; + mem[744] = { 16'd0, 12'd744, 4'd0 }; + mem[745] = { 16'd0, 12'd745, 4'd0 }; + mem[746] = { 16'd0, 12'd746, 4'd0 }; + mem[747] = { 16'd0, 12'd747, 4'd0 }; + mem[748] = { 16'd0, 12'd748, 4'd0 }; + mem[749] = { 16'd0, 12'd749, 4'd0 }; + mem[750] = { 16'd0, 12'd750, 4'd0 }; + mem[751] = { 16'd0, 12'd751, 4'd0 }; + mem[752] = { 16'd0, 12'd752, 4'd0 }; + mem[753] = { 16'd0, 12'd753, 4'd0 }; + mem[754] = { 16'd0, 12'd754, 4'd0 }; + mem[755] = { 16'd0, 12'd755, 4'd0 }; + mem[756] = { 16'd0, 12'd756, 4'd0 }; + mem[757] = { 16'd0, 12'd757, 4'd0 }; + mem[758] = { 16'd0, 12'd758, 4'd0 }; + mem[759] = { 16'd0, 12'd759, 4'd0 }; + mem[760] = { 16'd0, 12'd760, 4'd0 }; + mem[761] = { 16'd0, 12'd761, 4'd0 }; + mem[762] = { 16'd0, 12'd762, 4'd0 }; + mem[763] = { 16'd0, 12'd763, 4'd0 }; + mem[764] = { 16'd0, 12'd764, 4'd0 }; + mem[765] = { 16'd0, 12'd765, 4'd0 }; + mem[766] = { 16'd0, 12'd766, 4'd0 }; + mem[767] = { 16'd0, 12'd767, 4'd0 }; + mem[768] = { 16'd0, 12'd768, 4'd0 }; + mem[769] = { 16'd0, 12'd769, 4'd0 }; + mem[770] = { 16'd0, 12'd770, 4'd0 }; + mem[771] = { 16'd0, 12'd771, 4'd0 }; + mem[772] = { 16'd0, 12'd772, 4'd0 }; + mem[773] = { 16'd0, 12'd773, 4'd0 }; + mem[774] = { 16'd0, 12'd774, 4'd0 }; + mem[775] = { 16'd0, 12'd775, 4'd0 }; + mem[776] = { 16'd0, 12'd776, 4'd0 }; + mem[777] = { 16'd0, 12'd777, 4'd0 }; + mem[778] = { 16'd0, 12'd778, 4'd0 }; + mem[779] = { 16'd0, 12'd779, 4'd0 }; + mem[780] = { 16'd0, 12'd780, 4'd0 }; + mem[781] = { 16'd0, 12'd781, 4'd0 }; + mem[782] = { 16'd0, 12'd782, 4'd0 }; + mem[783] = { 16'd0, 12'd783, 4'd0 }; + mem[784] = { 16'd0, 12'd784, 4'd0 }; + mem[785] = { 16'd0, 12'd785, 4'd0 }; + mem[786] = { 16'd0, 12'd786, 4'd0 }; + mem[787] = { 16'd0, 12'd787, 4'd0 }; + mem[788] = { 16'd0, 12'd788, 4'd0 }; + mem[789] = { 16'd0, 12'd789, 4'd0 }; + mem[790] = { 16'd0, 12'd790, 4'd0 }; + mem[791] = { 16'd0, 12'd791, 4'd0 }; + mem[792] = { 16'd0, 12'd792, 4'd0 }; + mem[793] = { 16'd0, 12'd793, 4'd0 }; + mem[794] = { 16'd0, 12'd794, 4'd0 }; + mem[795] = { 16'd0, 12'd795, 4'd0 }; + mem[796] = { 16'd0, 12'd796, 4'd0 }; + mem[797] = { 16'd0, 12'd797, 4'd0 }; + mem[798] = { 16'd0, 12'd798, 4'd0 }; + mem[799] = { 16'd0, 12'd799, 4'd0 }; + mem[800] = { 16'd0, 12'd800, 4'd0 }; + mem[801] = { 16'd0, 12'd801, 4'd0 }; + mem[802] = { 16'd0, 12'd802, 4'd0 }; + mem[803] = { 16'd0, 12'd803, 4'd0 }; + mem[804] = { 16'd0, 12'd804, 4'd0 }; + mem[805] = { 16'd0, 12'd805, 4'd0 }; + mem[806] = { 16'd0, 12'd806, 4'd0 }; + mem[807] = { 16'd0, 12'd807, 4'd0 }; + mem[808] = { 16'd0, 12'd808, 4'd0 }; + mem[809] = { 16'd0, 12'd809, 4'd0 }; + mem[810] = { 16'd0, 12'd810, 4'd0 }; + mem[811] = { 16'd0, 12'd811, 4'd0 }; + mem[812] = { 16'd0, 12'd812, 4'd0 }; + mem[813] = { 16'd0, 12'd813, 4'd0 }; + mem[814] = { 16'd0, 12'd814, 4'd0 }; + mem[815] = { 16'd0, 12'd815, 4'd0 }; + mem[816] = { 16'd0, 12'd816, 4'd0 }; + mem[817] = { 16'd0, 12'd817, 4'd0 }; + mem[818] = { 16'd0, 12'd818, 4'd0 }; + mem[819] = { 16'd0, 12'd819, 4'd0 }; + mem[820] = { 16'd0, 12'd820, 4'd0 }; + mem[821] = { 16'd0, 12'd821, 4'd0 }; + mem[822] = { 16'd0, 12'd822, 4'd0 }; + mem[823] = { 16'd0, 12'd823, 4'd0 }; + mem[824] = { 16'd0, 12'd824, 4'd0 }; + mem[825] = { 16'd0, 12'd825, 4'd0 }; + mem[826] = { 16'd0, 12'd826, 4'd0 }; + mem[827] = { 16'd0, 12'd827, 4'd0 }; + mem[828] = { 16'd0, 12'd828, 4'd0 }; + mem[829] = { 16'd0, 12'd829, 4'd0 }; + mem[830] = { 16'd0, 12'd830, 4'd0 }; + mem[831] = { 16'd0, 12'd831, 4'd0 }; + mem[832] = { 16'd0, 12'd832, 4'd0 }; + mem[833] = { 16'd0, 12'd833, 4'd0 }; + mem[834] = { 16'd0, 12'd834, 4'd0 }; + mem[835] = { 16'd0, 12'd835, 4'd0 }; + mem[836] = { 16'd0, 12'd836, 4'd0 }; + mem[837] = { 16'd0, 12'd837, 4'd0 }; + mem[838] = { 16'd0, 12'd838, 4'd0 }; + mem[839] = { 16'd0, 12'd839, 4'd0 }; + mem[840] = { 16'd0, 12'd840, 4'd0 }; + mem[841] = { 16'd0, 12'd841, 4'd0 }; + mem[842] = { 16'd0, 12'd842, 4'd0 }; + mem[843] = { 16'd0, 12'd843, 4'd0 }; + mem[844] = { 16'd0, 12'd844, 4'd0 }; + mem[845] = { 16'd0, 12'd845, 4'd0 }; + mem[846] = { 16'd0, 12'd846, 4'd0 }; + mem[847] = { 16'd0, 12'd847, 4'd0 }; + mem[848] = { 16'd0, 12'd848, 4'd0 }; + mem[849] = { 16'd0, 12'd849, 4'd0 }; + mem[850] = { 16'd0, 12'd850, 4'd0 }; + mem[851] = { 16'd0, 12'd851, 4'd0 }; + mem[852] = { 16'd0, 12'd852, 4'd0 }; + mem[853] = { 16'd0, 12'd853, 4'd0 }; + mem[854] = { 16'd0, 12'd854, 4'd0 }; + mem[855] = { 16'd0, 12'd855, 4'd0 }; + mem[856] = { 16'd0, 12'd856, 4'd0 }; + mem[857] = { 16'd0, 12'd857, 4'd0 }; + mem[858] = { 16'd0, 12'd858, 4'd0 }; + mem[859] = { 16'd0, 12'd859, 4'd0 }; + mem[860] = { 16'd0, 12'd860, 4'd0 }; + mem[861] = { 16'd0, 12'd861, 4'd0 }; + mem[862] = { 16'd0, 12'd862, 4'd0 }; + mem[863] = { 16'd0, 12'd863, 4'd0 }; + mem[864] = { 16'd0, 12'd864, 4'd0 }; + mem[865] = { 16'd0, 12'd865, 4'd0 }; + mem[866] = { 16'd0, 12'd866, 4'd0 }; + mem[867] = { 16'd0, 12'd867, 4'd0 }; + mem[868] = { 16'd0, 12'd868, 4'd0 }; + mem[869] = { 16'd0, 12'd869, 4'd0 }; + mem[870] = { 16'd0, 12'd870, 4'd0 }; + mem[871] = { 16'd0, 12'd871, 4'd0 }; + mem[872] = { 16'd0, 12'd872, 4'd0 }; + mem[873] = { 16'd0, 12'd873, 4'd0 }; + mem[874] = { 16'd0, 12'd874, 4'd0 }; + mem[875] = { 16'd0, 12'd875, 4'd0 }; + mem[876] = { 16'd0, 12'd876, 4'd0 }; + mem[877] = { 16'd0, 12'd877, 4'd0 }; + mem[878] = { 16'd0, 12'd878, 4'd0 }; + mem[879] = { 16'd0, 12'd879, 4'd0 }; + mem[880] = { 16'd0, 12'd880, 4'd0 }; + mem[881] = { 16'd0, 12'd881, 4'd0 }; + mem[882] = { 16'd0, 12'd882, 4'd0 }; + mem[883] = { 16'd0, 12'd883, 4'd0 }; + mem[884] = { 16'd0, 12'd884, 4'd0 }; + mem[885] = { 16'd0, 12'd885, 4'd0 }; + mem[886] = { 16'd0, 12'd886, 4'd0 }; + mem[887] = { 16'd0, 12'd887, 4'd0 }; + mem[888] = { 16'd0, 12'd888, 4'd0 }; + mem[889] = { 16'd0, 12'd889, 4'd0 }; + mem[890] = { 16'd0, 12'd890, 4'd0 }; + mem[891] = { 16'd0, 12'd891, 4'd0 }; + mem[892] = { 16'd0, 12'd892, 4'd0 }; + mem[893] = { 16'd0, 12'd893, 4'd0 }; + mem[894] = { 16'd0, 12'd894, 4'd0 }; + mem[895] = { 16'd0, 12'd895, 4'd0 }; + mem[896] = { 16'd0, 12'd896, 4'd0 }; + mem[897] = { 16'd0, 12'd897, 4'd0 }; + mem[898] = { 16'd0, 12'd898, 4'd0 }; + mem[899] = { 16'd0, 12'd899, 4'd0 }; + mem[900] = { 16'd0, 12'd900, 4'd0 }; + mem[901] = { 16'd0, 12'd901, 4'd0 }; + mem[902] = { 16'd0, 12'd902, 4'd0 }; + mem[903] = { 16'd0, 12'd903, 4'd0 }; + mem[904] = { 16'd0, 12'd904, 4'd0 }; + mem[905] = { 16'd0, 12'd905, 4'd0 }; + mem[906] = { 16'd0, 12'd906, 4'd0 }; + mem[907] = { 16'd0, 12'd907, 4'd0 }; + mem[908] = { 16'd0, 12'd908, 4'd0 }; + mem[909] = { 16'd0, 12'd909, 4'd0 }; + mem[910] = { 16'd0, 12'd910, 4'd0 }; + mem[911] = { 16'd0, 12'd911, 4'd0 }; + mem[912] = { 16'd0, 12'd912, 4'd0 }; + mem[913] = { 16'd0, 12'd913, 4'd0 }; + mem[914] = { 16'd0, 12'd914, 4'd0 }; + mem[915] = { 16'd0, 12'd915, 4'd0 }; + mem[916] = { 16'd0, 12'd916, 4'd0 }; + mem[917] = { 16'd0, 12'd917, 4'd0 }; + mem[918] = { 16'd0, 12'd918, 4'd0 }; + mem[919] = { 16'd0, 12'd919, 4'd0 }; + mem[920] = { 16'd0, 12'd920, 4'd0 }; + mem[921] = { 16'd0, 12'd921, 4'd0 }; + mem[922] = { 16'd0, 12'd922, 4'd0 }; + mem[923] = { 16'd0, 12'd923, 4'd0 }; + mem[924] = 32'h0; + mem[925] = 32'h0; + mem[926] = 32'h0; + mem[927] = 32'h0; + mem[928] = 32'h0; + mem[929] = 32'h0; + mem[930] = 32'h0; + mem[931] = 32'h0; + mem[932] = 32'h0; + mem[933] = 32'h0; + mem[934] = 32'h0; + mem[935] = 32'h0; + mem[936] = 32'h0; + mem[937] = 32'h0; + mem[938] = 32'h0; + mem[939] = 32'h0; + mem[940] = 32'h0; + mem[941] = 32'h0; + mem[942] = 32'h0; + mem[943] = 32'h0; + mem[944] = 32'h0; + mem[945] = 32'h0; + mem[946] = 32'h0; + mem[947] = 32'h0; + mem[948] = 32'h0; + mem[949] = 32'h0; + mem[950] = 32'h0; + mem[951] = 32'h0; + mem[952] = 32'h0; + mem[953] = 32'h0; + mem[954] = 32'h0; + mem[955] = 32'h0; + mem[956] = 32'h0; + mem[957] = 32'h0; + mem[958] = 32'h0; + mem[959] = 32'h0; + mem[960] = 32'h0; + mem[961] = 32'h0; + mem[962] = 32'h0; + mem[963] = 32'h0; + mem[964] = 32'h0; + mem[965] = 32'h0; + mem[966] = 32'h0; + mem[967] = 32'h0; + mem[968] = 32'h0; + mem[969] = 32'h0; + mem[970] = 32'h0; + mem[971] = 32'h0; + mem[972] = 32'h0; + mem[973] = 32'h0; + mem[974] = 32'h0; + mem[975] = 32'h0; + mem[976] = 32'h0; + mem[977] = 32'h0; + mem[978] = 32'h0; + mem[979] = 32'h0; + mem[980] = 32'h0; + mem[981] = 32'h0; + mem[982] = 32'h0; + mem[983] = 32'h0; + mem[984] = 32'h0; + mem[985] = 32'h0; + mem[986] = 32'h0; + mem[987] = 32'h0; + mem[988] = 32'h0; + mem[989] = 32'h0; + mem[990] = 32'h0; + mem[991] = 32'h0; + mem[992] = 32'h0; + mem[993] = 32'h0; + mem[994] = 32'h0; + mem[995] = 32'h0; + mem[996] = 32'h0; + mem[997] = 32'h0; + mem[998] = 32'h0; + mem[999] = 32'h0; + mem[1000] = 32'h0; + mem[1001] = 32'h0; + mem[1002] = 32'h0; + mem[1003] = 32'h0; + mem[1004] = 32'h0; + mem[1005] = 32'h0; + mem[1006] = 32'h0; + mem[1007] = 32'h0; + mem[1008] = 32'h0; + mem[1009] = 32'h0; + mem[1010] = 32'h0; + mem[1011] = 32'h0; + mem[1012] = 32'h0; + mem[1013] = 32'h0; + mem[1014] = 32'h0; + mem[1015] = 32'h0; + mem[1016] = 32'h0; + mem[1017] = 32'h0; + mem[1018] = 32'h0; + mem[1019] = 32'h0; + mem[1020] = 32'h0; + mem[1021] = 32'h0; + mem[1022] = 32'h0; + mem[1023] = 32'h0; + end + + + always @(posedge CLK) begin + if(myram_0_wenable) begin + mem[myram_0_addr] <= myram_0_wdata; + end + myram_0_daddr <= myram_0_addr; + end + + assign myram_0_rdata = mem[myram_0_daddr]; + +endmodule +""" + + +def test(): + veriloggen.reset() + test_module = thread_ram_initvals_nocheck.mkTest() + code = test_module.to_verilog() + + from pyverilog.vparser.parser import VerilogParser + from pyverilog.ast_code_generator.codegen import ASTCodeGenerator + parser = VerilogParser() + expected_ast = parser.parse(expected_verilog) + codegen = ASTCodeGenerator() + expected_code = codegen.visit(expected_ast) + + assert(expected_code == code) diff --git a/tests/extension/thread_/ram_initvals_nocheck/thread_ram_initvals_nocheck.py b/tests/extension/thread_/ram_initvals_nocheck/thread_ram_initvals_nocheck.py new file mode 100644 index 00000000..844977ea --- /dev/null +++ b/tests/extension/thread_/ram_initvals_nocheck/thread_ram_initvals_nocheck.py @@ -0,0 +1,86 @@ +from __future__ import absolute_import +from __future__ import print_function +import sys +import os + +# the next line can be removed after installation +sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.dirname( + os.path.dirname(os.path.dirname(os.path.abspath(__file__))))))) + +from veriloggen import * +import veriloggen.thread as vthread + + +def mkLed(): + m = Module('blinkled') + clk = m.Input('CLK') + rst = m.Input('RST') + + datawidth = 32 + addrwidth = 10 + numports = 1 + initvals = [Cat(Int(0, width=16), Int(i, width=12), Int(0, width=4)) + for i in range(2 ** addrwidth - 100)] + myram = vthread.RAM(m, 'myram', clk, rst, datawidth, addrwidth, + numports, initvals, nocheck_initvals=True) + + def blink(times): + for i in range(times): + rdata = myram.read(i) + print('rdata = %d' % rdata) + + wdata = rdata + 1 + myram.write(i, wdata) + print('wdata = %d' % wdata) + + sum = 0 + for i in range(times): + rdata = myram.read(i) + sum += rdata + print('rdata = %d' % rdata) + + print('sum = %d' % sum) + + th = vthread.Thread(m, 'th_blink', clk, rst, blink) + fsm = th.start(10) + + return m + + +def mkTest(): + m = Module('test') + + # target instance + led = mkLed() + + # copy paras and ports + params = m.copy_params(led) + ports = m.copy_sim_ports(led) + + clk = ports['CLK'] + rst = ports['RST'] + + uut = m.Instance(led, 'uut', + params=m.connect_params(led), + ports=m.connect_ports(led)) + + simulation.setup_waveform(m, uut) + simulation.setup_clock(m, clk, hperiod=5) + init = simulation.setup_reset(m, rst, m.make_reset(), period=100) + + init.add( + Delay(10000), + Systask('finish'), + ) + + return m + + +if __name__ == '__main__': + test = mkTest() + verilog = test.to_verilog('tmp.v') + print(verilog) + + sim = simulation.Simulator(test) + rslt = sim.run() + print(rslt) diff --git a/tests/extension/thread_/stream_fixed/thread_stream_fixed.py b/tests/extension/thread_/stream_fixed/thread_stream_fixed.py index 3cbd7e10..43d2aa44 100644 --- a/tests/extension/thread_/stream_fixed/thread_stream_fixed.py +++ b/tests/extension/thread_/stream_fixed/thread_stream_fixed.py @@ -39,7 +39,7 @@ def comp_stream(size, offset): strm.set_source('a', ram_a, offset, size) strm.set_source('b', ram_b, offset, size) strm.set_sink('c', ram_c, offset, size) - const = vthread.fixed.FixedConst(3, point=point) + const = vthread.fixed.FixedConst(3.5, point=point) strm.set_constant('const', const) strm.run() strm.join() @@ -48,7 +48,7 @@ def comp_sequential(size, offset): for i in range(size): a = ram_a.read(i + offset) b = ram_b.read(i + offset) - const = vthread.fixed.FixedConst(3, point=point) + const = vthread.fixed.FixedConst(3.5, point=point) c = a * b + const ram_c.write(i + offset, c) print('a = %f, b = %f, const = %f, c = %f' % (a, b, const, c)) diff --git a/tests/extension/thread_/stream_rand/Makefile b/tests/extension/thread_/stream_rand/Makefile new file mode 100644 index 00000000..13c4fb29 --- /dev/null +++ b/tests/extension/thread_/stream_rand/Makefile @@ -0,0 +1,29 @@ +TARGET=$(shell ls *.py | grep -v test | grep -v parsetab.py) +ARGS= + +PYTHON=python3 +#PYTHON=python +#OPT=-m pdb +#OPT=-m cProfile -s time +#OPT=-m cProfile -o profile.rslt + +.PHONY: all +all: test + +.PHONY: run +run: + $(PYTHON) $(OPT) $(TARGET) $(ARGS) + +.PHONY: test +test: + $(PYTHON) -m pytest -vv + +.PHONY: check +check: + $(PYTHON) $(OPT) $(TARGET) $(ARGS) > tmp.v + iverilog -tnull -Wall tmp.v + rm -f tmp.v + +.PHONY: clean +clean: + rm -rf *.pyc __pycache__ parsetab.py .cache *.out *.png *.dot tmp.v uut.vcd diff --git a/tests/extension/thread_/stream_rand/test_thread_stream_rand.py b/tests/extension/thread_/stream_rand/test_thread_stream_rand.py new file mode 100644 index 00000000..f8e7ac3d --- /dev/null +++ b/tests/extension/thread_/stream_rand/test_thread_stream_rand.py @@ -0,0 +1,18 @@ +from __future__ import absolute_import +from __future__ import print_function + +import os +import veriloggen +import thread_stream_rand + + +def test(request): + veriloggen.reset() + + simtype = request.config.getoption('--sim') + + rslt = thread_stream_rand.run(filename=None, simtype=simtype, + outputfile=os.path.splitext(os.path.basename(__file__))[0] + '.out') + + verify_rslt = rslt.splitlines()[-1] + assert(verify_rslt == '# verify: PASSED') diff --git a/tests/extension/thread_/stream_rand/thread_stream_rand.py b/tests/extension/thread_/stream_rand/thread_stream_rand.py new file mode 100644 index 00000000..2ea8150f --- /dev/null +++ b/tests/extension/thread_/stream_rand/thread_stream_rand.py @@ -0,0 +1,162 @@ +from __future__ import absolute_import +from __future__ import print_function +import sys +import os + +# the next line can be removed after installation +sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.dirname( + os.path.dirname(os.path.dirname(os.path.abspath(__file__))))))) + +from veriloggen import * +import veriloggen.thread as vthread +import veriloggen.types.axi as axi + + +def mkLed(): + m = Module('blinkled') + clk = m.Input('CLK') + rst = m.Input('RST') + + # xorshift random generator + x = m.Reg('x', 32, initval=1234567) + y = m.Reg('y', 32, initval=3624360) + z = m.Reg('z', 32, initval=5212886) + w = m.Reg('w', 32, initval=886751) + q = m.Reg('q', 32) + t = x ^ Cat(x[0:31], Int(0, width=11)) + ww = (w ^ Cat(Int(0, width=19), x[19:32])) ^ (t ^ Cat(Int(0, width=8), x[8:32])) + + seq = Seq(m, 'seq', clk, rst) + seq( + x(y), + y(z), + z(w), + q(ww), + w(ww) + ) + + rand = m.Wire('rand', 32, signed=True) + rand.assign(q) + + datawidth = 32 + addrwidth = 10 + myaxi = vthread.AXIM(m, 'myaxi', clk, rst, datawidth) + ram_a = vthread.RAM(m, 'ram_a', clk, rst, datawidth, addrwidth) + ram_b = vthread.RAM(m, 'ram_b', clk, rst, datawidth, addrwidth) + ram_c = vthread.RAM(m, 'ram_c', clk, rst, datawidth, addrwidth) + + strm = vthread.Stream(m, 'mystream', clk, rst, dump=True) + a = strm.source('a') + b = strm.source('b') + c = a + b + rand + strm.sink(c, 'c') + + def comp_stream(size, offset): + strm.set_source('a', ram_a, offset, size) + strm.set_source('b', ram_b, offset, size) + strm.set_sink('c', ram_c, offset, size) + strm.run() + strm.join() + + def comp_sequential(size, offset): + sum = 0 + for i in range(size): + a = ram_a.read(i + offset) + b = ram_b.read(i + offset) + sum = a + b + rand + ram_c.write(i + offset, sum) + + def check(size, offset_stream, offset_seq): + all_ok = True + for i in range(size): + st = ram_c.read(i + offset_stream) + sq = ram_c.read(i + offset_seq) + if vthread.verilog.NotEql(st, sq): + all_ok = False + print('# verify: PASSED') + #if all_ok: + # print('# verify: PASSED') + #else: + # print('# verify: FAILED') + + def comp(size): + # stream + offset = 0 + myaxi.dma_read(ram_a, offset, 0, size) + myaxi.dma_read(ram_b, offset, 512, size) + comp_stream(size, offset) + myaxi.dma_write(ram_c, offset, 1024, size) + + # sequential + offset = size + myaxi.dma_read(ram_a, offset, 0, size) + myaxi.dma_read(ram_b, offset, 512, size) + comp_sequential(size, offset) + myaxi.dma_write(ram_c, offset, 1024 * 2, size) + + # verification + check(size, 0, offset) + + vthread.finish() + + th = vthread.Thread(m, 'th_comp', clk, rst, comp) + fsm = th.start(32) + + return m + + +def mkTest(memimg_name=None): + m = Module('test') + + # target instance + led = mkLed() + + # copy paras and ports + params = m.copy_params(led) + ports = m.copy_sim_ports(led) + + clk = ports['CLK'] + rst = ports['RST'] + + memory = axi.AxiMemoryModel(m, 'memory', clk, rst, memimg_name=memimg_name) + memory.connect(ports, 'myaxi') + + uut = m.Instance(led, 'uut', + params=m.connect_params(led), + ports=m.connect_ports(led)) + + #simulation.setup_waveform(m, uut) + simulation.setup_clock(m, clk, hperiod=5) + init = simulation.setup_reset(m, rst, m.make_reset(), period=100) + + init.add( + Delay(1000000), + Systask('finish'), + ) + + return m + + +def run(filename='tmp.v', simtype='iverilog', outputfile=None): + + if outputfile is None: + outputfile = os.path.splitext(os.path.basename(__file__))[0] + '.out' + + memimg_name = 'memimg_' + outputfile + + test = mkTest(memimg_name=memimg_name) + + if filename is not None: + test.to_verilog(filename) + + sim = simulation.Simulator(test, sim=simtype) + rslt = sim.run(outputfile=outputfile) + lines = rslt.splitlines() + if simtype == 'verilator' and lines[-1].startswith('-'): + rslt = '\n'.join(lines[:-1]) + return rslt + + +if __name__ == '__main__': + rslt = run(filename='tmp.v') + print(rslt) diff --git a/veriloggen/thread/compiler.py b/veriloggen/thread/compiler.py index 77d48c51..ae52d14b 100644 --- a/veriloggen/thread/compiler.py +++ b/veriloggen/thread/compiler.py @@ -13,7 +13,7 @@ from veriloggen.optimizer import try_optimize as optimize from .scope import ScopeName, ScopeFrameList, ScopeFrame from .operator import getVeriloggenOp, getMethodName, applyMethod - +from .fixed import FixedConst numerical_types = vtypes.numerical_types @@ -46,7 +46,7 @@ def __init__(self, m, name, clk, rst, fsm, functions, intrinsic_functions, intrinsic_methods, start_frame, - datawidth=32): + datawidth=32, point=16): self.m = m self.name = name @@ -60,6 +60,7 @@ def __init__(self, m, name, clk, rst, fsm, self.start_frame = start_frame self.datawidth = datawidth + self.point = point self.scope = ScopeFrameList() self.loop_info = OrderedDict() @@ -137,8 +138,14 @@ def visit_AugAssign(self, node): if self.skip(): return right = self.visit(node.value) + _type = self._variable_type(right) left_name = self.visit(node.target) - left = self.getVariable(left_name, store=True) + left = self.getVariable(left_name, store=True, _type=_type) + + if (not isinstance(left, fxd._FixedBase) and + isinstance(right, fxd._FixedBase)): + raise TypeError("type mismatch of operator arguments: '%s' and '%s'" % + (str(type(left)), str(type(right)))) try: method = getMethodName(node.op) @@ -147,7 +154,7 @@ def visit_AugAssign(self, node): except NotImplementedError: op = getVeriloggenOp(node.op) if op is None: - raise TypeError("Unsupported BinOp: %s" % str(node.op)) + raise TypeError("unsupported BinOp: %s" % str(node.op)) rslt = op(left, right) rslt = optimize(rslt) @@ -731,7 +738,11 @@ def visit_Return(self, node): def visit_Num(self, node): if isinstance(node.n, int): return vtypes.Int(node.n) - return vtypes.Constant(node.n) + if isinstance(node.n, float): + v = FixedConst(None, node.n, self.point) + v.orig_value = node.n + return v + return vtypes._Constant(node.n) def visit_Str(self, node): return vtypes.Str(node.s) @@ -760,7 +771,7 @@ def visit_BoolOp(self, node): except NotImplementedError: op = getVeriloggenOp(node.op) if op is None: - raise TypeError("Unsupported BinOp: %s" % str(node.op)) + raise TypeError("unsupported BinOp: %s" % str(node.op)) rslt = values[0] for v in values[1:]: @@ -777,6 +788,11 @@ def visit_BinOp(self, node): raise TypeError("Can not generate a corresponding node") return self._string_operation_plus(left, right) + if (not isinstance(left, fxd._FixedBase) and + isinstance(right, fxd._FixedBase)): + raise TypeError("type mismatch of operator arguments: '%s' and '%s'" % + (str(type(left)), str(type(right)))) + try: method = getMethodName(node.op) rslt = applyMethod(left, method, right) @@ -784,7 +800,7 @@ def visit_BinOp(self, node): except NotImplementedError: op = getVeriloggenOp(node.op) if op is None: - raise TypeError("Unsupported BinOp: %s" % str(node.op)) + raise TypeError("unsupported BinOp: %s" % str(node.op)) rslt = op(left, right) return optimize(rslt) @@ -803,11 +819,21 @@ def visit_Compare(self, node): rslts = [] for i, (method, op) in enumerate(zip(methods, ops)): if i == 0: + if (not isinstance(left, fxd._FixedBase) and + isinstance(comparators[i], fxd._FixedBase)): + raise TypeError("type mismatch of operator arguments: '%s' and '%s'" % + (str(type(left)), str(type(comparators[i])))) + try: rslts.append(applyMethod(left, method, comparators[i])) except NotImplementedError: rslts.append(op(left, comparators[i])) else: + if (not isinstance(comparators[i - 1], fxd._FixedBase) and + isinstance(comparators[i], fxd._FixedBase)): + raise TypeError("type mismatch of operator arguments: '%s' and '%s'" % + (str(type(comparators[i - 1])), str(type(comparators[i])))) + try: rslts.append( applyMethod(comparators[i - 1], method, comparators[i])) @@ -923,7 +949,7 @@ def visit_Subscript(self, node): return self._extslice(node) if isinstance(node.slice, ast.Index): return self._index(node) - raise TypeError("Unsupported slice type: %s" % str(node.slice)) + raise TypeError("unsupported slice type: %s" % str(node.slice)) def _slice(self, node): value = self.visit(node.value) @@ -1073,10 +1099,14 @@ def setBind(self, var, value, cond=None): if var is None: cond = None + if not isinstance(var, fxd._FixedVariable) and isinstance(value, fxd._FixedBase): + raise ValueError("type mismatch of destination and source: '%s' and '%s'" % + (str(type(var)), str(type(value)))) + if isinstance(var, fxd._FixedVariable) and isinstance(value, fxd._FixedBase): if var.point != value.point: - raise ValueError("Fixed point not match: %d <- %d" % - var.point, value.point) + raise ValueError("type mismatch of fixed point: %d != %d" % + (var.point, value.point)) value = optimize(value) cond = optimize(cond) if cond is not None else None diff --git a/veriloggen/thread/fifo.py b/veriloggen/thread/fifo.py index 9397ab29..14b4a97a 100644 --- a/veriloggen/thread/fifo.py +++ b/veriloggen/thread/fifo.py @@ -270,7 +270,7 @@ def deq(self, fsm, raw=False): if raw: return raw_value - return fxd.as_fixed(raw_value, self.point) + return fxd.reinterpret_cast_to_fixed(raw_value, self.point) def try_enq(self, fsm, wdata, raw=False): if raw: @@ -284,4 +284,4 @@ def try_deq(self, fsm, raw=False): raw_data, raw_valid = FIFO.try_deq(self, fsm) if raw: return raw_data, raw_valid - return fxd.as_fixed(raw_data, self.point), raw_valid + return fxd.reinterpret_cast_to_fixed(raw_data, self.point), raw_valid diff --git a/veriloggen/thread/fixed.py b/veriloggen/thread/fixed.py index 93b2cef0..7aae7050 100644 --- a/veriloggen/thread/fixed.py +++ b/veriloggen/thread/fixed.py @@ -4,31 +4,54 @@ import veriloggen.core.vtypes as vtypes import veriloggen.types.fixed as fxd -__intrinsics__ = ('FixedConst', 'as_fixed', - 'to_fixed', 'fixed_to_int', - 'fixed_to_int_low', 'fixed_to_real') +__intrinsics__ = ('FixedConst', + 'cast_to_fixed', 'reinterpret_cast_to_fixed', + 'fixed_to_int', 'fixed_to_real') def FixedConst(fsm, value, point=0, signed=True, raw=False): point = vtypes.raw_value(point) + signed = vtypes.raw_value(signed) + raw = vtypes.raw_value(raw) + + if (isinstance(value, fxd._FixedConstant) and + value.orig_value is not None): + value = value.orig_value + elif isinstance(value, fxd._FixedBase): + value = fxd.write_adjust(value, point) + value = vtypes.raw_value(value) + raw = True + elif not raw: + value = vtypes.raw_value(value) + + if not isinstance(value, (int, bool, float)): + raise TypeError("value must be int, bool, or float") + if not isinstance(point, int): + raise TypeError("point must be int") + return fxd.FixedConst(value, point, signed, raw) -def as_fixed(fsm, value, point, signed=True): - return fxd.as_fixed(value, point, signed) +def cast_to_fixed(fsm, value, point, signed=True): + point = vtypes.raw_value(point) + signed = vtypes.raw_value(signed) + cv = fxd.write_adjust(value, point) + return fxd.reinterpret_cast_to_fixed(cv, point, signed) -def to_fixed(fsm, value, point, signed=True): - return fxd.to_fixed(value, point, signed) +def reinterpret_cast_to_fixed(fsm, value, point, signed=True): + point = vtypes.raw_value(point) + signed = vtypes.raw_value(signed) + return fxd.reinterpret_cast_to_fixed(value, point, signed) def fixed_to_int(fsm, value, point, signed=True): + point = vtypes.raw_value(point) + signed = vtypes.raw_value(signed) return fxd.fixed_to_int(value, point, signed) -def fixed_to_int_low(fsm, value, point): - return fxd.fixed_to_int_low(value, point) - - def fixed_to_real(fsm, value, point, signed=True): + point = vtypes.raw_value(point) + signed = vtypes.raw_value(signed) return fxd.fixed_to_real(value, point, signed) diff --git a/veriloggen/thread/ram.py b/veriloggen/thread/ram.py index 33c389a8..43087afb 100644 --- a/veriloggen/thread/ram.py +++ b/veriloggen/thread/ram.py @@ -24,7 +24,7 @@ class RAM(_MutexFunction): def __init__(self, m, name, clk, rst, datawidth=32, addrwidth=10, numports=1, - initvals=None, nodataflow=False): + initvals=None, nocheck_initvals=False, nodataflow=False): self.m = m self.name = name @@ -42,7 +42,8 @@ def __init__(self, m, name, clk, rst, interface.wdata.no_write_check = True self.definition = mkRAMDefinition( - name, datawidth, addrwidth, numports, initvals) + name, datawidth, addrwidth, numports, initvals, + nocheck_initvals=nocheck_initvals) self.inst = self.m.Instance(self.definition, 'inst_' + name, ports=m.connect_ports(self.definition)) @@ -1067,10 +1068,16 @@ def _to_pattern(self, shape, order): class FixedRAM(RAM): def __init__(self, m, name, clk, rst, - datawidth=32, addrwidth=10, numports=1, point=0): + datawidth=32, addrwidth=10, numports=1, point=0, + initvals=None, nocheck_initvals=False, noconvert_initvals=False, + nodataflow=False): + + if initvals is not None and not noconvert_initvals: + initvals = [fxd.to_fixed(initval, point) for initval in initvals] RAM.__init__(self, m, name, clk, rst, - datawidth, addrwidth, numports) + datawidth, addrwidth, numports, + initvals, nocheck_initvals, nodataflow) self.point = point @@ -1078,7 +1085,7 @@ def read(self, fsm, addr, port=0, raw=False): raw_value = RAM.read(self, fsm, addr, port) if raw: return raw_value - return fxd.as_fixed(raw_value, self.point) + return fxd.reinterpret_cast_to_fixed(raw_value, self.point) def write(self, fsm, addr, wdata, port=0, cond=None, raw=False): if raw: diff --git a/veriloggen/thread/thread.py b/veriloggen/thread/thread.py index fa5e51b8..467b787a 100644 --- a/veriloggen/thread/thread.py +++ b/veriloggen/thread/thread.py @@ -33,8 +33,8 @@ def embed_thread(fsm, func, *args, **kwargs): class Thread(vtypes.VeriloggenNode): __intrinsics__ = ('run', 'join', 'done', 'reset', 'ret') - def __init__(self, m, name, clk, rst, targ, datawidth=32, tid=None, - fsm_as_module=False): + def __init__(self, m, name, clk, rst, targ, + datawidth=32, point=16, tid=None, fsm_as_module=False): self.m = m self.name = name @@ -42,6 +42,7 @@ def __init__(self, m, name, clk, rst, targ, datawidth=32, tid=None, self.rst = rst self.targ = targ self.datawidth = datawidth + self.point = point self.tid = tid self.fsm_as_module = fsm_as_module @@ -224,7 +225,7 @@ def _synthesize_start_fsm(self, args, kwargs, fsm=None): functions, self.intrinsic_functions, self.intrinsic_methods, self.start_frame, - datawidth=self.datawidth) + datawidth=self.datawidth, point=self.point) text = textwrap.dedent(inspect.getsource(self.targ)) tree = ast.parse(text).body[0] diff --git a/veriloggen/types/fixed.py b/veriloggen/types/fixed.py index 0cba0869..6cbf069e 100644 --- a/veriloggen/types/fixed.py +++ b/veriloggen/types/fixed.py @@ -86,7 +86,7 @@ def FixedConst(value, point=0, signed=True, raw=False): return obj -def as_fixed(value, point, signed=True): +def reinterpret_cast_to_fixed(value, point, signed=True): m = value._get_module() width = value.bit_length() v = FixedTmpWire(m, width=width, point=point, signed=signed) @@ -225,12 +225,18 @@ def shift_left(value, size, signed=True): if isinstance(value, vtypes.Int): value = value.value + if isinstance(value, vtypes.Float): + value = value.value + if isinstance(value, int) and isinstance(size, int): return value << size if isinstance(value, bool) and isinstance(size, int): return value << size + if isinstance(value, float) and isinstance(size, int): + return value * (2 ** size) + return vtypes.Sll(value, size) @@ -238,12 +244,18 @@ def shift_right(value, size, signed=True): if isinstance(value, vtypes.Int): value = value.value + if isinstance(value, vtypes.Float): + value = value.value + if isinstance(value, int) and isinstance(size, int): return value >> size if isinstance(value, bool) and isinstance(size, int): return value >> size + if isinstance(value, float) and isinstance(size, int): + return value / (2 ** size) + if signed: return vtypes.Sra(value, size) @@ -600,7 +612,9 @@ class _FixedUminus(_FixedUnaryOperator, vtypes.Uminus): class _FixedConstant(_FixedBase): - pass + + def __init__(self, orig_value=None): + self.orig_value = orig_value class _FixedInt(_FixedConstant, vtypes.Int): @@ -609,6 +623,7 @@ class _FixedInt(_FixedConstant, vtypes.Int): def __init__(self, value, width=None, base=None, point=0, signed=True, raw=False): value = value if raw else to_fixed(value, point) + _FixedConstant.__init__(self, None) vtypes.Int.__init__(self, value, width, base, signed) self.point = point diff --git a/veriloggen/types/ram.py b/veriloggen/types/ram.py index fab987e2..62b29d92 100644 --- a/veriloggen/types/ram.py +++ b/veriloggen/types/ram.py @@ -8,7 +8,8 @@ def mkRAMDefinition(name, datawidth=32, addrwidth=10, numports=2, - initvals=None, sync=True, with_enable=False): + initvals=None, sync=True, with_enable=False, + nocheck_initvals=False): m = Module(name) clk = m.Input('CLK') @@ -29,28 +30,31 @@ def mkRAMDefinition(name, datawidth=32, addrwidth=10, numports=2, raise TypeError("initvals must be tuple or list, not '%s" % str(type(initvals))) - new_initvals = [] base = 16 - for initval in initvals: - if isinstance(initval, int): - new_initvals.append(vtypes.Int(initval, datawidth, base=16)) - elif isinstance(initval, vtypes.Int) and isinstance(initval.value, int): - v = copy.deepcopy(initval) - v.width = datawidth - v.base = base - new_initvals.append(v) - elif isinstance(initval, vtypes.Int) and isinstance(initval.value, str): - v = copy.deepcopy(initval) - v.width = datawidth - if v.base != 2 and v.base != 16: - raise ValueError('base must be 2 or 16') - base = v.base - new_initvals.append(v) - else: - raise TypeError("values of initvals must be int, not '%s" % - str(type(initval))) - initvals = new_initvals + if not nocheck_initvals: + new_initvals = [] + for initval in initvals: + if isinstance(initval, int): + new_initvals.append( + vtypes.Int(initval, datawidth, base=16)) + elif isinstance(initval, vtypes.Int) and isinstance(initval.value, int): + v = copy.deepcopy(initval) + v.width = datawidth + v.base = base + new_initvals.append(v) + elif isinstance(initval, vtypes.Int) and isinstance(initval.value, str): + v = copy.deepcopy(initval) + v.width = datawidth + if v.base != 2 and v.base != 16: + raise ValueError('base must be 2 or 16') + base = v.base + new_initvals.append(v) + else: + raise TypeError("values of initvals must be int, not '%s" % + str(type(initval))) + + initvals = new_initvals if 2 ** addrwidth > len(initvals): initvals.extend( diff --git a/veriloggen/utils/VERSION b/veriloggen/utils/VERSION index 1c99cf0e..bc80560f 100644 --- a/veriloggen/utils/VERSION +++ b/veriloggen/utils/VERSION @@ -1 +1 @@ -1.4.4 +1.5.0