This course introduces principles and techniques for design of single and multi-core embedded systems. It introduces a model-based approach to system level design. It presents modeling techniques for both computation and communication at different levels of abstraction, such as specification, transaction level and cycle-accurate level. It discusses synthesis methods for system level architectures, embedded software and hardware components. Using these methods, designers can use virtual prototyping for their applications. This course will also describe simulation-based and formal verification methods that are essential for achieving design confidence. The discussion sections will focus on some present and future methodologies and ESL tools. Students will do a project/report on some selected topics from System modeling at different abstraction levels, Model-based system design, Hardware/Software co-design, Software and Hardware component synthesis, System verification or similar