summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--examples/while.vhd28
-rw-r--r--src/vhd2vl.l1
-rw-r--r--src/vhd2vl.y15
-rw-r--r--translated_examples/while.v26
4 files changed, 69 insertions, 1 deletions
diff --git a/examples/while.vhd b/examples/while.vhd
new file mode 100644
index 0000000..5d2ee9e
--- /dev/null
+++ b/examples/while.vhd
@@ -0,0 +1,28 @@
+library IEEE;
+use ieee.std_logic_1164.all;
+use ieee.numeric_std.all;
+
+entity whilep is port(
+ A : in integer;
+ Z : out std_logic_vector(3 downto 0)
+);
+end whilep;
+
+architecture rtl of whilep is
+begin
+
+
+process (A)
+ variable I : integer range 0 to 4;
+begin
+ Z <= "0000";
+ I := 0;
+ while (I <= 3) loop
+ if (A = I) then
+ Z(I) <= '1';
+ end if;
+ I := I + 1;
+ end loop;
+end process;
+
+end rtl;
diff --git a/src/vhd2vl.l b/src/vhd2vl.l
index 4253fd4..d2cda55 100644
--- a/src/vhd2vl.l
+++ b/src/vhd2vl.l
@@ -114,6 +114,7 @@ void getbasedstring(unsigned skip);
"then" { return THEN; }
"elsif" { return ELSIF; }
"else" { return ELSE; }
+"while" { return WHILE; }
"case" { return CASE; }
"after" { return AFTER; }
"and" { return AND; }
diff --git a/src/vhd2vl.y b/src/vhd2vl.y
index bbf01f1..4c34720 100644
--- a/src/vhd2vl.y
+++ b/src/vhd2vl.y
@@ -705,7 +705,7 @@ slist *emit_io_list(slist *sl)
%token <txt> ARCHITECTURE COMPONENT OF ARRAY
%token <txt> SIGNAL BEGN NOT WHEN WITH EXIT
%token <txt> SELECT OTHERS PROCESS VARIABLE CONSTANT
-%token <txt> IF THEN ELSIF ELSE CASE
+%token <txt> IF THEN ELSIF ELSE CASE WHILE
%token <txt> FOR LOOP GENERATE
%token <txt> AFTER AND OR XOR MOD
%token <txt> LASTVALUE EVENT POSEDGE NEGEDGE
@@ -1808,6 +1808,19 @@ p_body : rem {$$=$1;}
sl=addtxt(sl,"end\n");
$$=addsl(sl,$15); /* p_body:2 */
}
+/* 1 2 3 4 5 6 7 8 9 10 11*/
+ | rem WHILE exprc LOOP doindent p_body unindent END LOOP ';' p_body {
+ slist *sl;
+ sl=addsl($1,indents[indent]);
+ sl=addtxt(sl,"while ");
+ sl=addtxt(sl,"(");
+ sl=addsl(sl,$3); /* exprc */
+ sl=addtxt(sl,") begin\n");
+ sl=addsl(sl,$6); /* p_body:1 */
+ sl=addsl(sl,indents[indent]);
+ sl=addtxt(sl,"end\n");
+ $$=addsl(sl,$11); /* p_body:2 */
+ }
/* 1 2 3 4 5 6 7 8 9 10 */
| rem CASE signal IS rem cases END CASE ';' p_body {
slist *sl;
diff --git a/translated_examples/while.v b/translated_examples/while.v
new file mode 100644
index 0000000..0464707
--- /dev/null
+++ b/translated_examples/while.v
@@ -0,0 +1,26 @@
+// no timescale needed
+
+module whilep(
+input wire [31:0] A,
+output reg [3:0] Z
+);
+
+
+
+
+
+ always @(A) begin : P1
+ reg [31:0] I;
+
+ Z <= 4'b0000;
+ I = 0;
+ while ((I <= 3)) begin
+ if((A == I)) begin
+ Z[I] <= 1'b1;
+ end
+ I = I + 1;
+ end
+ end
+
+
+endmodule
OpenPOWER on IntegriCloud