From 2525d6e585da90f89cafed8cc13e025d8b68a02c Mon Sep 17 00:00:00 2001 From: Steven Hugg Date: Sun, 19 Nov 2017 20:32:58 -0500 Subject: [PATCH] start yosys profiling --- index.html | 2 +- presets/verilog/ball_paddle.v | 56 ++++++++++++++++-------------- presets/verilog/hvsync_generator.v | 16 ++++----- presets/verilog/skeleton.verilator | 26 ++++++++++++++ src/audio.js | 1 + src/platform/verilog.js | 19 +++++++--- src/ui.js | 2 +- src/worker/workermain.js | 50 ++++++++++++++++++++++---- test/cli/testworker.js | 6 +++- 9 files changed, 130 insertions(+), 48 deletions(-) create mode 100644 presets/verilog/skeleton.verilator diff --git a/index.html b/index.html index 19dbd1ab..1c4c54aa 100644 --- a/index.html +++ b/index.html @@ -167,7 +167,7 @@ body { - + diff --git a/presets/verilog/ball_paddle.v b/presets/verilog/ball_paddle.v index 04ee206c..672fa036 100644 --- a/presets/verilog/ball_paddle.v +++ b/presets/verilog/ball_paddle.v @@ -1,10 +1,11 @@ `include "hvsync_generator.v" `include "digits10.v" -module player_stats(reset, score, lives, incscore, declives); +module player_stats(reset, score0, score1, lives, incscore, declives); input reset; - output [3:0] score[2]; + output [3:0] score0; + output [3:0] score1; input incscore; output [3:0] lives; input declives; @@ -12,13 +13,13 @@ module player_stats(reset, score, lives, incscore, declives); always @(posedge incscore or posedge reset) begin if (reset) begin - score[0] <= 0; - score[1] <= 0; - end else if (score[0] == 9) begin - score[0] <= 0; - score[1] <= score[1] + 1; + score0 <= 0; + score1 <= 0; + end else if (score0 == 9) begin + score0 <= 0; + score1 <= score1 + 1; end else begin - score[0] <= score[0] + 1; + score0 <= score0 + 1; end end @@ -53,10 +54,11 @@ module ball_paddle_top(clk, reset, hpaddle, hsync, vsync, rgb); reg brick_array [BRICKS_H * BRICKS_V]; - wire [3:0] score[2]; + wire [3:0] score0; + wire [3:0] score1; wire [3:0] lives; reg incscore; - reg declives; + reg declives = 0; // TODO localparam BRICKS_H = 16; localparam BRICKS_V = 8; @@ -81,8 +83,9 @@ module ball_paddle_top(clk, reset, hpaddle, hsync, vsync, rgb); // scoreboard - player_stats stats(.reset(reset), .score(score), .lives(lives), - .incscore(incscore), .declives(declives)); + player_stats stats(.reset(reset), + .score0(score0), .score1(score1), .incscore(incscore), + .lives(lives), .declives(declives)); wire [3:0] score_digit; wire [4:0] score_bits; @@ -90,8 +93,8 @@ module ball_paddle_top(clk, reset, hpaddle, hsync, vsync, rgb); always @(*) begin case (hpos[7:5]) - 1: score_digit = score[1]; - 2: score_digit = score[0]; + 1: score_digit = score1; + 2: score_digit = score0; 6: score_digit = lives; default: score_digit = 15; // no digit endcase @@ -105,11 +108,6 @@ module ball_paddle_top(clk, reset, hpaddle, hsync, vsync, rgb); wire score_gfx = display_on && score_bits[hpos[4:2] ^ 3'b111]; - // TODO: only works when paddle at bottom of screen! - always @(posedge hsync) - if (!hpaddle) - paddle_pos <= vpos; - wire [5:0] hcell = hpos[8:3]; wire [5:0] vcell = vpos[8:3]; wire lr_border = hcell==0 || hcell==31; @@ -127,10 +125,11 @@ module ball_paddle_top(clk, reset, hpaddle, hsync, vsync, rgb); reg main_gfx; reg brick_present; reg [6:0] brick_index; + + wire visible_clk = clk & display_on; // compute main_gfx and locate bricks - always @(posedge clk) - begin + always @(posedge visible_clk) // see if we are scanning brick area if (vpos[8:6] == 1 && !lr_border) begin @@ -162,16 +161,21 @@ module ball_paddle_top(clk, reset, hpaddle, hsync, vsync, rgb); default: main_gfx <= lr_border; // left/right borders endcase end - end - + + // only works when paddle at bottom of screen! + // (we don't want to mess w/ paddle position during visible portion) + always @(posedge hsync) + if (!hpaddle) + paddle_pos <= vpos; + wire ball_pixel_collide = main_gfx & ball_gfx; /* verilator lint_off MULTIDRIVEN */ - reg [5:0] ball_collide_bits = 0; + reg [4:0] ball_collide_bits = 0; /* verilator lint_on MULTIDRIVEN */ // compute ball collisions with paddle and playfield - always @(posedge clk) + always @(posedge visible_clk) if (ball_pixel_collide) begin if (paddle_gfx) begin // did we collide w/ paddle? @@ -186,7 +190,7 @@ module ball_paddle_top(clk, reset, hpaddle, hsync, vsync, rgb); end // compute ball collisions with brick - always @(posedge clk) + always @(posedge visible_clk) if (ball_pixel_collide && brick_present) begin brick_array[brick_index] <= 0; incscore <= 1; // increment score diff --git a/presets/verilog/hvsync_generator.v b/presets/verilog/hvsync_generator.v index f1976e01..535df4cc 100644 --- a/presets/verilog/hvsync_generator.v +++ b/presets/verilog/hvsync_generator.v @@ -12,17 +12,17 @@ module hvsync_generator( // constant declarations for VGA sync parameters localparam H_DISPLAY = 256; // horizontal display area - localparam H_L_BORDER = 12; // horizontal left border - localparam H_R_BORDER = 8; // horizontal right border - localparam H_RETRACE = 24; // horizontal retrace + localparam H_L_BORDER = 16; // horizontal left border + localparam H_R_BORDER = 16; // horizontal right border + localparam H_RETRACE = 16; // horizontal retrace localparam H_MAX = H_DISPLAY + H_L_BORDER + H_R_BORDER + H_RETRACE - 1; localparam START_H_RETRACE = H_DISPLAY + H_R_BORDER; localparam END_H_RETRACE = H_DISPLAY + H_R_BORDER + H_RETRACE - 1; localparam V_DISPLAY = 240; // vertical display area - localparam V_T_BORDER = 4; // vertical top border - localparam V_B_BORDER = 16; // vertical bottom border - localparam V_RETRACE = 2; // vertical retrace + localparam V_T_BORDER = 4; // vertical top border + localparam V_B_BORDER = 14; // vertical bottom border + localparam V_RETRACE = 4; // vertical retrace localparam V_MAX = V_DISPLAY + V_T_BORDER + V_B_BORDER + V_RETRACE - 1; localparam START_V_RETRACE = V_DISPLAY + V_B_BORDER; localparam END_V_RETRACE = V_DISPLAY + V_B_BORDER + V_RETRACE - 1; @@ -46,8 +46,8 @@ module hvsync_generator( reg vga_HS, vga_VS; always @(posedge clk) begin - vga_HS <= (hpos>=280 && hpos<288); // change this value to move the display horizontally - vga_VS <= (vpos==START_V_RETRACE); // change this value to move the display vertically + vga_HS <= (hpos>=START_H_RETRACE && hpos<=END_H_RETRACE); + vga_VS <= (vpos==START_V_RETRACE); end always @(posedge clk) diff --git a/presets/verilog/skeleton.verilator b/presets/verilog/skeleton.verilator new file mode 100644 index 00000000..bf564df9 --- /dev/null +++ b/presets/verilog/skeleton.verilator @@ -0,0 +1,26 @@ +`include "hvsync_generator.v" + +module top(clk, hsync, vsync, rgb); + + input clk; + output hsync, vsync; + output [2:0] rgb; + wire display_on; + wire [8:0] hpos; + wire [8:0] vpos; + + hvsync_generator hvsync_gen( + .clk(clk), + .hsync(hsync), + .vsync(vsync), + .display_on(display_on), + .hpos(hpos), + .vpos(vpos) + ); + + wire r = display_on && hpos[4]; + wire g = display_on && vpos[4]; + wire b = display_on && hpos[0]; + assign rgb = {b,g,r}; + +endmodule diff --git a/src/audio.js b/src/audio.js index db988655..3a850dc7 100644 --- a/src/audio.js +++ b/src/audio.js @@ -396,6 +396,7 @@ var SampleAudio = function(clockfreq) { } this.addSingleSample = function(value) { + if (!buffer) return; buffer[bufpos++] = value; if (bufpos >= buffer.length) { bufpos = 0; diff --git a/src/platform/verilog.js b/src/platform/verilog.js index fe3a8199..b7fcd63a 100644 --- a/src/platform/verilog.js +++ b/src/platform/verilog.js @@ -242,8 +242,8 @@ var VerilogPlatform = function(mainElement, options) { video.create(); setKeyboardFromMap(video, switches, VERILOG_KEYCODE_MAP); $(video.canvas).mousemove(function(e) { - paddle_x = clamp(4,255,Math.floor(e.offsetX * video.canvas.width / $(video.canvas).width() - 20)); - paddle_y = clamp(4,255,Math.floor(e.offsetY * video.canvas.height / $(video.canvas).height() - 20)); + paddle_x = clamp(8,240,Math.floor(e.offsetX * video.canvas.width / $(video.canvas).width() - 20)); + paddle_y = clamp(8,240,Math.floor(e.offsetY * video.canvas.height / $(video.canvas).height() - 20)); }); audio = new SampleAudio(AUDIO_FREQ); idata = video.getFrameData(); @@ -294,11 +294,11 @@ var VerilogPlatform = function(mainElement, options) { } this.pause = function() { timer.stop(); - audio.stop(); + if (gen.spkr !== undefined) audio.stop(); } this.resume = function() { timer.start(); - audio.start(); + if (gen.spkr !== undefined) audio.start(); } this.reset = function() { @@ -311,6 +311,17 @@ var VerilogPlatform = function(mainElement, options) { this.getDefaultExtension = function() { return ".v"; }; }; +function traceTiming() { + // TODO: merge with main setCode(text) + var text = editor.getValue(); + worker.postMessage({ + code:text, + dependencies:loadFileDependencies(text), + platform:platform_id, + tool:'yosys' + }); +} + //////////////// PLATFORMS['verilog'] = VerilogPlatform; diff --git a/src/ui.js b/src/ui.js index b609880a..a9ee6307 100644 --- a/src/ui.js +++ b/src/ui.js @@ -1198,7 +1198,7 @@ function setupDebugControls(){ $("#dbg_stepout").hide(); $("#dbg_stepback").hide(); } - if (platform_id == 'vcs') { + if (window.traceTiming) { $("#dbg_timing").click(traceTiming).show(); } else if (platform.readAddress) { diff --git a/src/worker/workermain.js b/src/worker/workermain.js index 08a2286d..61281920 100644 --- a/src/worker/workermain.js +++ b/src/worker/workermain.js @@ -1027,6 +1027,15 @@ function detectModuleName(code) { return m ? m[1] : null; } +function detectTopModuleName(code) { + var topmod = detectModuleName(code) || "top"; + var m = /\bmodule\s+(\w+?_top)/.exec(code); + if (m && m[1]) topmod = m[1]; + m = /\bmodule\s+(\w+?_top)/.exec(code); + if (m && m[1]) topmod = m[1]; + return topmod; +} + function writeDependencies(depends, FS, errors) { if (depends) { for (var i=0; i