This commit is contained in:
		
							parent
							
								
									d477252bde
								
							
						
					
					
						commit
						57aa849615
					
				
					 1 changed files with 103 additions and 0 deletions
				
			
		| 
						 | 
					@ -162,3 +162,106 @@ pub fn queue<T: Type>(
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#[cfg(todo)]
 | 
				
			||||||
 | 
					#[cfg(test)]
 | 
				
			||||||
 | 
					mod tests {
 | 
				
			||||||
 | 
					    use super::*;
 | 
				
			||||||
 | 
					    use crate::{
 | 
				
			||||||
 | 
					        cli::FormalMode, firrtl::ExportOptions,
 | 
				
			||||||
 | 
					        module::transform::simplify_enums::SimplifyEnumsKind, testing::assert_formal,
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    #[test]
 | 
				
			||||||
 | 
					    fn test_queue() {
 | 
				
			||||||
 | 
					        #[hdl_module]
 | 
				
			||||||
 | 
					        fn queue_test(capacity: NonZeroUsize, inp_ready_is_comb: bool, out_valid_is_comb: bool) {
 | 
				
			||||||
 | 
					            #[hdl]
 | 
				
			||||||
 | 
					            let clk: Clock = m.input();
 | 
				
			||||||
 | 
					            #[hdl]
 | 
				
			||||||
 | 
					            let rst: SyncReset = m.input();
 | 
				
			||||||
 | 
					            #[hdl]
 | 
				
			||||||
 | 
					            let inp_data: HdlOption<UInt<8>> = m.input();
 | 
				
			||||||
 | 
					            #[hdl]
 | 
				
			||||||
 | 
					            let out_ready: Bool = m.input();
 | 
				
			||||||
 | 
					            #[hdl]
 | 
				
			||||||
 | 
					            let cd = wire();
 | 
				
			||||||
 | 
					            connect(
 | 
				
			||||||
 | 
					                cd,
 | 
				
			||||||
 | 
					                #[hdl]
 | 
				
			||||||
 | 
					                ClockDomain {
 | 
				
			||||||
 | 
					                    clk,
 | 
				
			||||||
 | 
					                    rst: rst.to_reset(),
 | 
				
			||||||
 | 
					                },
 | 
				
			||||||
 | 
					            );
 | 
				
			||||||
 | 
					            #[hdl]
 | 
				
			||||||
 | 
					            let dut = instance(queue(
 | 
				
			||||||
 | 
					                UInt[ConstUsize::<8>],
 | 
				
			||||||
 | 
					                capacity,
 | 
				
			||||||
 | 
					                inp_ready_is_comb,
 | 
				
			||||||
 | 
					                out_valid_is_comb,
 | 
				
			||||||
 | 
					            ));
 | 
				
			||||||
 | 
					            connect(dut.cd, cd);
 | 
				
			||||||
 | 
					            connect(dut.inp.data, inp_data);
 | 
				
			||||||
 | 
					            connect(dut.out.ready, out_ready);
 | 
				
			||||||
 | 
					            #[hdl]
 | 
				
			||||||
 | 
					            let count = reg_builder().clock_domain(cd).reset(0u32);
 | 
				
			||||||
 | 
					            #[hdl]
 | 
				
			||||||
 | 
					            let next_count = wire();
 | 
				
			||||||
 | 
					            connect(next_count, count);
 | 
				
			||||||
 | 
					            connect(count, next_count);
 | 
				
			||||||
 | 
					            #[hdl]
 | 
				
			||||||
 | 
					            if ReadyValid::fire(dut.inp) & !ReadyValid::fire(dut.out) {
 | 
				
			||||||
 | 
					                connect_any(next_count, count + 1u8);
 | 
				
			||||||
 | 
					            } else if !ReadyValid::fire(dut.inp) & ReadyValid::fire(dut.out) {
 | 
				
			||||||
 | 
					                connect_any(next_count, count - 1u8);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            hdl_assert(clk, count.cmp_eq(dut.count), "");
 | 
				
			||||||
 | 
					            #[hdl]
 | 
				
			||||||
 | 
					            let index = reg_builder().clock_domain(cd).reset(HdlNone::<UInt<32>>());
 | 
				
			||||||
 | 
					            #[hdl]
 | 
				
			||||||
 | 
					            let data = reg_builder().clock_domain(cd).reset(HdlNone());
 | 
				
			||||||
 | 
					            #[hdl]
 | 
				
			||||||
 | 
					            match index {
 | 
				
			||||||
 | 
					                HdlNone =>
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    #[hdl]
 | 
				
			||||||
 | 
					                    if ReadyValid::fire(dut.inp) {
 | 
				
			||||||
 | 
					                        connect(index, HdlSome(0u32));
 | 
				
			||||||
 | 
					                        connect(data, dut.inp.data);
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					                HdlSome(cur_index) =>
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    #[hdl]
 | 
				
			||||||
 | 
					                    if cur_index.cmp_ge(next_count) {
 | 
				
			||||||
 | 
					                        connect(index, HdlNone());
 | 
				
			||||||
 | 
					                        #[hdl]
 | 
				
			||||||
 | 
					                        if let HdlSome(data) = data {
 | 
				
			||||||
 | 
					                            #[hdl]
 | 
				
			||||||
 | 
					                            if let HdlSome(out_data) = dut.out.data {
 | 
				
			||||||
 | 
					                                hdl_assert(clk, data.cmp_eq(out_data), "");
 | 
				
			||||||
 | 
					                            } else {
 | 
				
			||||||
 | 
					                                hdl_assert(clk, false.to_expr(), "");
 | 
				
			||||||
 | 
					                            }
 | 
				
			||||||
 | 
					                        } else {
 | 
				
			||||||
 | 
					                            hdl_assert(clk, false.to_expr(), "");
 | 
				
			||||||
 | 
					                        }
 | 
				
			||||||
 | 
					                    } else {
 | 
				
			||||||
 | 
					                        connect(index, HdlSome((cur_index + 1u8).cast_to_static()));
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        assert_formal(
 | 
				
			||||||
 | 
					            queue_test(NonZeroUsize::new(2).unwrap(), false, false),
 | 
				
			||||||
 | 
					            FormalMode::BMC,
 | 
				
			||||||
 | 
					            20,
 | 
				
			||||||
 | 
					            None,
 | 
				
			||||||
 | 
					            ExportOptions {
 | 
				
			||||||
 | 
					                simplify_enums: Some(SimplifyEnumsKind::ReplaceWithBundleOfUInts),
 | 
				
			||||||
 | 
					                ..ExportOptions::default()
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					        );
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue