altera_merlin_master_translator.sv 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556
  1. // (C) 2001-2018 Intel Corporation. All rights reserved.
  2. // Your use of Intel Corporation's design tools, logic functions and other
  3. // software and tools, and its AMPP partner logic functions, and any output
  4. // files from any of the foregoing (including device programming or simulation
  5. // files), and any associated documentation or information are expressly subject
  6. // to the terms and conditions of the Intel Program License Subscription
  7. // Agreement, Intel FPGA IP License Agreement, or other applicable
  8. // license agreement, including, without limitation, that your use is for the
  9. // sole purpose of programming logic devices manufactured by Intel and sold by
  10. // Intel or its authorized distributors. Please refer to the applicable
  11. // agreement for further details.
  12. // $Id: //acds/rel/18.1std/ip/merlin/altera_merlin_master_translator/altera_merlin_master_translator.sv#1 $
  13. // $Revision: #1 $
  14. // $Date: 2018/07/18 $
  15. // $Author: psgswbuild $
  16. // --------------------------------------
  17. // Merlin Master Translator
  18. //
  19. // Converts an Avalon-MM master interface into an
  20. // Avalon-MM "universal" master interface.
  21. //
  22. // The universal interface is defined as the superset of ports
  23. // and parameters that can represent any legal Avalon
  24. // interface.
  25. // --------------------------------------
  26. `timescale 1 ns / 1 ns
  27. module altera_merlin_master_translator #(
  28. parameter
  29. // widths
  30. AV_ADDRESS_W = 32,
  31. AV_DATA_W = 32,
  32. AV_BURSTCOUNT_W = 4,
  33. AV_BYTEENABLE_W = 4,
  34. UAV_ADDRESS_W = 38,
  35. UAV_BURSTCOUNT_W = 10,
  36. // optional ports
  37. USE_BURSTCOUNT = 1,
  38. USE_BEGINBURSTTRANSFER = 0,
  39. USE_BEGINTRANSFER = 0,
  40. USE_CHIPSELECT = 0,
  41. USE_READ = 1,
  42. USE_READDATAVALID = 1,
  43. USE_WRITE = 1,
  44. USE_WAITREQUEST = 1,
  45. USE_WRITERESPONSE = 0,
  46. USE_READRESPONSE = 0,
  47. AV_REGISTERINCOMINGSIGNALS = 0,
  48. AV_SYMBOLS_PER_WORD = 4,
  49. AV_ADDRESS_SYMBOLS = 0,
  50. // must be enabled for a bursting master
  51. AV_CONSTANT_BURST_BEHAVIOR = 1,
  52. UAV_CONSTANT_BURST_BEHAVIOR = 0,
  53. AV_BURSTCOUNT_SYMBOLS = 0,
  54. AV_LINEWRAPBURSTS = 0
  55. )(
  56. input wire clk,
  57. input wire reset,
  58. // Universal Avalon Master
  59. output reg uav_write,
  60. output reg uav_read,
  61. output reg [UAV_ADDRESS_W -1 : 0] uav_address,
  62. output reg [UAV_BURSTCOUNT_W -1 : 0] uav_burstcount,
  63. output wire [AV_BYTEENABLE_W -1 : 0] uav_byteenable,
  64. output wire [AV_DATA_W -1 : 0] uav_writedata,
  65. output wire uav_lock,
  66. output wire uav_debugaccess,
  67. output wire uav_clken,
  68. input wire [AV_DATA_W -1 : 0] uav_readdata,
  69. input wire uav_readdatavalid,
  70. input wire uav_waitrequest,
  71. input wire [1 : 0] uav_response,
  72. input wire uav_writeresponsevalid,
  73. // Avalon-MM Anti-master (slave)
  74. input reg av_write,
  75. input reg av_read,
  76. input wire [AV_ADDRESS_W -1 : 0] av_address,
  77. input wire [AV_BYTEENABLE_W -1 : 0] av_byteenable,
  78. input wire [AV_BURSTCOUNT_W -1 : 0] av_burstcount,
  79. input wire [AV_DATA_W -1 : 0] av_writedata,
  80. input wire av_begintransfer,
  81. input wire av_beginbursttransfer,
  82. input wire av_lock,
  83. input wire av_chipselect,
  84. input wire av_debugaccess,
  85. input wire av_clken,
  86. output wire [AV_DATA_W -1 : 0] av_readdata,
  87. output wire av_readdatavalid,
  88. output reg av_waitrequest,
  89. output reg [1 : 0] av_response,
  90. output reg av_writeresponsevalid
  91. );
  92. localparam BITS_PER_WORD = clog2(AV_SYMBOLS_PER_WORD);
  93. localparam AV_MAX_SYMBOL_BURST = flog2(pow2(AV_BURSTCOUNT_W - 1) * (AV_BURSTCOUNT_SYMBOLS ? 1 : AV_SYMBOLS_PER_WORD));
  94. localparam AV_MAX_SYMBOL_BURST_MINUS_ONE = AV_MAX_SYMBOL_BURST ? AV_MAX_SYMBOL_BURST - 1 : 0;
  95. localparam UAV_BURSTCOUNT_H_OR_31 = (UAV_BURSTCOUNT_W > 32) ? 31 : UAV_BURSTCOUNT_W - 1;
  96. localparam UAV_ADDRESS_H_OR_31 = (UAV_ADDRESS_W > 32) ? 31 : UAV_ADDRESS_W - 1;
  97. localparam BITS_PER_WORD_BURSTCOUNT = (UAV_BURSTCOUNT_W == 1) ? 0 : BITS_PER_WORD;
  98. localparam BITS_PER_WORD_ADDRESS = (UAV_ADDRESS_W == 1) ? 0 : BITS_PER_WORD;
  99. localparam ADDRESS_LOW = AV_ADDRESS_SYMBOLS ? 0 : BITS_PER_WORD_ADDRESS;
  100. localparam BURSTCOUNT_LOW = AV_BURSTCOUNT_SYMBOLS ? 0 : BITS_PER_WORD_BURSTCOUNT;
  101. localparam ADDRESS_HIGH = (UAV_ADDRESS_W > AV_ADDRESS_W + ADDRESS_LOW) ? AV_ADDRESS_W : (UAV_ADDRESS_W - ADDRESS_LOW);
  102. localparam BURSTCOUNT_HIGH = (UAV_BURSTCOUNT_W > AV_BURSTCOUNT_W + BURSTCOUNT_LOW) ? AV_BURSTCOUNT_W : (UAV_BURSTCOUNT_W - BURSTCOUNT_LOW);
  103. function integer flog2;
  104. input [31:0] depth;
  105. integer i;
  106. begin
  107. i = depth;
  108. if ( i <= 0 ) flog2 = 0;
  109. else begin
  110. for (flog2 = -1; i > 0; flog2 = flog2 + 1)
  111. i = i >> 1;
  112. end
  113. end
  114. endfunction // flog2
  115. // ------------------------------------------------------------
  116. // Calculates the ceil(log2()) of the input val.
  117. //
  118. // Limited to a positive 32-bit input value.
  119. // ------------------------------------------------------------
  120. function integer clog2;
  121. input[31:0] val;
  122. reg[31:0] i;
  123. begin
  124. i = 1;
  125. clog2 = 0;
  126. while (i < val) begin
  127. clog2 = clog2 + 1;
  128. i = i[30:0] << 1;
  129. end
  130. end
  131. endfunction
  132. function integer pow2;
  133. input [31:0] toShift;
  134. begin
  135. pow2 = 1;
  136. pow2 = pow2 << toShift;
  137. end
  138. endfunction // pow2
  139. // -------------------------------------------------
  140. // Assign some constants to appropriately-sized signals to
  141. // avoid synthesis warnings. This also helps some simulators
  142. // with their inferred sensitivity lists.
  143. //
  144. // The symbols per word calculation here rounds non-power of two
  145. // symbols to the next highest power of two, which is what we want
  146. // when calculating the decrementing byte count.
  147. // -------------------------------------------------
  148. wire [31 : 0] symbols_per_word_int = 2**(clog2(AV_SYMBOLS_PER_WORD[UAV_BURSTCOUNT_H_OR_31 : 0]));
  149. wire [UAV_BURSTCOUNT_H_OR_31 : 0] symbols_per_word = symbols_per_word_int[UAV_BURSTCOUNT_H_OR_31 : 0];
  150. reg internal_beginbursttransfer;
  151. reg internal_begintransfer;
  152. reg [UAV_ADDRESS_W -1 : 0] uav_address_pre;
  153. reg [UAV_BURSTCOUNT_W -1 : 0] uav_burstcount_pre;
  154. reg uav_read_pre;
  155. reg uav_write_pre;
  156. reg read_accepted;
  157. // -------------------------------------------------
  158. // Pass through signals that we don't touch
  159. // -------------------------------------------------
  160. assign uav_writedata = av_writedata;
  161. assign uav_byteenable = av_byteenable;
  162. assign uav_lock = av_lock;
  163. assign uav_debugaccess = av_debugaccess;
  164. assign uav_clken = av_clken;
  165. assign av_readdata = uav_readdata;
  166. assign av_readdatavalid = uav_readdatavalid;
  167. // -------------------------------------------------
  168. // Response signals
  169. // -------------------------------------------------
  170. always_comb begin
  171. if (!USE_READRESPONSE && !USE_WRITERESPONSE)
  172. av_response = '0;
  173. else
  174. av_response = uav_response;
  175. if (USE_WRITERESPONSE) begin
  176. av_writeresponsevalid = uav_writeresponsevalid;
  177. end else begin
  178. av_writeresponsevalid = '0;
  179. end
  180. end
  181. // -------------------------------------------------
  182. // Convert byte and word addresses into byte addresses
  183. // -------------------------------------------------
  184. always_comb begin
  185. uav_address_pre = {UAV_ADDRESS_W{1'b0}};
  186. if (AV_ADDRESS_SYMBOLS)
  187. uav_address_pre[(ADDRESS_HIGH ? ADDRESS_HIGH - 1 : 0) : 0] = av_address[(ADDRESS_HIGH ? ADDRESS_HIGH - 1 : 0) : 0];
  188. else begin
  189. uav_address_pre[ADDRESS_LOW + ADDRESS_HIGH - 1 : ADDRESS_LOW] = av_address[(ADDRESS_HIGH ? ADDRESS_HIGH - 1 : 0) : 0];
  190. end
  191. end
  192. // -------------------------------------------------
  193. // Convert burstcount into symbol units
  194. // -------------------------------------------------
  195. always_comb begin
  196. uav_burstcount_pre = symbols_per_word; // default to a single transfer
  197. if (USE_BURSTCOUNT) begin
  198. uav_burstcount_pre = {UAV_BURSTCOUNT_W{1'b0}};
  199. if (AV_BURSTCOUNT_SYMBOLS)
  200. uav_burstcount_pre[(BURSTCOUNT_HIGH ? BURSTCOUNT_HIGH - 1 : 0) :0] = av_burstcount[(BURSTCOUNT_HIGH ? BURSTCOUNT_HIGH - 1 : 0) : 0];
  201. else begin
  202. uav_burstcount_pre[UAV_BURSTCOUNT_W - 1 : BURSTCOUNT_LOW] = av_burstcount[(BURSTCOUNT_HIGH ? BURSTCOUNT_HIGH - 1 : 0) : 0];
  203. end
  204. end
  205. end
  206. // -------------------------------------------------
  207. // This is where we perform the per-transfer address and burstcount
  208. // calculations that are required by downstream modules.
  209. // -------------------------------------------------
  210. reg [UAV_ADDRESS_W -1 : 0] address_register;
  211. wire [UAV_BURSTCOUNT_W -1 : 0] burstcount_register;
  212. reg [UAV_BURSTCOUNT_W : 0] burstcount_register_lint;
  213. assign burstcount_register = burstcount_register_lint[UAV_BURSTCOUNT_W -1 : 0];
  214. always_comb begin
  215. uav_address = uav_address_pre;
  216. uav_burstcount = uav_burstcount_pre;
  217. if (AV_CONSTANT_BURST_BEHAVIOR && !UAV_CONSTANT_BURST_BEHAVIOR && ~internal_beginbursttransfer) begin
  218. uav_address = address_register;
  219. uav_burstcount = burstcount_register;
  220. end
  221. end
  222. reg first_burst_stalled;
  223. reg burst_stalled;
  224. wire [UAV_ADDRESS_W -1 : 0] combi_burst_addr_reg;
  225. wire [UAV_ADDRESS_W -1 : 0] combi_addr_reg;
  226. generate
  227. if (AV_LINEWRAPBURSTS && AV_MAX_SYMBOL_BURST != 0) begin
  228. if (AV_MAX_SYMBOL_BURST > UAV_ADDRESS_W - 1) begin
  229. assign combi_burst_addr_reg = { uav_address_pre[UAV_ADDRESS_W-1:0] + AV_SYMBOLS_PER_WORD[UAV_ADDRESS_W-1:0] };
  230. assign combi_addr_reg = { address_register[UAV_ADDRESS_W-1:0] + AV_SYMBOLS_PER_WORD[UAV_ADDRESS_W-1:0] };
  231. end
  232. else begin
  233. assign combi_burst_addr_reg = { uav_address_pre[UAV_ADDRESS_W - 1 : AV_MAX_SYMBOL_BURST], uav_address_pre[AV_MAX_SYMBOL_BURST_MINUS_ONE:0] + AV_SYMBOLS_PER_WORD[AV_MAX_SYMBOL_BURST_MINUS_ONE:0] };
  234. assign combi_addr_reg = { address_register[UAV_ADDRESS_W - 1 : AV_MAX_SYMBOL_BURST], address_register[AV_MAX_SYMBOL_BURST_MINUS_ONE:0] + AV_SYMBOLS_PER_WORD[AV_MAX_SYMBOL_BURST_MINUS_ONE:0] };
  235. end
  236. end
  237. else begin
  238. assign combi_burst_addr_reg = uav_address_pre + AV_SYMBOLS_PER_WORD[UAV_ADDRESS_H_OR_31:0];
  239. assign combi_addr_reg = address_register + AV_SYMBOLS_PER_WORD[UAV_ADDRESS_H_OR_31:0];
  240. end
  241. endgenerate
  242. always @(posedge clk, posedge reset) begin
  243. if (reset) begin
  244. address_register <= '0;
  245. burstcount_register_lint <= '0;
  246. end else begin
  247. address_register <= address_register;
  248. burstcount_register_lint <= burstcount_register_lint;
  249. if (internal_beginbursttransfer || first_burst_stalled) begin
  250. if (av_waitrequest) begin
  251. address_register <= uav_address_pre;
  252. burstcount_register_lint[UAV_BURSTCOUNT_W - 1 : 0] <= uav_burstcount_pre;
  253. end else begin
  254. address_register <= combi_burst_addr_reg;
  255. burstcount_register_lint <= uav_burstcount_pre - symbols_per_word;
  256. end
  257. end else if (internal_begintransfer || burst_stalled) begin
  258. if (~av_waitrequest) begin
  259. address_register <= combi_addr_reg;
  260. burstcount_register_lint <= burstcount_register - symbols_per_word;
  261. end
  262. end
  263. end
  264. end
  265. always @(posedge clk, posedge reset) begin
  266. if (reset) begin
  267. first_burst_stalled <= 1'b0;
  268. burst_stalled <= 1'b0;
  269. end else begin
  270. if (internal_beginbursttransfer || first_burst_stalled) begin
  271. if (av_waitrequest) begin
  272. first_burst_stalled <= 1'b1;
  273. end else begin
  274. first_burst_stalled <= 1'b0;
  275. end
  276. end else if (internal_begintransfer || burst_stalled) begin
  277. if (~av_waitrequest) begin
  278. burst_stalled <= 1'b0;
  279. end else begin
  280. burst_stalled <= 1'b1;
  281. end
  282. end
  283. end
  284. end
  285. // -------------------------------------------------
  286. // Waitrequest translation
  287. // -------------------------------------------------
  288. always @(posedge clk, posedge reset) begin
  289. if (reset)
  290. read_accepted <= 1'b0;
  291. else begin
  292. read_accepted <= read_accepted;
  293. if (read_accepted == 0)
  294. read_accepted <= av_waitrequest ? uav_read_pre & ~uav_waitrequest : 1'b0;
  295. else if (read_accepted == 1 && uav_readdatavalid == 1) // reset acceptance only when rdv arrives
  296. read_accepted <= 1'b0;
  297. end
  298. end
  299. reg write_accepted = 0;
  300. generate if (AV_REGISTERINCOMINGSIGNALS) begin
  301. always @(posedge clk, posedge reset) begin
  302. if (reset)
  303. write_accepted <= 1'b0;
  304. else begin
  305. write_accepted <=
  306. ~av_waitrequest ? 1'b0 :
  307. uav_write & ~uav_waitrequest? 1'b1 :
  308. write_accepted;
  309. end
  310. end
  311. end endgenerate
  312. always_comb begin
  313. av_waitrequest = uav_waitrequest;
  314. if (USE_READDATAVALID == 0) begin
  315. av_waitrequest = uav_read_pre ? ~uav_readdatavalid : uav_waitrequest;
  316. end
  317. if (AV_REGISTERINCOMINGSIGNALS) begin
  318. av_waitrequest =
  319. uav_read_pre ? ~uav_readdatavalid :
  320. uav_write_pre ? (internal_begintransfer | uav_waitrequest) & ~write_accepted :
  321. 1'b1;
  322. end
  323. if (USE_WAITREQUEST == 0) begin
  324. av_waitrequest = 0;
  325. end
  326. end
  327. // -------------------------------------------------
  328. // Determine the output read and write signals from
  329. // the read/write/chipselect input signals.
  330. // -------------------------------------------------
  331. always_comb begin
  332. uav_write = 1'b0;
  333. uav_write_pre = 1'b0;
  334. uav_read = 1'b0;
  335. uav_read_pre = 1'b0;
  336. if (!USE_CHIPSELECT) begin
  337. if (USE_READ) begin
  338. uav_read_pre = av_read;
  339. end
  340. if (USE_WRITE) begin
  341. uav_write_pre = av_write;
  342. end
  343. end else begin
  344. if (!USE_WRITE && USE_READ) begin
  345. uav_write_pre = av_chipselect & ~av_read;
  346. uav_read_pre = av_read;
  347. end else if (!USE_READ && USE_WRITE) begin
  348. uav_write_pre = av_write;
  349. uav_read_pre = av_chipselect & ~av_write;
  350. end else if (USE_READ && USE_WRITE) begin
  351. uav_write_pre = av_write;
  352. uav_read_pre = av_read;
  353. end
  354. end
  355. if (USE_READDATAVALID == 0)
  356. uav_read = uav_read_pre & ~read_accepted;
  357. else
  358. uav_read = uav_read_pre;
  359. if (AV_REGISTERINCOMINGSIGNALS == 0)
  360. uav_write = uav_write_pre;
  361. else
  362. uav_write = uav_write_pre & ~write_accepted;
  363. end
  364. // -------------------------------------------------
  365. // Begintransfer assignment
  366. // -------------------------------------------------
  367. reg end_begintransfer;
  368. always_comb begin
  369. if (USE_BEGINTRANSFER) begin
  370. internal_begintransfer = av_begintransfer;
  371. end else begin
  372. internal_begintransfer = ( uav_write | uav_read ) & ~end_begintransfer;
  373. end
  374. end
  375. always @(posedge clk or posedge reset) begin
  376. if (reset) begin
  377. end_begintransfer <= 1'b0;
  378. end else begin
  379. if (internal_begintransfer == 1 && uav_waitrequest)
  380. end_begintransfer <= 1'b1;
  381. else if (uav_waitrequest)
  382. end_begintransfer <= end_begintransfer;
  383. else
  384. end_begintransfer <= 1'b0;
  385. end
  386. end
  387. // -------------------------------------------------
  388. // Beginbursttransfer assignment
  389. // -------------------------------------------------
  390. reg end_beginbursttransfer;
  391. wire last_burst_transfer_pre;
  392. wire last_burst_transfer_reg;
  393. wire last_burst_transfer;
  394. // compare values before the mux to shorten critical path; benchmark before changing
  395. assign last_burst_transfer_pre = (uav_burstcount_pre == symbols_per_word);
  396. assign last_burst_transfer_reg = (burstcount_register == symbols_per_word);
  397. assign last_burst_transfer = (internal_beginbursttransfer) ? last_burst_transfer_pre : last_burst_transfer_reg;
  398. always_comb begin
  399. if (USE_BEGINBURSTTRANSFER) begin
  400. internal_beginbursttransfer = av_beginbursttransfer;
  401. end else begin
  402. internal_beginbursttransfer = uav_read ? internal_begintransfer : internal_begintransfer && ~end_beginbursttransfer;
  403. end
  404. end
  405. always @(posedge clk or posedge reset) begin
  406. if (reset) begin
  407. end_beginbursttransfer <= 1'b0;
  408. end else begin
  409. end_beginbursttransfer <= end_beginbursttransfer;
  410. if (last_burst_transfer && internal_begintransfer || uav_read) begin
  411. end_beginbursttransfer <= 1'b0;
  412. end
  413. else if (uav_write && internal_begintransfer) begin
  414. end_beginbursttransfer <= 1'b1;
  415. end
  416. end
  417. end
  418. // synthesis translate_off
  419. // ------------------------------------------------
  420. // check_1 : for waitrequest signal violation
  421. // Ensure that when waitreqeust is asserted, the master is not allowed to change its controls
  422. // Exception : begintransfer / beginbursttransfer
  423. // : previously not in any transaction (idle)
  424. // Note : Not checking clken which is not exactly part of Avalon controls/inputs
  425. // : Not using system verilog assertions (seq/prop) since it is not supported if using Modelsim_SE
  426. // ------------------------------------------------
  427. reg av_waitrequest_r;
  428. reg av_write_r, av_read_r, av_lock_r, av_chipselect_r, av_debugaccess_r;
  429. reg [AV_ADDRESS_W-1:0] av_address_r;
  430. reg [AV_BYTEENABLE_W-1:0] av_byteenable_r;
  431. reg [AV_BURSTCOUNT_W-1:0] av_burstcount_r;
  432. reg [AV_DATA_W-1:0] av_writedata_r;
  433. always @(posedge clk or posedge reset) begin
  434. if (reset) begin
  435. av_waitrequest_r <= '0;
  436. av_write_r <= '0;
  437. av_read_r <= '0;
  438. av_lock_r <= '0;
  439. av_chipselect_r <= '0;
  440. av_debugaccess_r <= '0;
  441. av_address_r <= '0;
  442. av_byteenable_r <= '0;
  443. av_burstcount_r <= '0;
  444. av_writedata_r <= '0;
  445. end else begin
  446. av_waitrequest_r <= av_waitrequest;
  447. av_write_r <= av_write;
  448. av_read_r <= av_read;
  449. av_lock_r <= av_lock;
  450. av_chipselect_r <= av_chipselect;
  451. av_debugaccess_r <= av_debugaccess;
  452. av_address_r <= av_address;
  453. av_byteenable_r <= av_byteenable;
  454. av_burstcount_r <= av_burstcount;
  455. av_writedata_r <= av_writedata;
  456. if (
  457. av_waitrequest_r && // When waitrequest is asserted
  458. (
  459. (av_write != av_write_r) || // Checks that : Input controls/data does not change
  460. (av_read != av_read_r) ||
  461. (av_lock != av_lock_r) ||
  462. (av_debugaccess != av_debugaccess_r) ||
  463. (av_address != av_address_r) ||
  464. (av_byteenable != av_byteenable_r) ||
  465. (av_burstcount != av_burstcount_r)
  466. ) &&
  467. (av_write_r | av_read_r) && // Check only when : previously initiated a write/read
  468. (!USE_CHIPSELECT | av_chipselect_r) // and chipselect was asserted (or unused)
  469. ) begin
  470. $display( "%t: %m: Error: Input controls/data changed while av_waitrequest is asserted.", $time());
  471. $display("av_address %x --> %x", av_address_r , av_address );
  472. $display("av_byteenable %x --> %x", av_byteenable_r , av_byteenable );
  473. $display("av_burstcount %x --> %x", av_burstcount_r , av_burstcount );
  474. $display("av_writedata %x --> %x", av_writedata_r , av_writedata );
  475. $display("av_write %x --> %x", av_write_r , av_write );
  476. $display("av_read %x --> %x", av_read_r , av_read );
  477. $display("av_lock %x --> %x", av_lock_r , av_lock );
  478. $display("av_chipselect %x --> %x", av_chipselect_r , av_chipselect );
  479. $display("av_debugaccess %x --> %x", av_debugaccess_r , av_debugaccess );
  480. end
  481. end
  482. // end check_1
  483. end
  484. // synthesis translate_on
  485. endmodule