2 * yosys -- Yosys Open SYnthesis Suite
4 * Copyright (C) 2012 Clifford Wolf <clifford@clifford.at>
6 * Permission to use, copy, modify, and/or distribute this software for any
7 * purpose with or without fee is hereby granted, provided that the above
8 * copyright notice and this permission notice appear in all copies.
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
20 * The Simulation Library.
22 * This verilog library contains simple simulation models for the internal
23 * cells ($not, ...) generated by the frontends and used in most passes.
25 * This library can be used to verify the internal netlists as generated
26 * by the different frontends and passes.
28 * Note that memory can only be simulated when all $memrd and $memwr cells
29 * have been merged to stand-alone $mem cells (this is what the "memory_collect"
34 `define INPUT_A input [A_WIDTH-1:0] A; \
35 generate if (A_SIGNED) begin:A_BUF wire signed [A_WIDTH-1:0] val = A; end else begin:A_BUF wire [A_WIDTH-1:0] val = A; end endgenerate
37 `define INPUT_B input [B_WIDTH-1:0] B; \
38 generate if (B_SIGNED) begin:B_BUF wire signed [B_WIDTH-1:0] val = B; end else begin:B_BUF wire [B_WIDTH-1:0] val = B; end endgenerate
40 // --------------------------------------------------------
44 parameter A_SIGNED = 0;
45 parameter A_WIDTH = 0;
46 parameter Y_WIDTH = 0;
49 output [Y_WIDTH-1:0] Y;
51 assign Y = ~A_BUF.val;
56 // --------------------------------------------------------
60 parameter A_SIGNED = 0;
61 parameter A_WIDTH = 0;
62 parameter Y_WIDTH = 0;
65 output [Y_WIDTH-1:0] Y;
68 if (!A_SIGNED && 0 < A_WIDTH && A_WIDTH < Y_WIDTH) begin:BLOCK1
69 assign Y[A_WIDTH-1:0] = A_BUF.val;
70 assign Y[Y_WIDTH-1:A_WIDTH] = 0;
72 assign Y = +A_BUF.val;
78 // --------------------------------------------------------
82 parameter A_SIGNED = 0;
83 parameter A_WIDTH = 0;
84 parameter Y_WIDTH = 0;
87 output [Y_WIDTH-1:0] Y;
89 assign Y = +A_BUF.val;
93 // --------------------------------------------------------
97 parameter A_SIGNED = 0;
98 parameter A_WIDTH = 0;
99 parameter Y_WIDTH = 0;
102 output [Y_WIDTH-1:0] Y;
104 assign Y = -A_BUF.val;
108 // --------------------------------------------------------
110 module \$and (A, B, Y);
112 parameter A_SIGNED = 0;
113 parameter B_SIGNED = 0;
114 parameter A_WIDTH = 0;
115 parameter B_WIDTH = 0;
116 parameter Y_WIDTH = 0;
120 output [Y_WIDTH-1:0] Y;
122 assign Y = A_BUF.val & B_BUF.val;
126 // --------------------------------------------------------
128 module \$or (A, B, Y);
130 parameter A_SIGNED = 0;
131 parameter B_SIGNED = 0;
132 parameter A_WIDTH = 0;
133 parameter B_WIDTH = 0;
134 parameter Y_WIDTH = 0;
138 output [Y_WIDTH-1:0] Y;
140 assign Y = A_BUF.val | B_BUF.val;
144 // --------------------------------------------------------
146 module \$xor (A, B, Y);
148 parameter A_SIGNED = 0;
149 parameter B_SIGNED = 0;
150 parameter A_WIDTH = 0;
151 parameter B_WIDTH = 0;
152 parameter Y_WIDTH = 0;
156 output [Y_WIDTH-1:0] Y;
158 assign Y = A_BUF.val ^ B_BUF.val;
162 // --------------------------------------------------------
164 module \$xnor (A, B, Y);
166 parameter A_SIGNED = 0;
167 parameter B_SIGNED = 0;
168 parameter A_WIDTH = 0;
169 parameter B_WIDTH = 0;
170 parameter Y_WIDTH = 0;
174 output [Y_WIDTH-1:0] Y;
176 assign Y = A_BUF.val ~^ B_BUF.val;
180 // --------------------------------------------------------
182 module \$reduce_and (A, Y);
184 parameter A_SIGNED = 0;
185 parameter A_WIDTH = 0;
186 parameter Y_WIDTH = 0;
191 assign Y = &A_BUF.val;
195 // --------------------------------------------------------
197 module \$reduce_or (A, Y);
199 parameter A_SIGNED = 0;
200 parameter A_WIDTH = 0;
201 parameter Y_WIDTH = 0;
206 assign Y = |A_BUF.val;
210 // --------------------------------------------------------
212 module \$reduce_xor (A, Y);
214 parameter A_SIGNED = 0;
215 parameter A_WIDTH = 0;
216 parameter Y_WIDTH = 0;
221 assign Y = ^A_BUF.val;
225 // --------------------------------------------------------
227 module \$reduce_xnor (A, Y);
229 parameter A_SIGNED = 0;
230 parameter A_WIDTH = 0;
231 parameter Y_WIDTH = 0;
236 assign Y = ~^A_BUF.val;
240 // --------------------------------------------------------
242 module \$reduce_bool (A, Y);
244 parameter A_SIGNED = 0;
245 parameter A_WIDTH = 0;
246 parameter Y_WIDTH = 0;
251 assign Y = A_BUF.val != 0;
255 // --------------------------------------------------------
257 module \$shl (A, B, Y);
259 parameter A_SIGNED = 0;
260 parameter B_SIGNED = 0;
261 parameter A_WIDTH = 0;
262 parameter B_WIDTH = 0;
263 parameter Y_WIDTH = 0;
267 output [Y_WIDTH-1:0] Y;
269 assign Y = A_BUF.val << B_BUF.val;
273 // --------------------------------------------------------
275 module \$shr (A, B, Y);
277 parameter A_SIGNED = 0;
278 parameter B_SIGNED = 0;
279 parameter A_WIDTH = 0;
280 parameter B_WIDTH = 0;
281 parameter Y_WIDTH = 0;
285 output [Y_WIDTH-1:0] Y;
287 assign Y = A_BUF.val >> B_BUF.val;
291 // --------------------------------------------------------
293 module \$sshl (A, B, Y);
295 parameter A_SIGNED = 0;
296 parameter B_SIGNED = 0;
297 parameter A_WIDTH = 0;
298 parameter B_WIDTH = 0;
299 parameter Y_WIDTH = 0;
303 output [Y_WIDTH-1:0] Y;
305 assign Y = A_BUF.val <<< B_BUF.val;
309 // --------------------------------------------------------
311 module \$sshr (A, B, Y);
313 parameter A_SIGNED = 0;
314 parameter B_SIGNED = 0;
315 parameter A_WIDTH = 0;
316 parameter B_WIDTH = 0;
317 parameter Y_WIDTH = 0;
321 output [Y_WIDTH-1:0] Y;
323 assign Y = A_BUF.val >>> B_BUF.val;
327 // --------------------------------------------------------
329 module \$lt (A, B, Y);
331 parameter A_SIGNED = 0;
332 parameter B_SIGNED = 0;
333 parameter A_WIDTH = 0;
334 parameter B_WIDTH = 0;
335 parameter Y_WIDTH = 0;
339 output [Y_WIDTH-1:0] Y;
341 assign Y = A_BUF.val < B_BUF.val;
345 // --------------------------------------------------------
347 module \$le (A, B, Y);
349 parameter A_SIGNED = 0;
350 parameter B_SIGNED = 0;
351 parameter A_WIDTH = 0;
352 parameter B_WIDTH = 0;
353 parameter Y_WIDTH = 0;
357 output [Y_WIDTH-1:0] Y;
359 assign Y = A_BUF.val <= B_BUF.val;
363 // --------------------------------------------------------
365 module \$eq (A, B, Y);
367 parameter A_SIGNED = 0;
368 parameter B_SIGNED = 0;
369 parameter A_WIDTH = 0;
370 parameter B_WIDTH = 0;
371 parameter Y_WIDTH = 0;
375 output [Y_WIDTH-1:0] Y;
377 assign Y = A_BUF.val == B_BUF.val;
381 // --------------------------------------------------------
383 module \$ne (A, B, Y);
385 parameter A_SIGNED = 0;
386 parameter B_SIGNED = 0;
387 parameter A_WIDTH = 0;
388 parameter B_WIDTH = 0;
389 parameter Y_WIDTH = 0;
393 output [Y_WIDTH-1:0] Y;
395 assign Y = A_BUF.val != B_BUF.val;
399 // --------------------------------------------------------
401 module \$eqx (A, B, Y);
403 parameter A_SIGNED = 0;
404 parameter B_SIGNED = 0;
405 parameter A_WIDTH = 0;
406 parameter B_WIDTH = 0;
407 parameter Y_WIDTH = 0;
411 output [Y_WIDTH-1:0] Y;
413 assign Y = A_BUF.val === B_BUF.val;
417 // --------------------------------------------------------
419 module \$nex (A, B, Y);
421 parameter A_SIGNED = 0;
422 parameter B_SIGNED = 0;
423 parameter A_WIDTH = 0;
424 parameter B_WIDTH = 0;
425 parameter Y_WIDTH = 0;
429 output [Y_WIDTH-1:0] Y;
431 assign Y = A_BUF.val !== B_BUF.val;
435 // --------------------------------------------------------
437 module \$ge (A, B, Y);
439 parameter A_SIGNED = 0;
440 parameter B_SIGNED = 0;
441 parameter A_WIDTH = 0;
442 parameter B_WIDTH = 0;
443 parameter Y_WIDTH = 0;
447 output [Y_WIDTH-1:0] Y;
449 assign Y = A_BUF.val >= B_BUF.val;
453 // --------------------------------------------------------
455 module \$gt (A, B, Y);
457 parameter A_SIGNED = 0;
458 parameter B_SIGNED = 0;
459 parameter A_WIDTH = 0;
460 parameter B_WIDTH = 0;
461 parameter Y_WIDTH = 0;
465 output [Y_WIDTH-1:0] Y;
467 assign Y = A_BUF.val > B_BUF.val;
471 // --------------------------------------------------------
473 module \$add (A, B, Y);
475 parameter A_SIGNED = 0;
476 parameter B_SIGNED = 0;
477 parameter A_WIDTH = 0;
478 parameter B_WIDTH = 0;
479 parameter Y_WIDTH = 0;
483 output [Y_WIDTH-1:0] Y;
485 assign Y = A_BUF.val + B_BUF.val;
489 // --------------------------------------------------------
491 module \$sub (A, B, Y);
493 parameter A_SIGNED = 0;
494 parameter B_SIGNED = 0;
495 parameter A_WIDTH = 0;
496 parameter B_WIDTH = 0;
497 parameter Y_WIDTH = 0;
501 output [Y_WIDTH-1:0] Y;
503 assign Y = A_BUF.val - B_BUF.val;
507 // --------------------------------------------------------
509 module \$mul (A, B, Y);
511 parameter A_SIGNED = 0;
512 parameter B_SIGNED = 0;
513 parameter A_WIDTH = 0;
514 parameter B_WIDTH = 0;
515 parameter Y_WIDTH = 0;
519 output [Y_WIDTH-1:0] Y;
521 assign Y = A_BUF.val * B_BUF.val;
525 // --------------------------------------------------------
527 module \$div (A, B, Y);
529 parameter A_SIGNED = 0;
530 parameter B_SIGNED = 0;
531 parameter A_WIDTH = 0;
532 parameter B_WIDTH = 0;
533 parameter Y_WIDTH = 0;
537 output [Y_WIDTH-1:0] Y;
539 assign Y = A_BUF.val / B_BUF.val;
543 // --------------------------------------------------------
545 module \$mod (A, B, Y);
547 parameter A_SIGNED = 0;
548 parameter B_SIGNED = 0;
549 parameter A_WIDTH = 0;
550 parameter B_WIDTH = 0;
551 parameter Y_WIDTH = 0;
555 output [Y_WIDTH-1:0] Y;
557 assign Y = A_BUF.val % B_BUF.val;
561 // --------------------------------------------------------
563 module \$pow (A, B, Y);
565 parameter A_SIGNED = 0;
566 parameter B_SIGNED = 0;
567 parameter A_WIDTH = 0;
568 parameter B_WIDTH = 0;
569 parameter Y_WIDTH = 0;
573 output [Y_WIDTH-1:0] Y;
575 assign Y = A_BUF.val ** B_BUF.val;
579 // --------------------------------------------------------
581 module \$logic_not (A, Y);
583 parameter A_SIGNED = 0;
584 parameter A_WIDTH = 0;
585 parameter Y_WIDTH = 0;
588 output [Y_WIDTH-1:0] Y;
590 assign Y = !A_BUF.val;
594 // --------------------------------------------------------
596 module \$logic_and (A, B, Y);
598 parameter A_SIGNED = 0;
599 parameter B_SIGNED = 0;
600 parameter A_WIDTH = 0;
601 parameter B_WIDTH = 0;
602 parameter Y_WIDTH = 0;
606 output [Y_WIDTH-1:0] Y;
608 assign Y = A_BUF.val && B_BUF.val;
612 // --------------------------------------------------------
614 module \$logic_or (A, B, Y);
616 parameter A_SIGNED = 0;
617 parameter B_SIGNED = 0;
618 parameter A_WIDTH = 0;
619 parameter B_WIDTH = 0;
620 parameter Y_WIDTH = 0;
624 output [Y_WIDTH-1:0] Y;
626 assign Y = A_BUF.val || B_BUF.val;
630 // --------------------------------------------------------
632 module \$mux (A, B, S, Y);
636 input [WIDTH-1:0] A, B;
638 output reg [WIDTH-1:0] Y;
649 // --------------------------------------------------------
651 module \$pmux (A, B, S, Y);
654 parameter S_WIDTH = 0;
657 input [WIDTH*S_WIDTH-1:0] B;
658 input [S_WIDTH-1:0] S;
659 output reg [WIDTH-1:0] Y;
665 for (i = 0; i < S_WIDTH; i = i+1)
672 // --------------------------------------------------------
674 module \$safe_pmux (A, B, S, Y);
677 parameter S_WIDTH = 0;
680 input [WIDTH*S_WIDTH-1:0] B;
681 input [S_WIDTH-1:0] S;
682 output reg [WIDTH-1:0] Y;
688 for (i = 0; i < S_WIDTH; i = i+1)
699 // --------------------------------------------------------
709 wire lut0_out, lut1_out;
712 if (WIDTH <= 1) begin:simple
713 assign {lut1_out, lut0_out} = LUT;
714 end else begin:complex
715 \$lut #( .WIDTH(WIDTH-1), .LUT(LUT ) ) lut0 ( .I(I[WIDTH-2:0]), .O(lut0_out) );
716 \$lut #( .WIDTH(WIDTH-1), .LUT(LUT >> (2**(WIDTH-1))) ) lut1 ( .I(I[WIDTH-2:0]), .O(lut1_out) );
719 if (WIDTH > 0) begin:lutlogic
721 casez ({I[WIDTH-1], lut0_out, lut1_out})
724 3'b0??: O = lut0_out;
725 3'b1??: O = lut1_out;
734 // --------------------------------------------------------
736 module \$assert (A, EN);
741 if (A !== 1'b1 && EN === 1'b1) begin
742 $display("Assertation failed!");
749 // --------------------------------------------------------
751 module \$sr (SET, CLR, Q);
754 parameter SET_POLARITY = 1'b1;
755 parameter CLR_POLARITY = 1'b1;
757 input [WIDTH-1:0] SET, CLR;
758 output reg [WIDTH-1:0] Q;
760 wire [WIDTH-1:0] pos_set = SET_POLARITY ? SET : ~SET;
761 wire [WIDTH-1:0] pos_clr = CLR_POLARITY ? CLR : ~CLR;
765 for (i = 0; i < WIDTH; i = i+1) begin:bit
766 always @(posedge pos_set[i], posedge pos_clr[i])
776 // --------------------------------------------------------
778 module \$dff (CLK, D, Q);
781 parameter CLK_POLARITY = 1'b1;
785 output reg [WIDTH-1:0] Q;
786 wire pos_clk = CLK == CLK_POLARITY;
788 always @(posedge pos_clk) begin
794 // --------------------------------------------------------
796 module \$dffsr (CLK, SET, CLR, D, Q);
799 parameter CLK_POLARITY = 1'b1;
800 parameter SET_POLARITY = 1'b1;
801 parameter CLR_POLARITY = 1'b1;
804 input [WIDTH-1:0] SET, CLR, D;
805 output reg [WIDTH-1:0] Q;
807 wire pos_clk = CLK == CLK_POLARITY;
808 wire [WIDTH-1:0] pos_set = SET_POLARITY ? SET : ~SET;
809 wire [WIDTH-1:0] pos_clr = CLR_POLARITY ? CLR : ~CLR;
813 for (i = 0; i < WIDTH; i = i+1) begin:bit
814 always @(posedge pos_set[i], posedge pos_clr[i], posedge pos_clk)
826 // --------------------------------------------------------
828 module \$adff (CLK, ARST, D, Q);
831 parameter CLK_POLARITY = 1'b1;
832 parameter ARST_POLARITY = 1'b1;
833 parameter ARST_VALUE = 0;
837 output reg [WIDTH-1:0] Q;
838 wire pos_clk = CLK == CLK_POLARITY;
839 wire pos_arst = ARST == ARST_POLARITY;
841 always @(posedge pos_clk, posedge pos_arst) begin
850 // --------------------------------------------------------
852 module \$dlatch (EN, D, Q);
855 parameter EN_POLARITY = 1'b1;
859 output reg [WIDTH-1:0] Q;
862 if (EN == EN_POLARITY)
868 // --------------------------------------------------------
870 module \$fsm (CLK, ARST, CTRL_IN, CTRL_OUT);
874 parameter CLK_POLARITY = 1'b1;
875 parameter ARST_POLARITY = 1'b1;
877 parameter CTRL_IN_WIDTH = 1;
878 parameter CTRL_OUT_WIDTH = 1;
880 parameter STATE_BITS = 1;
881 parameter STATE_NUM = 1;
882 parameter STATE_NUM_LOG2 = 1;
883 parameter STATE_RST = 0;
884 parameter STATE_TABLE = 1'b0;
886 parameter TRANS_NUM = 1;
887 parameter TRANS_TABLE = 4'b0x0x;
890 input [CTRL_IN_WIDTH-1:0] CTRL_IN;
891 output reg [CTRL_OUT_WIDTH-1:0] CTRL_OUT;
893 wire pos_clk = CLK == CLK_POLARITY;
894 wire pos_arst = ARST == ARST_POLARITY;
896 reg [STATE_BITS-1:0] state;
897 reg [STATE_BITS-1:0] state_tmp;
898 reg [STATE_BITS-1:0] next_state;
900 reg [STATE_BITS-1:0] tr_state_in;
901 reg [STATE_BITS-1:0] tr_state_out;
902 reg [CTRL_IN_WIDTH-1:0] tr_ctrl_in;
903 reg [CTRL_OUT_WIDTH-1:0] tr_ctrl_out;
910 reg [STATE_NUM_LOG2-1:0] state_num;
912 tr_pos = (2*STATE_NUM_LOG2+CTRL_IN_WIDTH+CTRL_OUT_WIDTH)*tr_num;
913 tr_ctrl_out = TRANS_TABLE >> tr_pos;
914 tr_pos = tr_pos + CTRL_OUT_WIDTH;
915 state_num = TRANS_TABLE >> tr_pos;
916 tr_state_out = STATE_TABLE >> (STATE_BITS*state_num);
917 tr_pos = tr_pos + STATE_NUM_LOG2;
918 tr_ctrl_in = TRANS_TABLE >> tr_pos;
919 tr_pos = tr_pos + CTRL_IN_WIDTH;
920 state_num = TRANS_TABLE >> tr_pos;
921 tr_state_in = STATE_TABLE >> (STATE_BITS*state_num);
922 tr_pos = tr_pos + STATE_NUM_LOG2;
926 always @(posedge pos_clk, posedge pos_arst) begin
928 state_tmp = STATE_TABLE[STATE_BITS*(STATE_RST+1)-1:STATE_BITS*STATE_RST];
930 state_tmp = next_state;
931 for (i = 0; i < STATE_BITS; i = i+1)
932 if (state_tmp[i] === 1'bz)
937 always @(state, CTRL_IN) begin
938 next_state <= STATE_TABLE[STATE_BITS*(STATE_RST+1)-1:STATE_BITS*STATE_RST];
941 // $display("Q: %b %b", state, CTRL_IN);
942 for (i = 0; i < TRANS_NUM; i = i+1) begin
944 // $display("T: %b %b -> %b %b [%d]", tr_state_in, tr_ctrl_in, tr_state_out, tr_ctrl_out, i);
945 casez ({state, CTRL_IN})
946 {tr_state_in, tr_ctrl_in}: begin
947 // $display("-> %b %b <- MATCH", state, CTRL_IN);
948 {next_state, CTRL_OUT} <= {tr_state_out, tr_ctrl_out};
956 // --------------------------------------------------------
959 module \$memrd (CLK, ADDR, DATA);
961 parameter MEMID = "";
965 parameter CLK_ENABLE = 0;
966 parameter CLK_POLARITY = 0;
969 input [ABITS-1:0] ADDR;
970 output [WIDTH-1:0] DATA;
973 if (MEMID != "") begin
974 $display("ERROR: Found non-simulatable instance of $memrd!");
981 // --------------------------------------------------------
983 module \$memwr (CLK, EN, ADDR, DATA);
985 parameter MEMID = "";
989 parameter CLK_ENABLE = 0;
990 parameter CLK_POLARITY = 0;
993 input [ABITS-1:0] ADDR;
994 input [WIDTH-1:0] DATA;
997 if (MEMID != "") begin
998 $display("ERROR: Found non-simulatable instance of $memwr!");
1005 // --------------------------------------------------------
1007 module \$mem (RD_CLK, RD_ADDR, RD_DATA, WR_CLK, WR_EN, WR_ADDR, WR_DATA);
1009 parameter MEMID = "";
1010 parameter SIZE = 256;
1011 parameter OFFSET = 0;
1012 parameter ABITS = 8;
1013 parameter WIDTH = 8;
1015 parameter RD_PORTS = 1;
1016 parameter RD_CLK_ENABLE = 1'b1;
1017 parameter RD_CLK_POLARITY = 1'b1;
1019 parameter WR_PORTS = 1;
1020 parameter WR_CLK_ENABLE = 1'b1;
1021 parameter WR_CLK_POLARITY = 1'b1;
1023 input [RD_PORTS-1:0] RD_CLK;
1024 input [RD_PORTS*ABITS-1:0] RD_ADDR;
1025 output reg [RD_PORTS*WIDTH-1:0] RD_DATA;
1027 input [WR_PORTS-1:0] WR_CLK, WR_EN;
1028 input [WR_PORTS*ABITS-1:0] WR_ADDR;
1029 input [WR_PORTS*WIDTH-1:0] WR_DATA;
1031 reg [WIDTH-1:0] data [SIZE-1:0];
1032 reg update_async_rd;
1037 for (i = 0; i < RD_PORTS; i = i+1) begin:rd
1038 if (RD_CLK_ENABLE[i] == 0) begin:rd_noclk
1039 always @(RD_ADDR or update_async_rd)
1040 RD_DATA[ (i+1)*WIDTH-1 : i*WIDTH ] <= data[ RD_ADDR[ (i+1)*ABITS-1 : i*ABITS ] - OFFSET ];
1042 if (RD_CLK_POLARITY[i] == 1) begin:rd_posclk
1043 always @(posedge RD_CLK[i])
1044 RD_DATA[ (i+1)*WIDTH-1 : i*WIDTH ] <= data[ RD_ADDR[ (i+1)*ABITS-1 : i*ABITS ] - OFFSET ];
1045 end else begin:rd_negclk
1046 always @(negedge RD_CLK[i])
1047 RD_DATA[ (i+1)*WIDTH-1 : i*WIDTH ] <= data[ RD_ADDR[ (i+1)*ABITS-1 : i*ABITS ] - OFFSET ];
1051 for (i = 0; i < WR_PORTS; i = i+1) begin:wr
1052 if (WR_CLK_ENABLE[i] == 0) begin:wr_noclk
1053 always @(WR_ADDR or WR_DATA or WR_EN) begin
1055 data[ WR_ADDR[ (i+1)*ABITS-1 : i*ABITS ] - OFFSET ] <= WR_DATA[ (i+1)*WIDTH-1 : i*WIDTH ];
1056 update_async_rd <= 1; update_async_rd <= 0;
1060 if (WR_CLK_POLARITY[i] == 1) begin:rd_posclk
1061 always @(posedge WR_CLK[i])
1063 data[ WR_ADDR[ (i+1)*ABITS-1 : i*ABITS ] - OFFSET ] <= WR_DATA[ (i+1)*WIDTH-1 : i*WIDTH ];
1064 update_async_rd <= 1; update_async_rd <= 0;
1066 end else begin:rd_negclk
1067 always @(negedge WR_CLK[i])
1069 data[ WR_ADDR[ (i+1)*ABITS-1 : i*ABITS ] - OFFSET ] <= WR_DATA[ (i+1)*WIDTH-1 : i*WIDTH ];
1070 update_async_rd <= 1; update_async_rd <= 0;
1080 // --------------------------------------------------------